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 dispatch_events(self): from pyglet import app app.platform_event_loop.start() self._allow_dispatch_event = True self.dispatch_pending_events() msg = MSG() while _user32.PeekMessageW(byref(msg), 0, 0, 0, PM_REMOVE): _user32.TranslateMessage(byref(msg)) _user32.DispatchMessageW(byref(msg)) self._allow_dispatch_event = False
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()