From 5731b3c4cf470bdb269c1739db9459c0c6e74332 Mon Sep 17 00:00:00 2001 From: zeljan1 Date: Wed, 12 Feb 2025 09:22:14 +0100 Subject: [PATCH] Gtk3: Make TGtk3WidgetSet.GetKeyState() work for mouse buttons.Example at issue #41340 --- lcl/interfaces/gtk3/gtk3winapi.inc | 64 ++++++++++-------------------- 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/lcl/interfaces/gtk3/gtk3winapi.inc b/lcl/interfaces/gtk3/gtk3winapi.inc index f423d2add6..3a8e68b6ad 100644 --- a/lcl/interfaces/gtk3/gtk3winapi.inc +++ b/lcl/interfaces/gtk3/gtk3winapi.inc @@ -2294,54 +2294,38 @@ const var AKeyMap: PGdkKeymap; AModifiers: TGdkModifierType; + display: PGdkDisplay; + seat: PGdkSeat; + device: PGdkDevice; + x: gdouble; begin Result := 0; + display := gdk_display_get_default(); + if display = nil then + exit; + seat := gdk_display_get_default_seat(display); + if seat = nil then + exit; + case nVirtKey of VK_LSHIFT: nVirtKey := VK_SHIFT; VK_LCONTROL: nVirtKey := VK_CONTROL; VK_LMENU: nVirtKey := VK_MENU; end; - (* - // GdkModifierType - GDK_SHIFT_MASK: TGdkModifierType = 1; - GDK_LOCK_MASK: TGdkModifierType = 2; - GDK_CONTROL_MASK: TGdkModifierType = 4; - GDK_MOD1_MASK: TGdkModifierType = 8; - GDK_MOD2_MASK: TGdkModifierType = 16; - GDK_MOD3_MASK: TGdkModifierType = 32; - GDK_MOD4_MASK: TGdkModifierType = 64; - GDK_MOD5_MASK: TGdkModifierType = 128; - GDK_BUTTON1_MASK: TGdkModifierType = 256; - GDK_BUTTON2_MASK: TGdkModifierType = 512; - GDK_BUTTON3_MASK: TGdkModifierType = 1024; - GDK_BUTTON4_MASK: TGdkModifierType = 2048; - GDK_BUTTON5_MASK: TGdkModifierType = 4096; - GDK_MODIFIER_RESERVED_13_MASK: TGdkModifierType = 8192; - GDK_MODIFIER_RESERVED_14_MASK: TGdkModifierType = 16384; - GDK_MODIFIER_RESERVED_15_MASK: TGdkModifierType = 32768; - GDK_MODIFIER_RESERVED_16_MASK: TGdkModifierType = 65536; - GDK_MODIFIER_RESERVED_17_MASK: TGdkModifierType = 131072; - GDK_MODIFIER_RESERVED_18_MASK: TGdkModifierType = 262144; - GDK_MODIFIER_RESERVED_19_MASK: TGdkModifierType = 524288; - GDK_MODIFIER_RESERVED_20_MASK: TGdkModifierType = 1048576; - GDK_MODIFIER_RESERVED_21_MASK: TGdkModifierType = 2097152; - GDK_MODIFIER_RESERVED_22_MASK: TGdkModifierType = 4194304; - GDK_MODIFIER_RESERVED_23_MASK: TGdkModifierType = 8388608; - GDK_MODIFIER_RESERVED_24_MASK: TGdkModifierType = 16777216; - GDK_MODIFIER_RESERVED_25_MASK: TGdkModifierType = 33554432; - GDK_SUPER_MASK: TGdkModifierType = 67108864; - GDK_HYPER_MASK: TGdkModifierType = 134217728; - GDK_META_MASK: TGdkModifierType = 268435456; - GDK_MODIFIER_RESERVED_29_MASK: TGdkModifierType = 536870912; - GDK_RELEASE_MASK: TGdkModifierType = 1073741824; - GDK_MODIFIER_MASK: TGdkModifierType = 1543512063; - *) - // AModifierMask := gdk_keymap_get_modifier_mask(AKeyMap, 0); + if Byte(nVirtKey) in [VK_LBUTTON..VK_XBUTTON2] then + begin + device := gdk_seat_get_pointer(seat); + if device = nil then + exit; + device^.get_state(gdk_screen_get_active_window(gdk_screen_get_default), @x, @AModifiers); + end else + begin + AKeyMap := gdk_keymap_get_for_display(display); + AModifiers := TGdkModifierType(AKeyMap^.get_modifier_state); + end; - AKeyMap := TGdkKeymap.get_for_display(gdk_display_get_default); - AModifiers := TGdkModifierType(AKeyMap^.get_modifier_state); case nVirtKey of VK_LBUTTON: if GDK_BUTTON1_MASK in AModifiers then @@ -2370,10 +2354,6 @@ begin VK_LWIN, VK_RWIN: if GDK_META_MASK in AModifiers then Result := Result or StateDown; - {$ifdef VerboseGtk3WinAPI} - else - DebugLn('TGtk3WidgetSet.GetKeyState TODO ', DbgSVKCode(Word(nVirtkey))); - {$endif} end; end;