From 9661f0b823e7b63c4ddbcd8042c559cd5a7f7773 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 30 Nov 2024 22:38:03 +0100 Subject: Add more reliable mouse/keyboard grabbing to fix keyboard input not working in ui in some games --- src/Overlay.cpp | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'src') 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(); -- cgit v1.2.3