From 8dcb735f2b9e196394c119a7d95568dedd7af58f Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Tue, 18 Dec 2018 19:43:37 -0800 Subject: [PATCH] x11display: Release M_relative mouse when window loses focus Fixes #480 --- panda/src/x11display/x11GraphicsWindow.cxx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/panda/src/x11display/x11GraphicsWindow.cxx b/panda/src/x11display/x11GraphicsWindow.cxx index ad0f8e44dd..be28a6254f 100644 --- a/panda/src/x11display/x11GraphicsWindow.cxx +++ b/panda/src/x11display/x11GraphicsWindow.cxx @@ -508,23 +508,33 @@ process_events() { changed_properties = true; } - if (properties.has_foreground() && _properties.get_mouse_mode() == WindowProperties::M_confined) { + if (properties.has_foreground() && ( + _properties.get_mouse_mode() == WindowProperties::M_confined || + _dga_mouse_enabled)) { + x11GraphicsPipe *x11_pipe; + DCAST_INTO_V(x11_pipe, _pipe); + // Focus has changed, let's let go of the pointer if we've grabbed or re-grab it if needed if (properties.get_foreground()) { // Window is going to the foreground, re-grab the pointer X11_Cursor cursor = None; if (_properties.get_cursor_hidden()) { - x11GraphicsPipe *x11_pipe; - DCAST_INTO_V(x11_pipe, _pipe); cursor = x11_pipe->get_hidden_cursor(); } XGrabPointer(_display, _xwindow, True, 0, GrabModeAsync, GrabModeAsync, _xwindow, cursor, CurrentTime); + if (_dga_mouse_enabled) { + x11_pipe->enable_relative_mouse(); + } } else { // window is leaving the foreground, ungrab the pointer - XUngrabPointer(_display, CurrentTime); + if (_dga_mouse_enabled) { + x11_pipe->disable_relative_mouse(); + } else if (_properties.get_mouse_mode() == WindowProperties::M_confined) { + XUngrabPointer(_display, CurrentTime); + } } }