From eea1a339dcde2020aa40e49d0145ce6777adbd05 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Fri, 9 Feb 2024 01:46:50 +0100 Subject: [PATCH] Fix popups position on X11 (#14551) * Ensure to use the appropriate parent when talking with X11 in X11Window Signed-off-by: Mary Guillemard * Translate root window coordinates to window coordinates when setting X11Window.Position 567561e27212a2c39ef59448a98d4e3497dd647c caused the origin of window to not be (0, 0) for popups on X. As a result, all popups were wrongly positioned. This change Position to translate from root window coordinates (the display space) to parent window coordinates. Signed-off-by: Mary Guillemard --------- Signed-off-by: Mary Guillemard --- src/Avalonia.X11/X11Window.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 0dbc44f408..53c541ae3b 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -51,6 +51,7 @@ namespace Avalonia.X11 private PixelSize _realSize; private bool _cleaningUp; private IntPtr _handle; + private IntPtr _parentHandle; private IntPtr _xic; private IntPtr _renderHandle; private IntPtr _xSyncCounter; @@ -82,6 +83,7 @@ namespace Avalonia.X11 _mouse = new MouseDevice(); _touch = new TouchDevice(); _keyboard = platform.KeyboardDevice; + _parentHandle = popupParent != null ? ((X11Window)popupParent)._handle : _x11.RootWindow; var glfeature = AvaloniaLocator.Current.GetService(); XSetWindowAttributes attr = new XSetWindowAttributes(); @@ -119,7 +121,7 @@ namespace Avalonia.X11 { visual = visualInfo.Value.visual; depth = (int)visualInfo.Value.depth; - attr.colormap = XCreateColormap(_x11.Display, _x11.RootWindow, visualInfo.Value.visual, 0); + attr.colormap = XCreateColormap(_x11.Display, _parentHandle, visualInfo.Value.visual, 0); valueMask |= SetWindowValuemask.ColorMap; } @@ -142,9 +144,7 @@ namespace Avalonia.X11 defaultWidth = Math.Max(defaultWidth, 300); defaultHeight = Math.Max(defaultHeight, 200); - var parentHandle = popupParent != null ? ((X11Window)popupParent)._handle : _x11.RootWindow; - - _handle = XCreateWindow(_x11.Display, parentHandle, 10, 10, defaultWidth, defaultHeight, 0, + _handle = XCreateWindow(_x11.Display, _parentHandle, 10, 10, defaultWidth, defaultHeight, 0, depth, (int)CreateWindowArgs.InputOutput, visual, @@ -502,7 +502,7 @@ namespace Avalonia.X11 _configurePoint = new PixelPoint(ev.ConfigureEvent.x, ev.ConfigureEvent.y); else { - XTranslateCoordinates(_x11.Display, _handle, _x11.RootWindow, + XTranslateCoordinates(_x11.Display, _handle, _parentHandle, 0, 0, out var tx, out var ty, out _); _configurePoint = new PixelPoint(tx, ty); @@ -1071,10 +1071,12 @@ namespace Avalonia.X11 UpdateSizeHints(null); } + XTranslateCoordinates(_x11.Display, _parentHandle, _x11.RootWindow, 0, 0, out var wx, out var wy, out _); + var changes = new XWindowChanges { - x = value.X, - y = (int)value.Y + x = value.X - wx, + y = (int)value.Y - wy }; XConfigureWindow(_x11.Display, _handle, ChangeWindowFlags.CWX | ChangeWindowFlags.CWY, @@ -1135,7 +1137,7 @@ namespace Avalonia.X11 } }; xev.ClientMessageEvent.ptr4 = l4 ?? IntPtr.Zero; - XSendEvent(_x11.Display, _x11.RootWindow, false, + XSendEvent(_x11.Display, _parentHandle, false, new IntPtr((int)(EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev); }