Attempt to fix forward keypress and numpad state.

This commit is contained in:
Storm Dragon
2026-05-12 02:26:02 -04:00
parent 57980225ad
commit 38ef1c2d72
2 changed files with 795 additions and 11 deletions
+53 -11
View File
@@ -437,8 +437,8 @@ class driver(inputDriver):
self.refresh_interesting_keys()
passive_grabs = self.build_passive_grabs()
failed_before = self.failed_grabs
for key_name, modifier_mask in passive_grabs:
self.grab_key_name(key_name, modifier_mask)
for key_name, modifier_mask, include_num_lock in passive_grabs:
self.grab_key_name(key_name, modifier_mask, include_num_lock)
self.display.flush()
self.grab_signature = signature
self.write_debug(
@@ -454,9 +454,10 @@ class driver(inputDriver):
def build_passive_grabs(self):
grabs = set()
for fenrir_key in self.env["input"]["fenrir_key"]:
grabs.add((fenrir_key, 0))
grabs.add((fenrir_key, 0, True))
for script_key in self.env["input"]["script_key"]:
grabs.add((script_key, 0))
grabs.add((script_key, 0, True))
grabs.add(("KEY_NUMLOCK", 0, True))
for shortcut in self.env.get("rawBindings", {}).values():
keys = shortcut[1]
expanded_keys = self.expand_special_keys(keys)
@@ -470,12 +471,40 @@ class driver(inputDriver):
final_key = non_modifier_keys[-1]
if "KEY_FENRIR" in keys:
for fenrir_key in self.env["input"]["fenrir_key"]:
grabs.add((fenrir_key, modifier_mask))
grabs.add((fenrir_key, modifier_mask, True))
fenrir_modifier_mask = self.modifier_masks.get(
fenrir_key, 0
)
if fenrir_modifier_mask:
grabs.add(
(
final_key,
modifier_mask | fenrir_modifier_mask,
not final_key.startswith("KEY_KP"),
)
)
elif "KEY_SCRIPT" in keys:
for script_key in self.env["input"]["script_key"]:
grabs.add((script_key, modifier_mask))
grabs.add((script_key, modifier_mask, True))
script_modifier_mask = self.modifier_masks.get(
script_key, 0
)
if script_modifier_mask:
grabs.add(
(
final_key,
modifier_mask | script_modifier_mask,
not final_key.startswith("KEY_KP"),
)
)
else:
grabs.add((final_key, modifier_mask))
grabs.add(
(
final_key,
modifier_mask,
not final_key.startswith("KEY_KP"),
)
)
return grabs
def expand_special_keys(self, keys):
@@ -495,7 +524,9 @@ class driver(inputDriver):
modifier_mask |= self.modifier_masks.get(key_name, 0)
return modifier_mask
def grab_key_name(self, key_name, modifier_mask=0):
def grab_key_name(
self, key_name, modifier_mask=0, include_num_lock=True
):
keysym_names = self.key_name_to_keysym_names(key_name)
for keysym_name in keysym_names:
keysym = XK.string_to_keysym(keysym_name)
@@ -504,7 +535,9 @@ class driver(inputDriver):
keycode = self.display.keysym_to_keycode(keysym)
if not keycode:
continue
for effective_mask in self.optional_modifier_masks(modifier_mask):
for effective_mask in self.optional_modifier_masks(
modifier_mask, include_num_lock
):
try:
self.window.grab_key(
keycode,
@@ -524,9 +557,9 @@ class driver(inputDriver):
debug.DebugLevel.WARNING,
)
def optional_modifier_masks(self, modifier_mask):
def optional_modifier_masks(self, modifier_mask, include_num_lock=True):
optional_masks = [0, X.LockMask]
if self.num_lock_mask:
if include_num_lock and self.num_lock_mask:
optional_masks += [self.num_lock_mask, self.num_lock_mask | X.LockMask]
return {modifier_mask | optional for optional in optional_masks}
@@ -610,6 +643,15 @@ class driver(inputDriver):
self.ungrab_all_devices()
def get_led_state(self, led=0):
try:
pointer = self.root.query_pointer()
mask = getattr(pointer, "mask", 0)
if led == 0:
return bool(self.num_lock_mask and mask & self.num_lock_mask)
if led == 1:
return bool(mask & X.LockMask)
except Exception:
pass
return False
def set_led_state(self, led_dict):