From cc154404d35bdce1042fcdd692a64b9365f7eb0d Mon Sep 17 00:00:00 2001 From: nnyyxxxx Date: Sat, 25 Jan 2025 02:26:45 -0500 Subject: [PATCH] fix(gtk): detect modifier keys without cursor movement --- src/apprt/gtk/winproto/wayland.zig | 15 +++++++++++++-- src/apprt/gtk/winproto/x11.zig | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 8df3e57b3..ebbf237d1 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -76,10 +76,21 @@ pub const App = struct { } pub fn eventMods( - _: *App, - _: ?*c.GdkDevice, + _: App, + device: ?*c.GdkDevice, _: c.GdkModifierType, ) ?input.Mods { + if (device) |dev| { + const device_mods = c.gdk_device_get_modifier_state(dev); + return input.Mods{ + .shift = (device_mods & c.GDK_SHIFT_MASK) != 0, + .ctrl = (device_mods & c.GDK_CONTROL_MASK) != 0, + .alt = (device_mods & c.GDK_ALT_MASK) != 0, + .super = (device_mods & c.GDK_SUPER_MASK) != 0, + .caps_lock = (device_mods & c.GDK_LOCK_MASK) != 0, + }; + } + return null; } diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index 7a6b8b4c7..7ae35e25c 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -122,8 +122,18 @@ pub const App = struct { device: ?*c.GdkDevice, gtk_mods: c.GdkModifierType, ) ?input.Mods { - _ = device; - _ = gtk_mods; + if (device) |dev| { + const device_mods = c.gdk_device_get_modifier_state(dev); + if (device_mods != gtk_mods) { + return input.Mods{ + .shift = (device_mods & c.GDK_SHIFT_MASK) != 0, + .ctrl = (device_mods & c.GDK_CONTROL_MASK) != 0, + .alt = (device_mods & c.GDK_ALT_MASK) != 0, + .super = (device_mods & c.GDK_SUPER_MASK) != 0, + .caps_lock = (device_mods & c.GDK_LOCK_MASK) != 0, + }; + } + } // Shoutout to Mozilla for figuring out a clean way to do this, this is // paraphrased from Firefox/Gecko in widget/gtk/nsGtkKeyUtils.cpp.