| import time | |||||
| import weakref | import weakref | ||||
| import pygame | import pygame | ||||
| Events = _Events() | Events = _Events() | ||||
| _ClickDelayMax=500 # in Milliseconds | |||||
| _DOWNKEYS=[] | |||||
| _DOWNMBUTTONS=[] | |||||
| _DOWNJBUTTONS=[] | |||||
| def _WatchKey(key): | |||||
| global _DOWNKEYS | |||||
| for k in _DOWNKEYS: | |||||
| if k[0] == key: | |||||
| return # Already watching. Technically, this should never happen. | |||||
| _DOWNKEYS.append((key, int(round(time.time()*1000)))) | |||||
| def _ReleaseKey(key): | |||||
| global _DOWNKEYS, _ClickDelayMax | |||||
| tick = int(round(time.time()*1000)) | |||||
| for k in _DOWNKEYS: | |||||
| if k[0] == key: | |||||
| lastTick = k[1] | |||||
| _DOWNKEYS.remove(k) | |||||
| if tick - lastTick <= _ClickDelayMax: | |||||
| Events.emit("KEYPRESSED", {key:key, mod:pygame.key.get_mods()}) | |||||
| return # Done. | |||||
| # We found nothing, boss. | |||||
| def _WatchButton(device, button): | |||||
| global _DOWNMBUTTONS, _DOWNJBUTTONS | |||||
| tick = int(round(time.time()*1000)) | |||||
| btnsrc = _DOWNMBUTTONS | |||||
| if device >= 0: | |||||
| btnsrc = _DOWNJBUTTONS | |||||
| for b in btnsrc: | |||||
| if b[0] == device and b[1] == button: | |||||
| return # Already Watching... | |||||
| btnsrc.append((device, button, tick)) | |||||
| def _ReleaseButton(device, button): | |||||
| global _DOWNMBUTTONS, _DOWNJBUTTONS, _ClickDelayMax | |||||
| tick = int(round(time.time()*1000)) | |||||
| btnsrc = _DOWNMBUTTONS | |||||
| if device >= 0: | |||||
| btnsrc = _DOWNJBUTTONS | |||||
| for b in btnsrc: | |||||
| if b[0] == device and b[1] == button: | |||||
| lastTick = b[2] | |||||
| btnsrc.remove(b) | |||||
| if tick - lastTick <= _ClickDelayMax: | |||||
| if device >= 0: | |||||
| Events.emit("JOYBUTTONPRESSED", {joy:device, button:button}) | |||||
| else: | |||||
| Events.emit("MOUSEBUTTONPRESSED", {pos:pygame.mouse.get_pos(), button:button}) | |||||
| return # Done. | |||||
| # We found nothing, boss. | |||||
| def pollEmitter(): | def pollEmitter(): | ||||
| global Events, _WatchKey, _ReleaseKey, _WatchButton, _ReleaseButton | |||||
| for event in pygame.event.get(): | for event in pygame.event.get(): | ||||
| #TODO: For each event obtains, convert it for the above Event dispatcher | |||||
| pass | |||||
| if event.type == pygame.QUIT: | |||||
| Events.emit("QUIT", {}) | |||||
| elif event.type == pygame.KEYDOWN: | |||||
| _WatchKey(event.key) | |||||
| Events.emit("KEYDOWN", {unicode:event.unicode, key:event.key, mod:event.mod}) | |||||
| elif event.type == pygame.KEYUP: | |||||
| Events.emit("KEYUP", {key:event.key, mod:event.mod}) | |||||
| _ReleaseKey(event.key) | |||||
| elif event.type == pygame.MOUSEMOTION: | |||||
| Events.emit("MOUSEMOTION", {pos:event.pos, rel:event.rel, buttons:event.buttons}) | |||||
| elif event.type == pygame.MOUSEBUTTONUP: | |||||
| Events.emit("MOUSEBUTTONUP", {pos:event.pos, button:event.button}) | |||||
| _ReleaseButton(-1, event.button) | |||||
| elif event.type == pygame.MOUSEBUTTONDOWN: | |||||
| _WatchButton(-1, event.button) | |||||
| Events.emit("MOUSEBUTTONDOWN", {pos:event.pos, button:event.button}) | |||||
| elif event.type == pygame.VIDEORESIZE: | |||||
| Events.emit("VIDEORESIZE", {size:event.size, w:event.w, h:event.h}) | |||||
| elif event.type == pygame.VIDEOEXPOSE: | |||||
| Events.emit("VIDEOEXPOSE", {}) | |||||
| elif event.type == pygame.JOYAXISMOTION: | |||||
| Events.emit("JOYAXISMOTION", {joy:event.joy, axis:event.axis, value:event.value}) | |||||
| elif event.type == pygame.JOYBALLMOTION: | |||||
| Events.emit("JOYBALLMOTION", {joy:event.joy, ball:event.ball, res:event.rel}) | |||||
| elif event.type == pygame.JOYHATMOTION: | |||||
| Events.emit("JOYHATMOTION", {joy:event.joy, hat:event.hat, value:event.value}) | |||||
| elif event.type == pygame.JOYBUTTONUP: | |||||
| Events.emit("JOYBUTTONUP", {joy:event.joy, button:event.button}) | |||||
| _ReleaseButton(event.joy, event.button) | |||||
| elif event.type == pygame.JOYBUTTONDOWN: | |||||
| _WatchButton(event.joy, event.button) | |||||
| Events.emit("JOYBUTTONDOWN", {joy:event.joy, button:event.button}) | |||||
| else: | |||||
| Events.emit("PYGUSER_{}".format(event.code), {}) | |||||