summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuri Sizov <11782833+YuriSizov@users.noreply.github.com>2023-04-14 13:11:36 +0200
committerGitHub <noreply@github.com>2023-04-14 13:11:36 +0200
commitf5f796b0b7246507789d69c7033c74e043c10213 (patch)
tree61d8d5a968b08e21715fb7506b3fbabe8bd400ce
parent4dcf2c5431ea6894c268c384df0d81e7fd96c341 (diff)
parent932afc3bf556a5522addb8114abad4a924d1a19f (diff)
downloadredot-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.cpp10
-rw-r--r--platform/linuxbsd/x11/display_server_x11.h1
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;