54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
import pyautogui
|
|
from threading import Thread
|
|
from time import sleep
|
|
|
|
from .input import KEYMAP, Input, Button, Event
|
|
|
|
|
|
class InputHandler:
|
|
def __init__(self):
|
|
self.current: Input = {button: False for button in Button}
|
|
self.previous: Input = {button: False for button in Button}
|
|
|
|
print(f"sanity check: {self.previous=}, {self.current=}")
|
|
|
|
def set(self, input: Input):
|
|
# MUST NOT BLOCK
|
|
# to be called from asyncio context
|
|
self.current = input
|
|
|
|
def get(self) -> list[Event]:
|
|
events = []
|
|
for button in Button:
|
|
match (self.previous[button], self.current[button]):
|
|
case (True, False):
|
|
events.append(Event(button, "up"))
|
|
case (False, True):
|
|
events.append(Event(button, "down"))
|
|
|
|
self.previous = self.current
|
|
return events
|
|
|
|
|
|
input = InputHandler()
|
|
|
|
|
|
class Runner(Thread):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.running = True
|
|
|
|
def stop(self):
|
|
self.running = False
|
|
|
|
def run(self):
|
|
while self.running:
|
|
events = input.get()
|
|
for event in events:
|
|
print(f"[pag] key{event.direction} {event.button}")
|
|
if event.direction == "down":
|
|
pyautogui.keyDown(KEYMAP[event.button])
|
|
else:
|
|
pyautogui.keyUp(KEYMAP[event.button])
|
|
sleep(0.05)
|