From 3ede24cf74bb565f8a899af84113b9ad8f6eb450 Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Wed, 18 Sep 2019 21:40:22 +0800 Subject: [PATCH 01/17] Set a ratio of client size as default window size on xorg. --- src/Avalonia.X11/X11Window.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 975b3d11d7..9c9e421a6c 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -98,14 +98,23 @@ namespace Avalonia.X11 valueMask |= SetWindowValuemask.ColorMap; } - _handle = XCreateWindow(_x11.Display, _x11.RootWindow, 10, 10, 300, 200, 0, + int defaultWidth = 300, defaultHeight = 200; + + if (!_popup) + { + // Emulate Window 7+'s default window size behavior. + defaultWidth = (int)(MaxClientSize.Width * 0.75d); + defaultHeight = (int)(MaxClientSize.Height * 0.7d); + } + + _handle = XCreateWindow(_x11.Display, _x11.RootWindow, 10, 10, defaultWidth, defaultHeight, 0, depth, (int)CreateWindowArgs.InputOutput, visual, new UIntPtr((uint)valueMask), ref attr); if (_useRenderWindow) - _renderHandle = XCreateWindow(_x11.Display, _handle, 0, 0, 300, 200, 0, depth, + _renderHandle = XCreateWindow(_x11.Display, _handle, 0, 0, defaultWidth, defaultHeight, 0, depth, (int)CreateWindowArgs.InputOutput, visual, new UIntPtr((uint)(SetWindowValuemask.BorderPixel | SetWindowValuemask.BitGravity | From 76f948c45a5dae329c59e673ae45a92ca75c7fe9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:17:41 +0100 Subject: [PATCH 02/17] osx add the pixeldensity to screen info. --- native/Avalonia.Native/inc/avalonia-native.h | 1 + native/Avalonia.Native/src/OSX/Screens.mm | 2 ++ 2 files changed, 3 insertions(+) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 36e16c24d1..e000c88836 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -52,6 +52,7 @@ struct AvnScreen { AvnRect Bounds; AvnRect WorkingArea; + float PixelDenisty; bool Primary; }; diff --git a/native/Avalonia.Native/src/OSX/Screens.mm b/native/Avalonia.Native/src/OSX/Screens.mm index 9d436b98c5..1c9f78873b 100644 --- a/native/Avalonia.Native/src/OSX/Screens.mm +++ b/native/Avalonia.Native/src/OSX/Screens.mm @@ -38,6 +38,8 @@ class Screens : public ComSingleObject ret->WorkingArea.Height = [screen visibleFrame].size.height; ret->WorkingArea.Width = [screen visibleFrame].size.width; + ret->PixelDenisty = [screen backingScaleFactor]; + ret->Primary = index == 0; return S_OK; From 2282c99c163adeedfdea105d12370c326955e512 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:35:03 +0100 Subject: [PATCH 03/17] add dpi information to screens api. --- native/Avalonia.Native/inc/avalonia-native.h | 2 +- src/Avalonia.Controls/Platform/Screen.cs | 5 ++++- src/Avalonia.DesignerSupport/Remote/Stubs.cs | 2 +- src/Avalonia.Native/ScreenImpl.cs | 1 + src/Avalonia.X11/X11Screens.cs | 2 +- src/Windows/Avalonia.Win32/ScreenImpl.cs | 4 +++- src/Windows/Avalonia.Win32/WinScreen.cs | 2 +- tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs | 2 +- 8 files changed, 13 insertions(+), 7 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index e000c88836..c7a7256f9a 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -52,7 +52,7 @@ struct AvnScreen { AvnRect Bounds; AvnRect WorkingArea; - float PixelDenisty; + float PixelDensity; bool Primary; }; diff --git a/src/Avalonia.Controls/Platform/Screen.cs b/src/Avalonia.Controls/Platform/Screen.cs index e7c811235c..d272904f99 100644 --- a/src/Avalonia.Controls/Platform/Screen.cs +++ b/src/Avalonia.Controls/Platform/Screen.cs @@ -2,14 +2,17 @@ { public class Screen { + public double PixelDenisty { get; } + public PixelRect Bounds { get; } public PixelRect WorkingArea { get; } public bool Primary { get; } - public Screen(PixelRect bounds, PixelRect workingArea, bool primary) + public Screen(double pixelDensity, PixelRect bounds, PixelRect workingArea, bool primary) { + this.PixelDenisty = pixelDensity; this.Bounds = bounds; this.WorkingArea = workingArea; this.Primary = primary; diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 4ce0da60a2..16d434b614 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -178,6 +178,6 @@ namespace Avalonia.DesignerSupport.Remote public int ScreenCount => 1; public IReadOnlyList AllScreens { get; } = - new Screen[] { new Screen(new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) }; + new Screen[] { new Screen(1, new PixelRect(0, 0, 4000, 4000), new PixelRect(0, 0, 4000, 4000), true) }; } } diff --git a/src/Avalonia.Native/ScreenImpl.cs b/src/Avalonia.Native/ScreenImpl.cs index 2afa71753e..3ec3be20d3 100644 --- a/src/Avalonia.Native/ScreenImpl.cs +++ b/src/Avalonia.Native/ScreenImpl.cs @@ -31,6 +31,7 @@ namespace Avalonia.Native var screen = _native.GetScreen(i); result[i] = new Screen( + screen.PixelDensity, screen.Bounds.ToAvaloniaPixelRect(), screen.WorkingArea.ToAvaloniaPixelRect(), screen.Primary); diff --git a/src/Avalonia.X11/X11Screens.cs b/src/Avalonia.X11/X11Screens.cs index 6f860145d3..e247a4241a 100644 --- a/src/Avalonia.X11/X11Screens.cs +++ b/src/Avalonia.X11/X11Screens.cs @@ -157,7 +157,7 @@ namespace Avalonia.X11 public int ScreenCount => _impl.Screens.Length; public IReadOnlyList AllScreens => - _impl.Screens.Select(s => new Screen(s.Bounds, s.WorkingArea, s.Primary)).ToArray(); + _impl.Screens.Select(s => new Screen(s.PixelDensity, s.Bounds, s.WorkingArea, s.Primary)).ToArray(); } interface IX11Screens diff --git a/src/Windows/Avalonia.Win32/ScreenImpl.cs b/src/Windows/Avalonia.Win32/ScreenImpl.cs index 1833e21e23..e77aa07bcd 100644 --- a/src/Windows/Avalonia.Win32/ScreenImpl.cs +++ b/src/Windows/Avalonia.Win32/ScreenImpl.cs @@ -30,6 +30,8 @@ namespace Avalonia.Win32 MONITORINFO monitorInfo = MONITORINFO.Create(); if (GetMonitorInfo(monitor,ref monitorInfo)) { + GetDpiForMonitor(monitor, MONITOR_DPI_TYPE.MDT_EFFECTIVE_DPI, out var x, out _); + RECT bounds = monitorInfo.rcMonitor; RECT workingArea = monitorInfo.rcWork; PixelRect avaloniaBounds = new PixelRect(bounds.left, bounds.top, bounds.right - bounds.left, @@ -38,7 +40,7 @@ namespace Avalonia.Win32 new PixelRect(workingArea.left, workingArea.top, workingArea.right - workingArea.left, workingArea.bottom - workingArea.top); screens[index] = - new WinScreen(avaloniaBounds, avaloniaWorkArea, monitorInfo.dwFlags == 1, + new WinScreen((double)x / 96.0d, avaloniaBounds, avaloniaWorkArea, monitorInfo.dwFlags == 1, monitor); index++; } diff --git a/src/Windows/Avalonia.Win32/WinScreen.cs b/src/Windows/Avalonia.Win32/WinScreen.cs index e849800e62..0cf9fe31db 100644 --- a/src/Windows/Avalonia.Win32/WinScreen.cs +++ b/src/Windows/Avalonia.Win32/WinScreen.cs @@ -7,7 +7,7 @@ namespace Avalonia.Win32 { private readonly IntPtr _hMonitor; - public WinScreen(PixelRect bounds, PixelRect workingArea, bool primary, IntPtr hMonitor) : base(bounds, workingArea, primary) + public WinScreen(double pixelDensity, PixelRect bounds, PixelRect workingArea, bool primary, IntPtr hMonitor) : base(pixelDensity, bounds, workingArea, primary) { this._hMonitor = hMonitor; } diff --git a/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs b/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs index ac80fc6c7a..f44f89e91f 100644 --- a/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs @@ -198,7 +198,7 @@ namespace Avalonia.Controls.UnitTests var screen = new PixelRect(new PixelPoint(), new PixelSize(100, 100)); var screenImpl = new Mock(); screenImpl.Setup(x => x.ScreenCount).Returns(1); - screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(screen, screen, true) }); + screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(1, screen, screen, true) }); popupImpl = MockWindowingPlatform.CreatePopupMock(); popupImpl.SetupGet(x => x.Scaling).Returns(1); From 7ee0bb804ac000a112742aafb7b34f7f04fa1441 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:37:28 +0100 Subject: [PATCH 04/17] display screen dpi info on screenspage --- samples/ControlCatalog/Pages/ScreenPage.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/samples/ControlCatalog/Pages/ScreenPage.cs b/samples/ControlCatalog/Pages/ScreenPage.cs index 13c1667ed2..79d1289111 100644 --- a/samples/ControlCatalog/Pages/ScreenPage.cs +++ b/samples/ControlCatalog/Pages/ScreenPage.cs @@ -57,12 +57,15 @@ namespace ControlCatalog.Pages text.Text = $"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}"; context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 20), text); + + text.Text = $"Scaling: {screen.PixelDenisty * 100}%"; + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 40), text); text.Text = $"Primary: {screen.Primary}"; - context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 40), text); + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 60), text); text.Text = $"Current: {screen.Equals(w.Screens.ScreenFromBounds(new PixelRect(w.Position, PixelSize.FromSize(w.Bounds.Size, scaling))))}"; - context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 60), text); + context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 80), text); } context.DrawRectangle(p, new Rect(w.Position.X / 10f + Math.Abs(_leftMost), w.Position.Y / 10, w.Bounds.Width / 10, w.Bounds.Height / 10)); From 54dd8a4002cb15dc02841b6593a57785674642e4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:43:42 +0100 Subject: [PATCH 05/17] add implementation for osx. --- src/Avalonia.Native/WindowImplBase.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 217fb4b078..05068a275f 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Avalonia.Controls; using Avalonia.Controls.Platform.Surfaces; using Avalonia.Input; @@ -48,6 +49,11 @@ namespace Avalonia.Native Screen = new ScreenImpl(screens); _savedLogicalSize = ClientSize; _savedScaling = Scaling; + + var monitor = Screen.AllScreens.OrderBy(x => x.PixelDensity) + .FirstOrDefault(m => m.Bounds.Contains(Position)); + + Resize(new Size(monitor.WorkingArea.Width * 0.75d, monitor.WorkingArea.Height * 0.7d); } public Size ClientSize From 1a5ffa945842529816651eaa10a13bfe02093756 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:43:48 +0100 Subject: [PATCH 06/17] fix typo --- src/Avalonia.Controls/Platform/Screen.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Platform/Screen.cs b/src/Avalonia.Controls/Platform/Screen.cs index d272904f99..976faed3fd 100644 --- a/src/Avalonia.Controls/Platform/Screen.cs +++ b/src/Avalonia.Controls/Platform/Screen.cs @@ -2,7 +2,7 @@ { public class Screen { - public double PixelDenisty { get; } + public double PixelDensity { get; } public PixelRect Bounds { get; } @@ -12,7 +12,7 @@ public Screen(double pixelDensity, PixelRect bounds, PixelRect workingArea, bool primary) { - this.PixelDenisty = pixelDensity; + this.PixelDensity = pixelDensity; this.Bounds = bounds; this.WorkingArea = workingArea; this.Primary = primary; From 31cf785927f31ce6380a38ddb81dee19701ef26c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:43:58 +0100 Subject: [PATCH 07/17] fix x11 impl --- src/Avalonia.X11/X11Window.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 9c9e421a6c..00761dfce8 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -102,9 +102,12 @@ namespace Avalonia.X11 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)(MaxClientSize.Width * 0.75d); - defaultHeight = (int)(MaxClientSize.Height * 0.7d); + 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, From 65caadd7cdab71b2aeafce489ad7d898eda33808 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:48:35 +0100 Subject: [PATCH 08/17] fix missing bracket. --- src/Avalonia.Native/WindowImplBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 05068a275f..74ee76bd38 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -53,7 +53,7 @@ namespace Avalonia.Native var monitor = Screen.AllScreens.OrderBy(x => x.PixelDensity) .FirstOrDefault(m => m.Bounds.Contains(Position)); - Resize(new Size(monitor.WorkingArea.Width * 0.75d, monitor.WorkingArea.Height * 0.7d); + Resize(new Size(monitor.WorkingArea.Width * 0.75d, monitor.WorkingArea.Height * 0.7d)); } public Size ClientSize From 439f7af6632acf2c304d4ac3983ec6214398cda6 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 16:49:14 +0100 Subject: [PATCH 09/17] fix typo --- samples/ControlCatalog/Pages/ScreenPage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ControlCatalog/Pages/ScreenPage.cs b/samples/ControlCatalog/Pages/ScreenPage.cs index 79d1289111..d775eb9635 100644 --- a/samples/ControlCatalog/Pages/ScreenPage.cs +++ b/samples/ControlCatalog/Pages/ScreenPage.cs @@ -58,7 +58,7 @@ namespace ControlCatalog.Pages text.Text = $"WorkArea: {screen.WorkingArea.Width}:{screen.WorkingArea.Height}"; context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 20), text); - text.Text = $"Scaling: {screen.PixelDenisty * 100}%"; + text.Text = $"Scaling: {screen.PixelDensity * 100}%"; context.DrawText(Brushes.Black, boundsRect.Position.WithY(boundsRect.Size.Height + 40), text); text.Text = $"Primary: {screen.Primary}"; From e530ab468cd9062cb01850ee9b6468ebd17aad63 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 18 Sep 2019 17:03:40 +0100 Subject: [PATCH 10/17] fix implementation of maxclientsize osx. --- native/Avalonia.Native/inc/avalonia-native.h | 1 - native/Avalonia.Native/src/OSX/Screens.mm | 2 +- native/Avalonia.Native/src/OSX/window.mm | 24 ++------------------ src/Avalonia.Native/WindowImplBase.cs | 3 ++- 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index c7a7256f9a..e54f3fa6a7 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -188,7 +188,6 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT Close() = 0; virtual HRESULT Activate () = 0; virtual HRESULT GetClientSize(AvnSize*ret) = 0; - virtual HRESULT GetMaxClientSize(AvnSize* ret) = 0; virtual HRESULT GetScaling(double*ret)=0; virtual HRESULT SetMinMaxSize(AvnSize minSize, AvnSize maxSize) = 0; virtual HRESULT Resize(double width, double height) = 0; diff --git a/native/Avalonia.Native/src/OSX/Screens.mm b/native/Avalonia.Native/src/OSX/Screens.mm index 1c9f78873b..e7f009787a 100644 --- a/native/Avalonia.Native/src/OSX/Screens.mm +++ b/native/Avalonia.Native/src/OSX/Screens.mm @@ -38,7 +38,7 @@ class Screens : public ComSingleObject ret->WorkingArea.Height = [screen visibleFrame].size.height; ret->WorkingArea.Width = [screen visibleFrame].size.width; - ret->PixelDenisty = [screen backingScaleFactor]; + ret->PixelDensity = [screen backingScaleFactor]; ret->Primary = index == 0; diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index bfa33eb259..c515f84b94 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -54,7 +54,6 @@ public: FORWARD_IUNKNOWN() virtual ~WindowBaseImpl() { - NSDebugLog(@"~WindowBaseImpl()"); View = NULL; Window = NULL; } @@ -161,22 +160,6 @@ public: } } - virtual HRESULT GetMaxClientSize(AvnSize* ret) override - { - @autoreleasepool - { - if(ret == nullptr) - return E_POINTER; - - auto size = [NSScreen.screens objectAtIndex:0].frame.size; - - ret->Height = size.height; - ret->Width = size.width; - - return S_OK; - } - } - virtual HRESULT GetScaling (double* ret) override { @autoreleasepool @@ -416,8 +399,8 @@ private: INHERIT_INTERFACE_MAP(WindowBaseImpl) INTERFACE_MAP_ENTRY(IAvnWindow, IID_IAvnWindow) END_INTERFACE_MAP() - virtual ~WindowImpl(){ - NSDebugLog(@"~WindowImpl"); + virtual ~WindowImpl() + { } ComPtr WindowEvents; @@ -664,10 +647,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)dealloc { - NSDebugLog(@"AvnView dealloc"); } - - (void)onClosed { _parent = NULL; @@ -1067,7 +1048,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent - (void)dealloc { - NSDebugLog(@"AvnWindow dealloc"); } - (void)pollModalSession:(nonnull NSModalSession)session diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 74ee76bd38..d8ff370c45 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -306,7 +306,8 @@ namespace Avalonia.Native _native.BeginMoveDrag(); } - public Size MaxClientSize => _native.GetMaxClientSize().ToAvaloniaSize(); + public Size MaxClientSize => Screen.AllScreens.Select(s => s.Bounds.Size.ToSize(s.PixelDensity)) + .OrderByDescending(x => x.Width + x.Height).FirstOrDefault(); public void SetTopmost(bool value) { From b7a42d96d2b6802ffbc6659884a99902b82b63bf Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Thu, 19 Sep 2019 02:33:49 +0800 Subject: [PATCH 11/17] Do it the hackey way --- src/Avalonia.X11/X11Window.cs | 51 ++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 00761dfce8..707910b9a5 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/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) From 17c4c10404ca8d0d0c4edafa9394acd8fa824853 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 20 Sep 2019 15:57:40 +0100 Subject: [PATCH 12/17] fix unit test for window center location. --- tests/Avalonia.Controls.UnitTests/WindowTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index 75239f014f..d87014f646 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -271,8 +271,8 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Window_Should_Be_Centered_When_WindowStartupLocation_Is_CenterScreen() { - var screen1 = new Mock(new PixelRect(new PixelSize(1920, 1080)), new PixelRect(new PixelSize(1920, 1040)), true); - var screen2 = new Mock(new PixelRect(new PixelSize(1366, 768)), new PixelRect(new PixelSize(1366, 728)), false); + var screen1 = new Mock(1.0, new PixelRect(new PixelSize(1920, 1080)), new PixelRect(new PixelSize(1920, 1040)), true); + var screen2 = new Mock(1.0, new PixelRect(new PixelSize(1366, 768)), new PixelRect(new PixelSize(1366, 728)), false); var screens = new Mock(); screens.Setup(x => x.AllScreens).Returns(new Screen[] { screen1.Object, screen2.Object }); From 290410b2962756f9fac6bc2695c9046c799e6fc8 Mon Sep 17 00:00:00 2001 From: Jumar Macato Date: Fri, 20 Sep 2019 23:18:22 +0800 Subject: [PATCH 13/17] Revert "Do it the hackey way" This reverts commit b7a42d96d2b6802ffbc6659884a99902b82b63bf. --- src/Avalonia.X11/X11Window.cs | 51 +++++++++-------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 707910b9a5..00761dfce8 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -42,7 +42,6 @@ namespace Avalonia.X11 private X11Window _transientParent; private double? _scalingOverride; public object SyncRoot { get; } = new object(); - private int defaultWidth = 300, defaultHeight = 200; class InputEventContainer { @@ -99,6 +98,17 @@ 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, @@ -116,7 +126,7 @@ namespace Avalonia.X11 _renderHandle = _handle; Handle = new PlatformHandle(_handle, "XID"); - _realSize = new PixelSize(defaultWidth, defaultHeight); + _realSize = new PixelSize(300, 200); platform.Windows[_handle] = OnEvent; XEventMask ignoredMask = XEventMask.SubstructureRedirectMask | XEventMask.ResizeRedirectMask @@ -157,21 +167,8 @@ 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; @@ -384,23 +381,7 @@ 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(() => @@ -784,12 +765,6 @@ 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; @@ -807,8 +782,6 @@ namespace Avalonia.X11 _realSize = pixelSize; Resized?.Invoke(ClientSize); } - - } public void CanResize(bool value) From 7ac9475d33231dd05af170cc1f943c3b528e2509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josua=20J=C3=A4ger?= Date: Fri, 20 Sep 2019 17:23:30 +0200 Subject: [PATCH 14/17] Update ProgressBar.xaml --- src/Avalonia.Themes.Default/ProgressBar.xaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Avalonia.Themes.Default/ProgressBar.xaml b/src/Avalonia.Themes.Default/ProgressBar.xaml index a77a2f3ad5..72271e785a 100644 --- a/src/Avalonia.Themes.Default/ProgressBar.xaml +++ b/src/Avalonia.Themes.Default/ProgressBar.xaml @@ -7,9 +7,7 @@ - + From 08c7b70497a55a59541019df1d10305fc63f7ca8 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 20 Sep 2019 17:48:45 +0100 Subject: [PATCH 15/17] allow TranslateSize and Point to be overriden. --- .../PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs b/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs index bb701da651..0647020b12 100644 --- a/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs +++ b/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs @@ -43,8 +43,8 @@ namespace Avalonia.Controls.Primitives.PopupPositioning _moveResize(new PixelPoint((int)devicePoint.X, (int)devicePoint.Y), virtualSize, _parent.Scaling); } - public Point TranslatePoint(Point pt) => pt * _parent.Scaling; + public virtual Point TranslatePoint(Point pt) => pt * _parent.Scaling; - public Size TranslateSize(Size size) => size * _parent.Scaling; + public virtual Size TranslateSize(Size size) => size * _parent.Scaling; } } From af88b38bef15ee98bd9a8f3408932f4e37564375 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 20 Sep 2019 17:54:34 +0100 Subject: [PATCH 16/17] fix osx popup positioning. --- src/Avalonia.Native/AvaloniaNativePlatform.cs | 1 - ...OsxManagedPopupPositionerPopupImplHelper.cs | 18 ++++++++++++++++++ src/Avalonia.Native/PopupImpl.cs | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 src/Avalonia.Native/OsxManagedPopupPositionerPopupImplHelper.cs diff --git a/src/Avalonia.Native/AvaloniaNativePlatform.cs b/src/Avalonia.Native/AvaloniaNativePlatform.cs index 0da97b915c..6d48ab3829 100644 --- a/src/Avalonia.Native/AvaloniaNativePlatform.cs +++ b/src/Avalonia.Native/AvaloniaNativePlatform.cs @@ -1,7 +1,6 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; -using System.Diagnostics.Contracts; using System.Runtime.InteropServices; using Avalonia.Controls.Platform; using Avalonia.Input; diff --git a/src/Avalonia.Native/OsxManagedPopupPositionerPopupImplHelper.cs b/src/Avalonia.Native/OsxManagedPopupPositionerPopupImplHelper.cs new file mode 100644 index 0000000000..6c98e3c0cc --- /dev/null +++ b/src/Avalonia.Native/OsxManagedPopupPositionerPopupImplHelper.cs @@ -0,0 +1,18 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. +using Avalonia.Controls.Primitives.PopupPositioning; +using Avalonia.Platform; + +namespace Avalonia.Native +{ + class OsxManagedPopupPositionerPopupImplHelper : ManagedPopupPositionerPopupImplHelper + { + public OsxManagedPopupPositionerPopupImplHelper(IWindowBaseImpl parent, MoveResizeDelegate moveResize) : base(parent, moveResize) + { + + } + public override Point TranslatePoint(Point pt) => pt; + + public override Size TranslateSize(Size size) => size; + } +} diff --git a/src/Avalonia.Native/PopupImpl.cs b/src/Avalonia.Native/PopupImpl.cs index f776ee0132..d7fa1052ff 100644 --- a/src/Avalonia.Native/PopupImpl.cs +++ b/src/Avalonia.Native/PopupImpl.cs @@ -22,7 +22,7 @@ namespace Avalonia.Native { Init(factory.CreatePopup(e), factory.CreateScreens()); } - PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(parent, MoveResize)); + PopupPositioner = new ManagedPopupPositioner(new OsxManagedPopupPositionerPopupImplHelper(parent, MoveResize)); } private void MoveResize(PixelPoint position, Size size, double scaling) From e0f3651cba281e5b42ea09b6575c60e2d3df1fd5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 20 Sep 2019 18:14:10 +0100 Subject: [PATCH 17/17] fix bottom right corner on osx. --- .../PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs b/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs index 0647020b12..8e7e429a73 100644 --- a/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs +++ b/src/Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs @@ -32,7 +32,7 @@ namespace Avalonia.Controls.Primitives.PopupPositioning { // Popup positioner operates with abstract coordinates, but in our case they are pixel ones var point = _parent.PointToScreen(default); - var size = PixelSize.FromSize(_parent.ClientSize, _parent.Scaling); + var size = TranslateSize(_parent.ClientSize); return new Rect(point.X, point.Y, size.Width, size.Height); }