Beispiel #1
0
def main():
    print "#"*31
    print "### Welcome to MindMixer ###"
    print "####### Version 0.1beta #######"
    print """Have a look at the sourcecode!
Change stuff to suit your needs!
The program will hopefully be
self explaining. Hafe fun!"""
    print "#"*31
    selftests()
    global N
    while 1:
        print "(Hint: while training, you can hit SPACE to abort)"
        print "Hit '"+KEYLEFT+"' if the",str(N)+". previous image is identical to the one shown"
        print "Hit '"+KEYRIGHT+"' if the",str(N)+". previous sound is identical to the one heard"
        while 1:
            print "Ready to train with N=%i?" %(N),
            if ask():
                break
            else:
                print "Do you wish to train with N set to a different value? Choosing 'No' exits the program.",
                if ask():
                    n = int(raw_input("Ok, enter the desired value here: "))
                    while n < 1:
                        print "N must be 1 or higher!"
                        n = int(raw_input("Enter a value higher than 1: "))
                    N = n
                else:
                    print "bye"
                    sys.exit(1)
                
        display.init()
        display.set_mode(RESOLUTION, FULLSCREEN)
        font.init()
        mixer.init(44100)
        event.set_grab(True)
        mouse.set_visible(False)
        trials = gentrials()
        for trial in trials:
            if not trial.runtrial():
                break
        display.quit()
        vis = 0.0
        acu = 0.0
        for trial in trials:
            if trial.result[0]:
                vis+=1
            if trial.result[1]:
                acu+=1
        vp = (vis/(MINTRIALS+N))*100
        ap = (acu/(MINTRIALS+N))*100
        message = "percentage in visual modality:%i\npercentage in acoustic modality:%i\n" %(int(vp),int(ap))
        print message
        if vp >= UPPERTH and ap >= UPPERTH:
            N+=1
        elif (vp < LOWERTH or ap < LOWERTH) and N > 1:
            N-=1
Beispiel #2
0
def log(audio_elements, log_file_path, audio_file, start_pos=0, resume=False):
    #  Helper functions

    def advance(to, pos, prev_pos):
        #  Actually do the logging
        #  Get our position in the audio file and the current audio_element (a.k.a. the div in the TEI file)
        audio_element = audio_elements[to]

        # Tell us what's going on
        print "logged at time:", pos, "count:", count
        print "\t", audio_elements[to + 1]["text"], "(file", audio_elements[to + 1]["file_name"], ")"

        # TEI XML files can have unicode, don'tchaknow
        # The values of text_audio_element are being put into the correct order
        text_audio_element = map(
            unicode, [audio_element["id"], audio_element["text"], audio_element["file_name"], audio_element["count"]]
        )

        # Convert to tab-separated
        tabbed_audio_element = string.join(text_audio_element, "\t")

        # Remove line breaks
        no_line_breaks = tabbed_audio_element.replace("\n", " ")

        #  And write it to the file
        log.write(str(prev_pos) + "\t" + str(pos) + "\t" + no_line_breaks + "\n")

        return

    # Print a warning message to the log file
    # This contains four words so that the make_ functions don't throw a wobbly
    # when trying to parse a logfile with error messages
    def warn(warning_message=["DANGER,", "WILL", "ROBINSON,", "DANGER!"]):
        # Pretty much as in advance()
        # Audacity format requires seconds rather than miliseconds
        pos = mixer.music.get_pos() / 1000
        log.write(str(pos) + "\t" + str(pos) + "\t" + string.join(warning_message, "\t") + "\n")
        print warning_string, pos

        return

    count = 0
    log = codecs.open(log_file_path, "w", "utf-8")
    paused = False
    prev_pos = 0
    pos = 0

    # Initialise pygame
    pygame.init()
    screen = pygame.display.set_mode((100, 100))
    mixer.music.load(audio_file)
    mixer.music.play(0, start_pos)
    mixer.init()
    event.set_grab(True)

    # Print some startup info
    print "lumberjack: starting to log"
    print "Press space to log the end of the section displayed on the screen"
    print "Press q to quit"
    print "Press p to pause"
    print "Press any other key to log a warning to file, along with the current timestamp\n"
    # Print some info about the first audio_element
    print "\t", audio_elements[0]["text"], "(", audio_elements[0], ")"

    # Main logging loop
    while True:
        if not key.get_focused():
            mixer.music.pause()
            while not key.get_focused():
                time.wait(100)
                print "Waiting"
            mixer.music.unpause()

        else:
            keydown = [e for e in event.get() if event.type == KEYDOWN]
            for e in keydown:
                if e.key == K_SPACE:
                    prev_pos = pos
                    pos = mixer.music.get_pos()
                    advance(count, pos, prev_pos)
                    count = count + 1
                elif e.key == K_q:
                    return
                elif e.key == K_p:
                    if not paused:
                        mixer.music.pause()
                    else:
                        mixer.music.unpause()
                        # paused = !paused
                    paused = not paused
                else:
                    warn()
Beispiel #3
0
 def run_modal(self, modal_widget):
     global last_mouse_event, last_mouse_event_handler
     global top_widget, clicked_widget
     global timer_event
     global next_frame_due
     is_modal = modal_widget is not None
     modal_widget = modal_widget or self
     relative_pause = False
     relative_warmup = 0
     try:
         old_top_widget = top_widget
         top_widget = modal_widget
         was_modal = modal_widget.is_modal
         modal_widget.is_modal = True
         modal_widget.modal_result = None
         if not modal_widget.focus_switch:
             modal_widget.tab_to_first()
         mouse_widget = None
         #if clicked_widget:
         #	clicked_widget = modal_widget
         num_clicks = 0
         last_click_time = 0
         self.do_draw = True
         use_sleep = self._use_sleep
         while modal_widget.modal_result is None:
             #print "RootWidget: frame_time =", self.frame_time ###
             defer_drawing = self.frame_time <> 0.0 and modal_widget.defer_drawing(
             )
             try:
                 if not is_modal:
                     if timer_event:
                         if not use_sleep and defer_drawing:
                             make_scheduled_calls()
                         add_modifiers(timer_event)
                         if last_mouse_event:
                             timer_event.dict['pos'] = last_mouse_event.pos
                             timer_event.dict[
                                 'local'] = last_mouse_event.local
                         if last_mouse_event_handler:
                             last_mouse_event_handler.setup_cursor(
                                 timer_event)
                         self.do_draw = self.timer_event(timer_event)
                         timer_event = None
                     else:
                         if defer_drawing:
                             #print "RootWidget: Clearing do_draw because of defer_drawing" ###
                             self.do_draw = False
                 #print "RootWidget: do_draw =", self.do_draw ###
                 if self.do_draw:
                     if self.is_gl:
                         #self.gl_clear()
                         #self.gl_draw_all(self, (0, 0))
                         #GL.glFlush()
                         gl_surface = self.gl_surface
                         gl_surface.gl_clear(self.bg_color)
                         self.gl_draw_all(gl_surface)
                         gl_surface.gl_flush()
                     else:
                         self.draw_all(self.surface)
                     self.do_draw = False
                     #tb1 = timestamp() ###
                     pygame.display.flip()
                     #tb2 = timestamp() ###
                     #print "RootWidget: Flip block  %5d" % (tb2 - tb1) ###
                 in_relative_mode = bool(modal_widget.relative_mode())
                 grab = in_relative_mode and not relative_pause
                 if grab <> get_grab():
                     set_grab(grab)
                     set_mouse_visible(not grab)
                     relative_warmup = 3  # Ignore spurious deltas on entering relative mode
                 #tb1 = timestamp() ###
                 #print "RootWidget: use_sleep =", use_sleep, "defer_drawing =", defer_drawing ###
                 if use_sleep and defer_drawing:
                     #print "RootWidget: Handling timing" ###
                     time_now = timestamp()
                     #print "RootWidget: Time is now", time_now ###
                     if next_frame_due < time_now:
                         #print "RootWidget: Adjusting next frame due time to time now" ###
                         next_frame_due = time_now
                     #print "RootWidget: Waiting for next frame due at", next_frame_due ###
                     while 1:
                         sleep_time = make_due_calls(
                             time_now, next_frame_due)
                         if sleep_time <= 0.0:
                             break
                         #print "RootWidget: Sleeping for", sleep_time ###
                         sleep(sleep_time / 1000.0)
                         time_now = timestamp()
                     next_frame_due += self.frame_time
                     #print "RootWidget: Next frame now due at", next_frame_due ###
                     timer_event = Event(USEREVENT, time=time_now)
                     events = []
                 else:
                     events = [pygame.event.wait()]
                 #tb2 = timestamp() ###
                 #tb = tb2 - tb1 ###
                 #if tb: ###
                 #	print "RootWidget: Event block %5d" % tb ###
                 events.extend(pygame.event.get())
                 for event in events:
                     t = timestamp()
                     event.dict['time'] = t
                     event.dict['local'] = getattr(event, 'pos', (0, 0))
                     type = event.type
                     if type == QUIT:
                         self.quit()
                     elif type == MOUSEBUTTONDOWN:
                         #print "RootWidget: MOUSEBUTTONDOWN: setting do_draw" ###
                         self.do_draw = True
                         if t - last_click_time <= double_click_time:
                             num_clicks += 1
                         else:
                             num_clicks = 1
                         last_click_time = t
                         event.dict['num_clicks'] = num_clicks
                         add_modifiers(event)
                         last_mouse_event = event
                         if in_relative_mode:
                             event.dict['local'] = (0, 0)
                             if relative_pause:
                                 relative_pause = False
                             else:
                                 #modal_widget.dispatch_key('mouse_down', event)
                                 mouse_widget = modal_widget.get_focus()
                                 clicked_widget = mouse_widget
                                 last_mouse_event_handler = mouse_widget
                                 mouse_widget.handle_event(
                                     'mouse_down', event)
                         else:
                             mouse_widget = self.find_widget(event.pos)
                             if not mouse_widget.is_inside(modal_widget):
                                 mouse_widget = modal_widget
                             clicked_widget = mouse_widget
                             last_mouse_event_handler = mouse_widget
                             mouse_widget.notify_attention_loss()
                             mouse_widget.handle_mouse('mouse_down', event)
                     elif type == MOUSEMOTION:
                         add_modifiers(event)
                         last_mouse_event = event
                         if in_relative_mode:
                             event.dict['local'] = (0, 0)
                             if not relative_pause:
                                 if relative_warmup:
                                     relative_warmup -= 1
                                 else:
                                     #modal_widget.dispatch_key('mouse_delta', event)
                                     mouse_widget = clicked_widget or modal_widget.get_focus(
                                     )
                                     last_mouse_event_handler = mouse_widget
                                     mouse_widget.handle_event(
                                         'mouse_delta', event)
                         else:
                             mouse_widget = self.find_widget(
                                 event.pos)  # Do this in else branch?
                             if clicked_widget:
                                 last_mouse_event_handler = mouse_widget  # Should this be clicked_widget?
                                 clicked_widget.handle_mouse(
                                     'mouse_drag', event)
                             else:
                                 if not mouse_widget.is_inside(
                                         modal_widget):
                                     mouse_widget = modal_widget
                                 last_mouse_event_handler = mouse_widget
                                 mouse_widget.handle_mouse(
                                     'mouse_move', event)
                     elif type == MOUSEBUTTONUP:
                         add_modifiers(event)
                         last_mouse_event = event
                         self.do_draw = True
                         if in_relative_mode:
                             event.dict['local'] = (0, 0)
                             if not relative_pause:
                                 #modal_widget.dispatch_key('mouse_up', event)
                                 if clicked_widget:
                                     mouse_widget = clicked_widget
                                     clicked_widget = None
                                 else:
                                     mouse_widget = modal_widget.get_focus()
                                 last_mouse_event_handler = mouse_widget
                                 mouse_widget.handle_event(
                                     'mouse_up', event)
                         else:
                             mouse_widget = self.find_widget(
                                 event.pos)  # Not necessary?
                             if clicked_widget:
                                 last_mouse_event_handler = clicked_widget
                                 clicked_widget = None
                                 last_mouse_event_handler.handle_mouse(
                                     'mouse_up', event)
                     elif type == KEYDOWN:
                         key = event.key
                         if key == K_ESCAPE and in_relative_mode and \
                          event.mod & KMOD_CTRL and event.mod & KMOD_SHIFT:
                             relative_pause = True
                         elif relative_pause:
                             relative_pause = False
                         else:
                             set_modifier(key, True)
                             self.do_draw = True
                             self.send_key(modal_widget, 'key_down', event)
                             if last_mouse_event_handler:
                                 event.dict['pos'] = last_mouse_event.pos
                                 event.dict[
                                     'local'] = last_mouse_event.local
                                 last_mouse_event_handler.setup_cursor(
                                     event)
                     elif type == KEYUP:
                         key = event.key
                         set_modifier(key, False)
                         self.do_draw = True
                         self.send_key(modal_widget, 'key_up', event)
                         if last_mouse_event_handler:
                             event.dict['pos'] = last_mouse_event.pos
                             event.dict['local'] = last_mouse_event.local
                             last_mouse_event_handler.setup_cursor(event)
                     elif type == MUSIC_END_EVENT:
                         self.music_end()
                     elif type == USEREVENT:
                         if defer_drawing and not use_sleep:
                             timer_event = event
             except Cancel:
                 pass
     finally:
         modal_widget.is_modal = was_modal
         top_widget = old_top_widget
     clicked_widget = None
Beispiel #4
0
    def run_modal(self, modal_widget: Widget):
        """
            Runs a modal event loop. The widget is run as a modal dialog until its dismiss() method is called.
        Args:
            modal_widget:  The modal widget
        """
        is_modal = modal_widget is not None
        modal_widget = modal_widget or self
        relative_pause = False
        relative_warmup = 0

        was_modal = None
        try:
            RootWidget.old_top_widget = RootWidget.top_widget
            RootWidget.top_widget = modal_widget
            was_modal = modal_widget.is_modal
            modal_widget.is_modal = True

            modal_widget.modal_result = None
            if not modal_widget.focus_switch:
                modal_widget.tab_to_first()

            self.do_draw = True
            use_sleep = self._use_sleep

            from albow.core.ui.AlbowEventLoop import AlbowEventLoop
            from albow.core.ui.EventLoopParams import EventLoopParams

            eventLoop: AlbowEventLoop = AlbowEventLoop(
                modalWidget=modal_widget, containingWidget=self)

            last_click_time = 0
            num_clicks = 0
            while modal_widget.modal_result is None:

                defer_drawing = self.frame_time != 0.0 and modal_widget.defer_drawing(
                )
                try:
                    if not is_modal:
                        if RootWidget.ourTimerEvent:
                            if not use_sleep and defer_drawing:
                                Scheduler.make_scheduled_calls()
                            CoreUtilities.add_modifiers(
                                RootWidget.ourTimerEvent)
                            if RootWidget.last_mouse_event:
                                RootWidget.ourTimerEvent.dict[
                                    'pos'] = RootWidget.last_mouse_event.pos
                                RootWidget.ourTimerEvent.dict[
                                    'local'] = RootWidget.last_mouse_event.local
                            if RootWidget.last_mouse_event_handler:
                                RootWidget.last_mouse_event_handler.setup_cursor(
                                    RootWidget.ourTimerEvent)
                            self.do_draw = self.timer_event(
                                RootWidget.ourTimerEvent)
                            RootWidget.ourTimerEvent = None
                        else:
                            if defer_drawing:
                                self.do_draw = False
                    # RootWidget.classLogger.info(f"self.do_draw: {self.do_draw}")
                    if self.do_draw:
                        if self.is_gl:
                            gl_surface = self.gl_surface
                            gl_surface.gl_clear(self.bg_color)
                            self.gl_draw_all(gl_surface)
                            gl_surface.gl_flush()
                        else:
                            self.draw_all(self.surface)
                        self.do_draw = False
                        # tb1 = timestamp() ###
                        pygame.display.flip()

                    in_relative_mode = bool(modal_widget.relative_mode())
                    grab = in_relative_mode and not relative_pause
                    if grab != get_grab():
                        set_grab(grab)
                        set_mouse_visible(not grab)
                        relative_warmup = 3  # Ignore spurious deltas on entering relative mode
                    if use_sleep and defer_drawing:

                        time_now = Scheduler.timestamp()

                        if RootWidget.nextFrameDue < time_now:
                            RootWidget.nextFrameDue = time_now

                        while True:
                            sleep_time = Scheduler.make_due_calls(
                                time_now, RootWidget.nextFrameDue)
                            if sleep_time <= 0.0:
                                break

                            sleep(sleep_time / 1000.0)
                            time_now = Scheduler.timestamp()
                        RootWidget.nextFrameDue += self.frame_time
                        RootWidget.ourTimerEvent = Event(
                            USEREVENT, {'time': time_now})
                        events = []
                    else:
                        events = [pygame.event.wait()]
                    events.extend(pygame.event.get())

                    loopParams: EventLoopParams = EventLoopParams(
                        use_sleep=use_sleep,
                        relative_pause=relative_pause,
                        do_draw=self.do_draw,
                        relative_warmup=relative_warmup,
                        last_click_time=last_click_time,
                        num_clicks=num_clicks)

                    newParams: EventLoopParams = eventLoop.processEvents(
                        eventList=events,
                        relativeMode=in_relative_mode,
                        deferDrawing=defer_drawing,
                        eventLoopParams=loopParams)

                    use_sleep = newParams.use_sleep
                    relative_pause = newParams.relative_pause
                    self.do_draw = newParams.do_draw
                    relative_warmup = newParams.relative_warmup
                    last_click_time = newParams.last_click_time
                    num_clicks = newParams.num_clicks

                except CancelException:
                    pass

                except ApplicationException as e:
                    self.report_error(e)
        finally:
            modal_widget.is_modal = was_modal
            RootWidget.top_widget = RootWidget.old_top_widget

        RootWidget.clicked_widget = None
Beispiel #5
0
 def onButtonDown(self, event):
     if not get_grab():
         set_grab(True)
     self.cursor.buttonDown(event.button)
Beispiel #6
0
 def onButtonUp(self, event):
     if get_grab():
         set_grab(False)
         self._synch()
     self.cursor.buttonUp(event.button)
Beispiel #7
0
	def run_modal(self, modal_widget):
		global last_mouse_event, last_mouse_event_handler
		global top_widget, clicked_widget
		global timer_event
		global next_frame_due
		is_modal = modal_widget is not None
		modal_widget = modal_widget or self
		relative_pause = False
		relative_warmup = 0
		try:
			old_top_widget = top_widget
			top_widget = modal_widget
			was_modal = modal_widget.is_modal
			modal_widget.is_modal = True
			modal_widget.modal_result = None
			if not modal_widget.focus_switch:
				modal_widget.tab_to_first()
			mouse_widget = None
			#if clicked_widget:
			#	clicked_widget = modal_widget
			num_clicks = 0
			last_click_time = 0
			self.do_draw = True
			use_sleep = self._use_sleep
			while modal_widget.modal_result is None:
				#print "RootWidget: frame_time =", self.frame_time ###
				defer_drawing = self.frame_time <> 0.0 and modal_widget.defer_drawing()
				try:
					if not is_modal:
						if timer_event:
							if not use_sleep and defer_drawing:
								make_scheduled_calls()
							add_modifiers(timer_event)
							if last_mouse_event:
								timer_event.dict['pos'] = last_mouse_event.pos
								timer_event.dict['local'] = last_mouse_event.local
							if last_mouse_event_handler:
								last_mouse_event_handler.setup_cursor(timer_event)
							self.do_draw = self.timer_event(timer_event)
							timer_event = None
						else:
							if defer_drawing:
								#print "RootWidget: Clearing do_draw because of defer_drawing" ###
								self.do_draw = False
					#print "RootWidget: do_draw =", self.do_draw ###
					if self.do_draw:
						if self.is_gl:
							#self.gl_clear()
							#self.gl_draw_all(self, (0, 0))
							#GL.glFlush()
							gl_surface = self.gl_surface
							gl_surface.gl_clear(self.bg_color)
							self.gl_draw_all(gl_surface)
							gl_surface.gl_flush()
						else:
							self.draw_all(self.surface)
						self.do_draw = False
						#tb1 = timestamp() ###
						pygame.display.flip()
						#tb2 = timestamp() ###
						#print "RootWidget: Flip block  %5d" % (tb2 - tb1) ###
					in_relative_mode = bool(modal_widget.relative_mode())
					grab = in_relative_mode and not relative_pause
					if grab <> get_grab():
						set_grab(grab)
						set_mouse_visible(not grab)
						relative_warmup = 3 # Ignore spurious deltas on entering relative mode
					#tb1 = timestamp() ###
					#print "RootWidget: use_sleep =", use_sleep, "defer_drawing =", defer_drawing ###
					if use_sleep and defer_drawing:
						#print "RootWidget: Handling timing" ###
						time_now = timestamp()
						#print "RootWidget: Time is now", time_now ###
						if next_frame_due < time_now:
							#print "RootWidget: Adjusting next frame due time to time now" ###
							next_frame_due = time_now
						#print "RootWidget: Waiting for next frame due at", next_frame_due ###
						while 1:
							sleep_time = make_due_calls(time_now, next_frame_due)
							if sleep_time <= 0.0:
								break
							#print "RootWidget: Sleeping for", sleep_time ###
							sleep(sleep_time / 1000.0)
							time_now = timestamp()
						next_frame_due += self.frame_time
						#print "RootWidget: Next frame now due at", next_frame_due ###
						timer_event = Event(USEREVENT, time = time_now)
						events = []
					else:
						events = [pygame.event.wait()]
					#tb2 = timestamp() ###
					#tb = tb2 - tb1 ###
					#if tb: ###
					#	print "RootWidget: Event block %5d" % tb ###
					events.extend(pygame.event.get())
					for event in events:
						t = timestamp()
						event.dict['time'] = t
						event.dict['local'] = getattr(event, 'pos', (0, 0))
						type = event.type
						if type == QUIT:
							self.quit()
						elif type == MOUSEBUTTONDOWN:
							#print "RootWidget: MOUSEBUTTONDOWN: setting do_draw" ###
							self.do_draw = True
							if t - last_click_time <= double_click_time:
								num_clicks += 1
							else:
								num_clicks = 1
							last_click_time = t
							event.dict['num_clicks'] = num_clicks
							add_modifiers(event)
							last_mouse_event = event
							if in_relative_mode:
								event.dict['local'] = (0, 0)
								if relative_pause:
									relative_pause = False
								else:
									#modal_widget.dispatch_key('mouse_down', event)
									mouse_widget = modal_widget.get_focus()
									clicked_widget = mouse_widget
									last_mouse_event_handler = mouse_widget
									mouse_widget.handle_event('mouse_down', event)
							else:
								mouse_widget = self.find_widget(event.pos)
								if not mouse_widget.is_inside(modal_widget):
									mouse_widget = modal_widget
								clicked_widget = mouse_widget
								last_mouse_event_handler = mouse_widget
								mouse_widget.notify_attention_loss()
								mouse_widget.handle_mouse('mouse_down', event)
						elif type == MOUSEMOTION:
							add_modifiers(event)
							last_mouse_event = event
							if in_relative_mode:
								event.dict['local'] = (0, 0)
								if not relative_pause:
									if relative_warmup:
										relative_warmup -= 1
									else:
										#modal_widget.dispatch_key('mouse_delta', event)
										mouse_widget = clicked_widget or modal_widget.get_focus()
										last_mouse_event_handler = mouse_widget
										mouse_widget.handle_event('mouse_delta', event)
							else:
								mouse_widget = self.find_widget(event.pos) # Do this in else branch?
								if clicked_widget:
									last_mouse_event_handler = mouse_widget # Should this be clicked_widget?
									clicked_widget.handle_mouse('mouse_drag', event)
								else:
									if not mouse_widget.is_inside(modal_widget):
										mouse_widget = modal_widget
									last_mouse_event_handler = mouse_widget
									mouse_widget.handle_mouse('mouse_move', event)
						elif type == MOUSEBUTTONUP:
							add_modifiers(event)
							last_mouse_event = event
							self.do_draw = True
							if in_relative_mode:
								event.dict['local'] = (0, 0)
								if not relative_pause:
									#modal_widget.dispatch_key('mouse_up', event)
									if clicked_widget:
										mouse_widget = clicked_widget
										clicked_widget = None
									else:
										mouse_widget = modal_widget.get_focus()
									last_mouse_event_handler = mouse_widget
									mouse_widget.handle_event('mouse_up', event)
							else:
								mouse_widget = self.find_widget(event.pos) # Not necessary?
								if clicked_widget:
									last_mouse_event_handler = clicked_widget
									clicked_widget = None
									last_mouse_event_handler.handle_mouse('mouse_up', event)
						elif type == KEYDOWN:
							key = event.key
							if key == K_ESCAPE and in_relative_mode and \
								event.mod & KMOD_CTRL and event.mod & KMOD_SHIFT:
									relative_pause = True
							elif relative_pause:
								relative_pause = False
							else:
								set_modifier(key, True)
								self.do_draw = True
								self.send_key(modal_widget, 'key_down', event)
								if last_mouse_event_handler:
									event.dict['pos'] = last_mouse_event.pos
									event.dict['local'] = last_mouse_event.local
									last_mouse_event_handler.setup_cursor(event)
						elif type == KEYUP:
							key = event.key
							set_modifier(key, False)
							self.do_draw = True
							self.send_key(modal_widget, 'key_up', event)
							if last_mouse_event_handler:
								event.dict['pos'] = last_mouse_event.pos
								event.dict['local'] = last_mouse_event.local
								last_mouse_event_handler.setup_cursor(event)
						elif type == MUSIC_END_EVENT:
							self.music_end()
						elif type == USEREVENT:
							if defer_drawing and not use_sleep:
								timer_event = event
				except Cancel:
					pass
		finally:
			modal_widget.is_modal = was_modal
			top_widget = old_top_widget
		clicked_widget = None