2023-03-18 20:30:29 +00:00
|
|
|
# Python imports
|
|
|
|
import re
|
|
|
|
|
|
|
|
# Lib imports
|
|
|
|
import gi
|
|
|
|
gi.require_version('Gtk', '3.0')
|
|
|
|
gi.require_version('Gdk', '3.0')
|
|
|
|
from gi.repository import Gtk
|
|
|
|
from gi.repository import Gdk
|
|
|
|
|
|
|
|
# Application imports
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
valid_keyvalue_pat = re.compile(r"[a-z0-9A-Z-_\[\]\(\)\| ]")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KeyboardSignalsMixin:
|
|
|
|
""" KeyboardSignalsMixin keyboard hooks controller. """
|
|
|
|
|
|
|
|
# TODO: Need to set methods that use this to somehow check the keybindings state instead.
|
2024-01-04 02:27:36 +00:00
|
|
|
def unset_keys_and_data(self, widget = None, eve = None):
|
2023-03-18 20:30:29 +00:00
|
|
|
self.ctrl_down = False
|
|
|
|
self.shift_down = False
|
|
|
|
self.alt_down = False
|
|
|
|
|
2024-01-04 02:27:36 +00:00
|
|
|
def unmap_special_keys(self, keyname):
|
|
|
|
if "control" in keyname:
|
|
|
|
self.ctrl_down = False
|
|
|
|
if "shift" in keyname:
|
|
|
|
self.shift_down = False
|
|
|
|
if "alt" in keyname:
|
|
|
|
self.alt_down = False
|
|
|
|
|
2023-03-18 20:30:29 +00:00
|
|
|
def on_global_key_press_controller(self, eve, user_data):
|
|
|
|
keyname = Gdk.keyval_name(user_data.keyval).lower()
|
2023-03-19 20:37:43 +00:00
|
|
|
modifiers = Gdk.ModifierType(user_data.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
|
|
|
|
|
|
|
self.was_midified_key = True if modifiers != 0 else False
|
|
|
|
|
2023-03-18 20:30:29 +00:00
|
|
|
if keyname.replace("_l", "").replace("_r", "") in ["control", "alt", "shift"]:
|
|
|
|
if "control" in keyname:
|
|
|
|
self.ctrl_down = True
|
|
|
|
if "shift" in keyname:
|
|
|
|
self.shift_down = True
|
|
|
|
if "alt" in keyname:
|
|
|
|
self.alt_down = True
|
|
|
|
|
|
|
|
def on_global_key_release_controller(self, widget, event):
|
|
|
|
""" Handler for keyboard events """
|
2023-03-19 20:37:43 +00:00
|
|
|
keyname = Gdk.keyval_name(event.keyval).lower()
|
|
|
|
modifiers = Gdk.ModifierType(event.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
|
|
|
|
2023-03-18 20:30:29 +00:00
|
|
|
if keyname.replace("_l", "").replace("_r", "") in ["control", "alt", "shift"]:
|
2023-03-19 20:37:43 +00:00
|
|
|
should_return = self.was_midified_key and (self.ctrl_down or self.shift_down or self.alt_down)
|
2024-01-04 02:27:36 +00:00
|
|
|
self.unmap_special_keys(keyname)
|
2023-03-19 20:37:43 +00:00
|
|
|
|
|
|
|
if should_return:
|
|
|
|
self.was_midified_key = False
|
|
|
|
return
|
|
|
|
|
2023-03-18 20:30:29 +00:00
|
|
|
mapping = keybindings.lookup(event)
|
2023-03-19 20:37:43 +00:00
|
|
|
logger.debug(f"on_global_key_release_controller > key > {keyname}")
|
|
|
|
logger.debug(f"on_global_key_release_controller > keyval > {event.keyval}")
|
|
|
|
logger.debug(f"on_global_key_release_controller > mapping > {mapping}")
|
|
|
|
|
2023-03-18 20:30:29 +00:00
|
|
|
if mapping:
|
2024-01-04 02:27:36 +00:00
|
|
|
self.handle_mapped_key_event(mapping)
|
2023-03-18 20:30:29 +00:00
|
|
|
else:
|
2024-01-04 02:27:36 +00:00
|
|
|
self.handle_as_key_event_scope(mapping)
|
2023-03-18 20:30:29 +00:00
|
|
|
|
2024-01-04 02:27:36 +00:00
|
|
|
def handle_mapped_key_event(self, mapping):
|
|
|
|
try:
|
|
|
|
self.handle_as_controller_scope()
|
|
|
|
except Exception:
|
|
|
|
self.handle_as_plugin_scope(mapping)
|
2023-03-18 20:30:29 +00:00
|
|
|
|
2024-01-04 02:27:36 +00:00
|
|
|
def handle_as_controller_scope(self, mapping):
|
|
|
|
getattr(self, mapping)()
|
2023-03-18 20:30:29 +00:00
|
|
|
|
2024-01-04 02:27:36 +00:00
|
|
|
def handle_as_plugin_scope(self, mapping):
|
|
|
|
if "||" in mapping:
|
|
|
|
sender, eve_type = mapping.split("||")
|
|
|
|
else:
|
|
|
|
sender = ""
|
|
|
|
eve_type = mapping
|
|
|
|
|
|
|
|
self.handle_as_key_event_system(sender, eve_type)
|
|
|
|
|
|
|
|
def handle_as_key_event_scope(self, mapping):
|
|
|
|
if self.ctrl_down and not keyname in ["1", "kp_1", "2", "kp_2", "3", "kp_3", "4", "kp_4"]:
|
|
|
|
self.handle_key_event_system(None, mapping)
|
|
|
|
|
|
|
|
def handle_key_event_system(self, sender, eve_type):
|
|
|
|
event_system.emit(eve_type)
|