From 3266b1acb0c101ff7224f9123539e758bb7e7512 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 21 Jun 2022 21:34:08 +0200 Subject: [PATCH] Add API to query currently held modifiers keys --- libs/gtkmm2ext/gtkmm2ext/keyboard.h | 3 ++- libs/gtkmm2ext/keyboard.cc | 32 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h index af390d27bf..d16d32d7e6 100644 --- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h +++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h @@ -113,7 +113,8 @@ public: set_modifier (newval, RangeSelectModifier); } - bool key_is_down (uint32_t keyval); + bool key_is_down (uint32_t keyval); + guint modifier_state (); static GdkModifierType RelevantModifierKeyMask; diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index 06c7034c36..b17814c81e 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -476,6 +476,38 @@ Keyboard::key_is_down (uint32_t keyval) return find (state.begin (), state.end (), keyval) != state.end (); } +guint +Keyboard::modifier_state () +{ + int mask = 0; + for (auto const& keyval : state) { + switch (keyval) { + case GDK_Meta_R: + case GDK_Meta_L: + mask |= GDK_MOD2_MASK; + break; + case GDK_Shift_R: + case GDK_Shift_L: + mask |= GDK_SHIFT_MASK; + break; + case GDK_Caps_Lock: + mask |= GDK_LOCK_MASK; + break; + case GDK_Alt_R: + case GDK_Alt_L: + mask |= GDK_MOD1_MASK; + break; + case GDK_Control_R: + case GDK_Control_L: + mask |= GDK_CONTROL_MASK; + break; + default: + break; + } + } + return mask & RelevantModifierKeyMask; +} + bool Keyboard::enter_window (GdkEventCrossing*, Gtk::Window* win) {