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)
This commit is contained in:
Hein-Pieter van Braam 2018-09-09 22:13:50 +02:00
parent 1093c0ff51
commit 4b92ca1cce
2 changed files with 23 additions and 0 deletions

View file

@ -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

View file

@ -313,6 +313,7 @@ public:
virtual LatinKeyboardVariant get_latin_keyboard_variant() const;
void update_real_mouse_position();
OS_X11();
};