diff options
author | dec05eba <dec05eba@protonmail.com> | 2024-11-30 22:38:03 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2024-11-30 22:38:03 +0100 |
commit | 9661f0b823e7b63c4ddbcd8042c559cd5a7f7773 (patch) | |
tree | ef9c3d3957df6eee21c8b363816b7d2f3baa69dd | |
parent | 6cde892148e2643a3cd1ba80c3669bc035fc1fea (diff) |
Add more reliable mouse/keyboard grabbing to fix keyboard input not working in ui in some games
-rw-r--r-- | include/Overlay.hpp | 1 | ||||
-rw-r--r-- | src/Overlay.cpp | 31 |
2 files changed, 20 insertions, 12 deletions
diff --git a/include/Overlay.hpp b/include/Overlay.hpp index bf49a42..bfa8db4 100644 --- a/include/Overlay.hpp +++ b/include/Overlay.hpp @@ -60,6 +60,7 @@ namespace gsr { void xi_setup(); void handle_xi_events(); void process_key_bindings(mgl::Event &event); + void grab_mouse_and_keyboard(); void xi_setup_fake_cursor(); void xi_grab_all_devices(); void xi_warp_pointer(mgl::vec2i position); diff --git a/src/Overlay.cpp b/src/Overlay.cpp index 2a0d8f2..92eb19a 100644 --- a/src/Overlay.cpp +++ b/src/Overlay.cpp @@ -601,6 +601,8 @@ namespace gsr { if(!window) return false; + grab_mouse_and_keyboard(); + //force_window_on_top(); window->clear(bg_color); @@ -636,6 +638,21 @@ namespace gsr { return true; } + void Overlay::grab_mouse_and_keyboard() { + // TODO: Remove these grabs when debugging with a debugger, or your X11 session will appear frozen. + // There should be a debug mode to not use these + mgl_context *context = mgl_get_context(); + Display *display = (Display*)context->connection; + XGrabPointer(display, window->get_system_handle(), True, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | + Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | + ButtonMotionMask, + GrabModeAsync, GrabModeAsync, None, default_cursor, CurrentTime); + // TODO: This breaks global hotkeys (when using x11 global hotkeys) + XGrabKeyboard(display, window->get_system_handle(), True, GrabModeAsync, GrabModeAsync, CurrentTime); + XFlush(display); + } + void Overlay::xi_setup_fake_cursor() { if(!xi_display) return; @@ -898,20 +915,10 @@ namespace gsr { default_cursor = 0; } default_cursor = XCreateFontCursor(display, XC_arrow); - - // TODO: Remove these grabs when debugging with a debugger, or your X11 session will appear frozen. - // There should be a debug mode to not use these - - XGrabPointer(display, window->get_system_handle(), True, - ButtonPressMask | ButtonReleaseMask | PointerMotionMask | - Button1MotionMask | Button2MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask | - ButtonMotionMask, - GrabModeAsync, GrabModeAsync, None, default_cursor, CurrentTime); - // TODO: This breaks global hotkeys (when using x11 global hotkeys) - XGrabKeyboard(display, window->get_system_handle(), True, GrabModeAsync, GrabModeAsync, CurrentTime); - XFlush(display); + grab_mouse_and_keyboard(); + // The real cursor doesn't move when all devices are grabbed, so we create our own cursor and diplay that while grabbed xi_setup_fake_cursor(); |