From d500642352ba16ab163e6e0c9baeb7547455827f Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 30 Mar 2022 11:37:39 -0400 Subject: [PATCH] rules: graceful degredation when no keymap available --- lib/logitech_receiver/diversion.py | 32 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index c1b51d34..3d39f427 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -125,8 +125,8 @@ def modifier_code(keycode): return m -gdisplay = Gdk.Display.get_default() -gkeymap = Gdk.Keymap.get_for_display(gdisplay) +gdisplay = Gdk.Display.get_default() # can be None if Solaar is run without a full window system +gkeymap = Gdk.Keymap.get_for_display(gdisplay) if gdisplay else None key_down = None key_up = None @@ -415,12 +415,11 @@ def x11_focus_prog(): def x11_pointer_prog(): pid = wm_class = None window = xdisplay.screen().root.query_pointer().child - for window in reversed(window.query_tree().children): - pid = window.get_full_property(NET_WM_PID, 0) - wm_class = window.get_wm_class() + for child in reversed(window.query_tree().children): + pid = child.get_full_property(NET_WM_PID, 0) + wm_class = child.get_wm_class() if wm_class: break - window = window.query_tree().parent name = psutil.Process(pid.value[0]).name() if pid else '' return (wm_class[0], wm_class[1], name) if wm_class else (name, ) @@ -566,8 +565,12 @@ class Modifiers(Condition): return 'Modifiers: ' + str(self.desired) def evaluate(self, feature, notification, device, status, last_result): - current = gkeymap.get_modifier_state() # get the current keyboard modifier - return self.desired == (current & MODIFIER_MASK) + if gkeymap: + current = gkeymap.get_modifier_state() # get the current keyboard modifier + return self.desired == (current & MODIFIER_MASK) + else: + _log.warn('no keymap so cannot determine modifier keys') + return False def data(self): return {'Modifiers': [str(m) for m in self.modifiers]} @@ -779,11 +782,14 @@ class KeyPress(Action): simulate_key(keycode, Xlib.X.KeyRelease) def evaluate(self, feature, notification, device, status, last_result): - current = gkeymap.get_modifier_state() - if _log.isEnabledFor(_INFO): - _log.info('KeyPress action: %s, modifiers %s %s', self.key_names, current, [hex(k) for k in self.key_symbols]) - self.keyDown(self.key_symbols, current) - self.keyUp(reversed(self.key_symbols), current) + if gkeymap: + current = gkeymap.get_modifier_state() + if _log.isEnabledFor(_INFO): + _log.info('KeyPress action: %s, modifiers %s %s', self.key_names, current, [hex(k) for k in self.key_symbols]) + self.keyDown(self.key_symbols, current) + self.keyUp(reversed(self.key_symbols), current) + else: + _log.warn('no keymap so cannot determine which keycode to send') return None def data(self):