aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-11-30 22:38:03 +0100
committerdec05eba <dec05eba@protonmail.com>2024-11-30 22:38:03 +0100
commit9661f0b823e7b63c4ddbcd8042c559cd5a7f7773 (patch)
treeef9c3d3957df6eee21c8b363816b7d2f3baa69dd
parent6cde892148e2643a3cd1ba80c3669bc035fc1fea (diff)
Add more reliable mouse/keyboard grabbing to fix keyboard input not working in ui in some games
-rw-r--r--include/Overlay.hpp1
-rw-r--r--src/Overlay.cpp31
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();