diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-10-12 00:06:53 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-10-12 00:06:53 +0800 |
commit | 073a1e3e5af78fb0d220169009fd6a0939b432d2 (patch) | |
tree | 3e47dfa6539b1260d50d5b7487d8a9ff93780331 | |
parent | 3d7fde8886f906274ff1b0f3bea1aeef0e59f73e (diff) | |
download | cru-073a1e3e5af78fb0d220169009fd6a0939b432d2.tar.gz cru-073a1e3e5af78fb0d220169009fd6a0939b432d2.tar.bz2 cru-073a1e3e5af78fb0d220169009fd6a0939b432d2.zip |
Extract ConvertModifiersOfEvent.
-rw-r--r-- | include/cru/platform/gui/xcb/Keyboard.h | 6 | ||||
-rw-r--r-- | src/platform/gui/xcb/Keyboard.cpp | 21 | ||||
-rw-r--r-- | src/platform/gui/xcb/Window.cpp | 32 |
3 files changed, 33 insertions, 26 deletions
diff --git a/include/cru/platform/gui/xcb/Keyboard.h b/include/cru/platform/gui/xcb/Keyboard.h index e1fc7fec..adff95c1 100644 --- a/include/cru/platform/gui/xcb/Keyboard.h +++ b/include/cru/platform/gui/xcb/Keyboard.h @@ -18,6 +18,12 @@ std::unordered_map<KeyCode, bool> GetKeyboardState( XcbUiApplication* application); KeyModifier GetCurrentKeyModifiers(XcbUiApplication* application); +/** + * Used to convert state field of xcb_button_press_event_t, + * xcb_button_release_event_t, xcb_key_press_event_t, xcb_key_release_event_t. + */ +KeyModifier ConvertModifiersOfEvent(uint32_t mask); + class XcbKeyboardManager { public: explicit XcbKeyboardManager(XcbUiApplication* application); diff --git a/src/platform/gui/xcb/Keyboard.cpp b/src/platform/gui/xcb/Keyboard.cpp index 2e02bcd1..4bfc448c 100644 --- a/src/platform/gui/xcb/Keyboard.cpp +++ b/src/platform/gui/xcb/Keyboard.cpp @@ -195,6 +195,27 @@ KeyModifier GetCurrentKeyModifiers(XcbUiApplication *application) { return result; } +KeyModifier ConvertModifiersOfEvent(uint32_t mask) { + // const char *MODIFIERS[] = { + // "Shift", "Lock", "Ctrl", "Alt", "Mod2", "Mod3", "Mod4", + // "Mod5", "Button1", "Button2", "Button3", "Button4", "Button5"}; + constexpr KeyModifier MODIFIERS[] = { + KeyModifiers::Shift, KeyModifiers::none, KeyModifiers::Ctrl, + KeyModifiers::Alt, KeyModifiers::none, KeyModifiers::none, + KeyModifiers::none, KeyModifiers::none, KeyModifiers::none, + KeyModifiers::none, KeyModifiers::none, KeyModifiers::none, + KeyModifiers::none, + }; + + KeyModifier result; + for (auto iter = std::begin(MODIFIERS); mask; mask >>= 1, ++iter) { + if (mask & 1) { + result |= *iter; + } + } + return result; +} + XcbKeyboardManager::XcbKeyboardManager(XcbUiApplication *application) : application_(application) { xkb_x11_setup_xkb_extension( diff --git a/src/platform/gui/xcb/Window.cpp b/src/platform/gui/xcb/Window.cpp index d94e8a0e..6a5857fc 100644 --- a/src/platform/gui/xcb/Window.cpp +++ b/src/platform/gui/xcb/Window.cpp @@ -39,27 +39,6 @@ MouseButton ConvertMouseButton(xcb_button_t button) { return MouseButtons::None; } } - -KeyModifier ConvertModifiers(uint32_t mask) { - // const char *MODIFIERS[] = { - // "Shift", "Lock", "Ctrl", "Alt", "Mod2", "Mod3", "Mod4", - // "Mod5", "Button1", "Button2", "Button3", "Button4", "Button5"}; - constexpr KeyModifier MODIFIERS[] = { - KeyModifiers::Shift, KeyModifiers::none, KeyModifiers::Ctrl, - KeyModifiers::Alt, KeyModifiers::none, KeyModifiers::none, - KeyModifiers::none, KeyModifiers::none, KeyModifiers::none, - KeyModifiers::none, KeyModifiers::none, KeyModifiers::none, - KeyModifiers::none, - }; - - KeyModifier result; - for (auto iter = std::begin(MODIFIERS); mask; mask >>= 1, ++iter) { - if (mask & 1) { - result |= *iter; - } - } - return result; -} } // namespace XcbWindow::XcbWindow(XcbUiApplication *application) @@ -501,7 +480,8 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) { if (bp->detail >= 4 && bp->detail <= 7) { NativeMouseWheelEventArgs args(30, Point(bp->event_x, bp->event_y), - ConvertModifiers(bp->state), false); + ConvertModifiersOfEvent(bp->state), + false); if (bp->detail == 5 || bp->detail == 7) { args.delta = -args.delta; } @@ -514,7 +494,7 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) { NativeMouseButtonEventArgs args(ConvertMouseButton(bp->detail), Point(bp->event_x, bp->event_y), - ConvertModifiers(bp->state)); + ConvertModifiersOfEvent(bp->state)); mouse_down_event_.Raise(std::move(args)); break; } @@ -522,7 +502,7 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) { xcb_button_release_event_t *br = (xcb_button_release_event_t *)event; NativeMouseButtonEventArgs args(ConvertMouseButton(br->detail), Point(br->event_x, br->event_y), - ConvertModifiers(br->state)); + ConvertModifiersOfEvent(br->state)); mouse_up_event_.Raise(std::move(args)); break; } @@ -550,14 +530,14 @@ void XcbWindow::HandleEvent(xcb_generic_event_t *event) { case XCB_KEY_PRESS: { xcb_key_press_event_t *kp = (xcb_key_press_event_t *)event; NativeKeyEventArgs args(XorgKeycodeToCruKeyCode(application_, kp->detail), - ConvertModifiers(kp->state)); + ConvertModifiersOfEvent(kp->state)); key_down_event_.Raise(std::move(args)); break; } case XCB_KEY_RELEASE: { xcb_key_release_event_t *kr = (xcb_key_release_event_t *)event; NativeKeyEventArgs args(XorgKeycodeToCruKeyCode(application_, kr->detail), - ConvertModifiers(kr->state)); + ConvertModifiersOfEvent(kr->state)); key_up_event_.Raise(std::move(args)); break; } |