diff options
author | Yuri Sizov <11782833+YuriSizov@users.noreply.github.com> | 2023-04-14 13:11:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-14 13:11:36 +0200 |
commit | f5f796b0b7246507789d69c7033c74e043c10213 (patch) | |
tree | 61d8d5a968b08e21715fb7506b3fbabe8bd400ce | |
parent | 4dcf2c5431ea6894c268c384df0d81e7fd96c341 (diff) | |
parent | 932afc3bf556a5522addb8114abad4a924d1a19f (diff) | |
download | redot-engine-f5f796b0b7246507789d69c7033c74e043c10213.tar.gz |
Merge pull request #76040 from MightiestGoat/fix-sliding-window-linux-via-tracking-parent
Fix the sliding window problem in linux occur due to reparenting of the window due to decoration.
-rw-r--r-- | platform/linuxbsd/x11/display_server_x11.cpp | 10 | ||||
-rw-r--r-- | platform/linuxbsd/x11/display_server_x11.h | 1 |
2 files changed, 11 insertions, 0 deletions
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 0972bf700e..52ee9e8e6f 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -3505,6 +3505,15 @@ void DisplayServerX11::_window_changed(XEvent *event) { wd.minimized = _window_minimize_check(window_id); wd.maximized = _window_maximize_check(window_id, "_NET_WM_STATE"); + // Readjusting the window position if the window is being reparented by the window manager for decoration + Window root, parent, *children; + unsigned int nchildren; + if (XQueryTree(x11_display, wd.x11_window, &root, &parent, &children, &nchildren) && wd.parent != parent) { + wd.parent = parent; + window_set_position(wd.position, window_id); + } + XFree(children); + { //the position in xconfigure is not useful here, obtain it manually int x = 0, y = 0; @@ -4989,6 +4998,7 @@ DisplayServerX11::WindowID DisplayServerX11::_create_window(WindowMode p_mode, V { wd.x11_window = XCreateWindow(x11_display, RootWindow(x11_display, visualInfo.screen), win_rect.position.x, win_rect.position.y, win_rect.size.width > 0 ? win_rect.size.width : 1, win_rect.size.height > 0 ? win_rect.size.height : 1, 0, visualInfo.depth, InputOutput, visualInfo.visual, valuemask, &windowAttributes); + wd.parent = RootWindow(x11_display, visualInfo.screen); XSetWindowAttributes window_attributes_ime = {}; window_attributes_ime.event_mask = KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask; diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h index c98409253e..c19d2f441a 100644 --- a/platform/linuxbsd/x11/display_server_x11.h +++ b/platform/linuxbsd/x11/display_server_x11.h @@ -160,6 +160,7 @@ class DisplayServerX11 : public DisplayServer { struct WindowData { Window x11_window; Window x11_xim_window; + Window parent; ::XIC xic; bool ime_active = false; bool ime_in_progress = false; |