summaryrefslogtreecommitdiff
path: root/platform/x11
diff options
context:
space:
mode:
authorHein-Pieter van Braam <hp@tmm.cx>2018-09-09 22:13:50 +0200
committerHein-Pieter van Braam <hp@tmm.cx>2018-09-09 22:17:27 +0200
commit4b92ca1ccef83b40b9cde626b365b66aa23e2816 (patch)
tree05e0b1e8311d92f72b0ebb828d9f806c1d77efc8 /platform/x11
parent1093c0ff51b980634dffdd9618eaa53061da6419 (diff)
Update X11 global mouse position at startup
When we start the engine we haven't yet gotten any X11 motion events so we don't yet know where our mouse cursor is located. Instead we now query the X server for this information when we start and update the appropriate values. In addition when we move the window we also update the mouse position based off of X server knowledge as we will also not have received any mouse motion events. this fixes #8145 (for X11 only)
Diffstat (limited to 'platform/x11')
-rw-r--r--platform/x11/os_x11.cpp22
-rw-r--r--platform/x11/os_x11.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index a57a8c6bb9..c709705eeb 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -581,6 +581,8 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
}
}
+ update_real_mouse_position();
+
return OK;
}
@@ -1050,6 +1052,7 @@ Point2 OS_X11::get_window_position() const {
void OS_X11::set_window_position(const Point2 &p_position) {
XMoveWindow(x11_display, x11_window, p_position.x, p_position.y);
+ update_real_mouse_position();
}
Size2 OS_X11::get_window_size() const {
@@ -2972,6 +2975,25 @@ OS::LatinKeyboardVariant OS_X11::get_latin_keyboard_variant() const {
return LATIN_KEYBOARD_QWERTY;
}
+void OS_X11::update_real_mouse_position() {
+ Window root_return, child_return;
+ int root_x, root_y, win_x, win_y;
+ unsigned int mask_return;
+
+ Bool xquerypointer_result = XQueryPointer(x11_display, x11_window, &root_return, &child_return, &root_x, &root_y,
+ &win_x, &win_y, &mask_return);
+
+ if (xquerypointer_result) {
+ if (win_x > 0 && win_y > 0 && win_x <= current_videomode.width && win_y <= current_videomode.height) {
+
+ last_mouse_pos.x = win_x;
+ last_mouse_pos.y = win_y;
+ last_mouse_pos_valid = true;
+ input->set_mouse_position(last_mouse_pos);
+ }
+ }
+}
+
OS_X11::OS_X11() {
#ifdef PULSEAUDIO_ENABLED
diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h
index 44455a2d8d..3b6f9c54b0 100644
--- a/platform/x11/os_x11.h
+++ b/platform/x11/os_x11.h
@@ -313,6 +313,7 @@ public:
virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
+ void update_real_mouse_position();
OS_X11();
};