Browse Source

Do it the hackey way

Jumar Macato 6 years ago
parent
commit
b7a42d96d2
1 changed files with 39 additions and 12 deletions
  1. 39 12
      src/Avalonia.X11/X11Window.cs

+ 39 - 12
src/Avalonia.X11/X11Window.cs

@@ -42,6 +42,7 @@ namespace Avalonia.X11
         private X11Window _transientParent;
         private double? _scalingOverride;
         public object SyncRoot { get; } = new object();
+        private int defaultWidth = 300, defaultHeight = 200;
 
         class InputEventContainer
         {
@@ -98,17 +99,6 @@ namespace Avalonia.X11
                 valueMask |= SetWindowValuemask.ColorMap;   
             }
 
-            int defaultWidth = 300, defaultHeight = 200;
-
-            if (!_popup)
-            {
-                var monitor = Screen.AllScreens.OrderBy(x => x.PixelDensity)
-                   .FirstOrDefault(m => m.Bounds.Contains(Position));
-
-                // Emulate Window 7+'s default window size behavior.
-                defaultWidth = (int)(monitor.WorkingArea.Width * 0.75d);
-                defaultHeight = (int)(monitor.WorkingArea.Height * 0.7d);
-            }
 
             _handle = XCreateWindow(_x11.Display, _x11.RootWindow, 10, 10, defaultWidth, defaultHeight, 0,
                 depth,
@@ -126,7 +116,7 @@ namespace Avalonia.X11
                 _renderHandle = _handle;
                 
             Handle = new PlatformHandle(_handle, "XID");
-            _realSize = new PixelSize(300, 200);
+            _realSize = new PixelSize(defaultWidth, defaultHeight);
             platform.Windows[_handle] = OnEvent;
             XEventMask ignoredMask = XEventMask.SubstructureRedirectMask
                                      | XEventMask.ResizeRedirectMask
@@ -167,8 +157,21 @@ namespace Avalonia.X11
             XFlush(_x11.Display);
             if(_popup)
                 PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(popupParent, MoveResize));
+            else
+                sizingState = DefaultSizingState.Start;
+
+        }
+
+        DefaultSizingState sizingState;
+
+        enum DefaultSizingState 
+        {
+            None,
+            Start,
+            End
         }
 
+
         class SurfaceInfo  : EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo
         {
             private readonly X11Window _window;
@@ -381,7 +384,23 @@ namespace Avalonia.X11
                     XTranslateCoordinates(_x11.Display, _handle, _x11.RootWindow,
                         0, 0,
                         out var tx, out var ty, out _);
+
                     _configurePoint = new PixelPoint(tx, ty);
+ 
+                    if (sizingState == DefaultSizingState.Start)
+                    {
+                        var monitor = Screen.AllScreens.OrderBy(x => x.PixelDensity)
+                           .FirstOrDefault(m => m.Bounds.Contains(new PixelPoint(tx, ty)));
+
+                        // Emulate Window 7+'s default window size behavior.
+                        var defW = (int)(monitor.WorkingArea.Width * 0.75d);
+                        var defH = (int)(monitor.WorkingArea.Height * 0.7d);
+
+                        var defSize = new Size(defW, defH);
+                        Resize(defSize);
+                    
+                        sizingState = DefaultSizingState.End;
+                    }
                 }
                 if (needEnqueue)
                     Dispatcher.UIThread.Post(() =>
@@ -765,6 +784,12 @@ namespace Avalonia.X11
         
         void Resize(Size clientSize, bool force)
         {
+            // It's a hack but ohwell...
+            if(sizingState == DefaultSizingState.Start 
+                        & clientSize.Width != defaultWidth 
+                        & clientSize.Height != defaultHeight)
+                sizingState = DefaultSizingState.End;
+
             if (!force && clientSize == ClientSize)
                 return;
             
@@ -782,6 +807,8 @@ namespace Avalonia.X11
                 _realSize = pixelSize;
                 Resized?.Invoke(ClientSize);
             }
+
+
         }
         
         public void CanResize(bool value)