import logging import time from multiprocessing import Process, Queue from threading import Thread from typing import Dict, Optional, Callable from playsound import playsound from fishy import helper from fishy.helper.hotkey import process from fishy.helper.hotkey.process import Key # noinspection PyPep8Naming class hotkey: instance: 'HotKey' = None @staticmethod def init(): if not hotkey.instance: hotkey.instance = HotKey() @staticmethod def hook(key: Key, func: Callable): hotkey.instance.hook(key, func) @staticmethod def free(key: Key): hotkey.instance.free(key) @staticmethod def start(): hotkey.instance.start() @staticmethod def stop(): hotkey.instance.stop() class HotKey: def __init__(self): self.inq = Queue() self.outq = Queue() self._hotkeys: Dict[Key, Optional[Callable]] = dict([(k, None) for k in Key]) self.process = Process(target=process.run, args=(self.inq, self.outq)) self.event = Thread(target=self._event_loop) def hook(self, key: Key, func: Callable): self._hotkeys[key] = func def free(self, key: Key): self._hotkeys[key] = None def _event_loop(self): while True: key = self.outq.get() if key in Key: callback = self._hotkeys[key] if callback: playsound(helper.manifest_file("beep.wav"), False) callback() elif key == "stop": break time.sleep(0.1) def start(self): self.process.start() self.event.start() logging.debug("hotkey process started") def stop(self): self.inq.put("stop") self.outq.put("stop") self.process.join() self.event.join() logging.debug("hotkey process ended")