diff --git a/bumblebee_status/modules/core/keys.py b/bumblebee_status/modules/core/keys.py new file mode 100644 index 0000000..a579c7d --- /dev/null +++ b/bumblebee_status/modules/core/keys.py @@ -0,0 +1,56 @@ +# pylint: disable=C0111,R0903 + +"""Shows when a key is pressed + +Parameters: + * keys.keys: Comma-separated list of keys to monitor (defaults to "") +""" + +import core.module +import core.widget +import core.decorators +import core.event + +import util.format + +from pynput.keyboard import Listener + +NAMES = { + "Key.cmd": "cmd", + "Key.ctrl": "ctrl", + "Key.shift": "shift", + "Key.alt": "alt", +} + +class Module(core.module.Module): + @core.decorators.never + def __init__(self, config, theme): + super().__init__(config, theme, []) + + self._listener = Listener(on_press=self._key_press, on_release=self._key_release) + + self._keys = util.format.aslist(self.parameter("keys", "Key.cmd,Key.ctrl,Key.alt,Key.shift")) + + for k in self._keys: + self.add_widget(name=k, full_text=self._display_name(k), hidden=True) + self._listener.start() + + def _display_name(self, key): + return NAMES.get(key, key) + + def _key_press(self, key): + key = str(key) + if not key in self._keys: return + self.widget(key).hidden = False + core.event.trigger("update", [self.id], redraw_only=False) + + def _key_release(self, key): + key = str(key) + if not key in self._keys: return + self.widget(key).hidden = True + core.event.trigger("update", [self.id], redraw_only=False) + + def state(self, widget): + return widget.name + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4