def run(self): self._setup() self._timer_proc = types.TIMERPROC(self._timer_func) self._timer = timer = _user32.SetTimer(0, 0, 0, self._timer_proc) self._polling = False self._allow_polling = True msg = types.MSG() self.dispatch_event('on_enter') while not self.has_exit: if self._polling: while _user32.PeekMessageW(ctypes.byref(msg), 0, 0, 0, constants.PM_REMOVE): _user32.TranslateMessage(ctypes.byref(msg)) _user32.DispatchMessageW(ctypes.byref(msg)) self._timer_func(0, 0, timer, 0) else: _user32.GetMessageW(ctypes.byref(msg), 0, 0, 0) _user32.TranslateMessage(ctypes.byref(msg)) _user32.DispatchMessageW(ctypes.byref(msg)) # Manual idle event msg_types = \ _user32.GetQueueStatus(constants.QS_ALLINPUT) & 0xffff0000 if (msg.message != constants.WM_TIMER and not msg_types & ~(constants.QS_TIMER << 16)): self._timer_func(0, 0, timer, 0) self.dispatch_event('on_exit')
def step(self, timeout=None): self.dispatch_posted_events() msg = types.MSG() if timeout is None: timeout = constants.INFINITE else: timeout = int(timeout * 1000) # milliseconds result = _user32.MsgWaitForMultipleObjects(self._wait_objects_n, self._wait_objects_array, False, timeout, constants.QS_ALLINPUT) result -= constants.WAIT_OBJECT_0 if result == self._wait_objects_n: while _user32.PeekMessageW(ctypes.byref(msg), 0, 0, 0, constants.PM_REMOVE): _user32.TranslateMessage(ctypes.byref(msg)) _user32.DispatchMessageW(ctypes.byref(msg)) elif 0 <= result < self._wait_objects_n: object, func = self._wait_objects[result] func() # Return True if timeout was interrupted. return result <= self._wait_objects_n
def __init__(self, *args, **kwargs): super(MTWin32EventLoop, self).__init__(*args, **kwargs) # Force immediate creation of an event queue on this thread msg = types.MSG() _user32.PeekMessageW(ctypes.byref(msg), 0, constants.WM_USER, constants.WM_USER, constants.PM_NOREMOVE) self._event_thread = _kernel32.GetCurrentThreadId() self._post_event_queue = Queue.Queue()
def __init__(self): super(Win32EventLoop, self).__init__() self._next_idle_time = None # Force immediate creation of an event queue on this thread -- note # that since event loop is created on pyglet.app import, whatever # imports pyglet.app _must_ own the main run loop. msg = types.MSG() _user32.PeekMessageW(ctypes.byref(msg), 0, constants.WM_USER, constants.WM_USER, constants.PM_NOREMOVE) self._event_thread = _kernel32.GetCurrentThreadId() self._wait_objects = [] self._recreate_wait_objects_array() self._timer_proc = types.TIMERPROC(self._timer_proc_func) self._timer = _user32.SetTimer(0, 0, constants.USER_TIMER_MAXIMUM, self._timer_proc)