|
@@ -323,20 +323,21 @@ void DisplayServerX11::mouse_set_mode(MouseMode p_mode) {
|
|
|
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED || mouse_mode == MOUSE_MODE_CONFINED_HIDDEN) {
|
|
|
//flush pending motion events
|
|
|
_flush_mouse_motion();
|
|
|
- WindowData &main_window = windows[MAIN_WINDOW_ID];
|
|
|
+ WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID;
|
|
|
+ WindowData &window = windows[window_id];
|
|
|
|
|
|
if (XGrabPointer(
|
|
|
- x11_display, main_window.x11_window, True,
|
|
|
+ x11_display, window.x11_window, True,
|
|
|
ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
|
|
|
- GrabModeAsync, GrabModeAsync, windows[MAIN_WINDOW_ID].x11_window, None, CurrentTime) != GrabSuccess) {
|
|
|
+ GrabModeAsync, GrabModeAsync, window.x11_window, None, CurrentTime) != GrabSuccess) {
|
|
|
ERR_PRINT("NO GRAB");
|
|
|
}
|
|
|
|
|
|
if (mouse_mode == MOUSE_MODE_CAPTURED) {
|
|
|
- center.x = main_window.size.width / 2;
|
|
|
- center.y = main_window.size.height / 2;
|
|
|
+ center.x = window.size.width / 2;
|
|
|
+ center.y = window.size.height / 2;
|
|
|
|
|
|
- XWarpPointer(x11_display, None, main_window.x11_window,
|
|
|
+ XWarpPointer(x11_display, None, window.x11_window,
|
|
|
0, 0, 0, 0, (int)center.x, (int)center.y);
|
|
|
|
|
|
Input::get_singleton()->set_mouse_position(center);
|
|
@@ -358,7 +359,8 @@ void DisplayServerX11::mouse_warp_to_position(const Point2i &p_to) {
|
|
|
if (mouse_mode == MOUSE_MODE_CAPTURED) {
|
|
|
last_mouse_pos = p_to;
|
|
|
} else {
|
|
|
- XWarpPointer(x11_display, None, windows[MAIN_WINDOW_ID].x11_window,
|
|
|
+ WindowID window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID;
|
|
|
+ XWarpPointer(x11_display, None, windows[window_id].x11_window,
|
|
|
0, 0, 0, 0, (int)p_to.x, (int)p_to.y);
|
|
|
}
|
|
|
}
|
|
@@ -3353,7 +3355,7 @@ void DisplayServerX11::process_events() {
|
|
|
DEBUG_LOG_X11("[%u] FocusIn window=%lu (%u), mode='%u' \n", frame, event.xfocus.window, window_id, event.xfocus.mode);
|
|
|
|
|
|
WindowData &wd = windows[window_id];
|
|
|
-
|
|
|
+ last_focused_window = window_id;
|
|
|
wd.focused = true;
|
|
|
|
|
|
if (wd.xic) {
|
|
@@ -3553,9 +3555,9 @@ void DisplayServerX11::process_events() {
|
|
|
// The X11 API requires filtering one-by-one through the motion
|
|
|
// notify events, in order to figure out which event is the one
|
|
|
// generated by warping the mouse pointer.
|
|
|
-
|
|
|
+ WindowID focused_window_id = windows.has(last_focused_window) ? last_focused_window : MAIN_WINDOW_ID;
|
|
|
while (true) {
|
|
|
- if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[MAIN_WINDOW_ID].size.width / 2 && event.xmotion.y == windows[MAIN_WINDOW_ID].size.height / 2) {
|
|
|
+ if (mouse_mode == MOUSE_MODE_CAPTURED && event.xmotion.x == windows[focused_window_id].size.width / 2 && event.xmotion.y == windows[focused_window_id].size.height / 2) {
|
|
|
//this is likely the warp event since it was warped here
|
|
|
center = Vector2(event.xmotion.x, event.xmotion.y);
|
|
|
break;
|
|
@@ -3630,9 +3632,8 @@ void DisplayServerX11::process_events() {
|
|
|
// Reset to prevent lingering motion
|
|
|
xi.relative_motion.x = 0;
|
|
|
xi.relative_motion.y = 0;
|
|
|
-
|
|
|
if (mouse_mode == MOUSE_MODE_CAPTURED) {
|
|
|
- pos = Point2i(windows[MAIN_WINDOW_ID].size.width / 2, windows[MAIN_WINDOW_ID].size.height / 2);
|
|
|
+ pos = Point2i(windows[focused_window_id].size.width / 2, windows[focused_window_id].size.height / 2);
|
|
|
}
|
|
|
|
|
|
Ref<InputEventMouseMotion> mm;
|