|
|
@@ -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)
|