Browse Source

Merge pull request #10265 from AvaloniaUI/fixes/macos-noresize-fullscreen

Various macOS and win32 fixes
pull/10341/head
Steven Kirk 4 years ago
committed by GitHub
parent
commit
01e3062dc0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      native/Avalonia.Native/src/OSX/AvnWindow.mm
  2. 2
      native/Avalonia.Native/src/OSX/PopupImpl.mm
  3. 5
      native/Avalonia.Native/src/OSX/WindowBaseImpl.h
  4. 29
      native/Avalonia.Native/src/OSX/WindowBaseImpl.mm
  5. 6
      native/Avalonia.Native/src/OSX/WindowImpl.h
  6. 101
      native/Avalonia.Native/src/OSX/WindowImpl.mm
  7. 1
      samples/IntegrationTestApp/MainWindow.axaml
  8. 2
      samples/IntegrationTestApp/MainWindow.axaml.cs
  9. 15
      src/Windows/Avalonia.Win32/WindowImpl.cs
  10. 52
      tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
  11. 38
      tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

17
native/Avalonia.Native/src/OSX/AvnWindow.mm

@ -223,6 +223,19 @@
} }
} }
// From chromium:
//
// > The delegate or the window class should implement this method so that
// > -[NSWindow isZoomed] can be then determined by whether or not the current
// > window frame is equal to the zoomed frame.
//
// If we don't implement this, then isZoomed always returns true for a non-
// resizable window ¯\_(ツ)_/¯
- (NSRect)windowWillUseStandardFrame:(NSWindow*)window
defaultFrame:(NSRect)newFrame {
return newFrame;
}
-(BOOL)canBecomeKeyWindow -(BOOL)canBecomeKeyWindow
{ {
if(_canBecomeKeyWindow) if(_canBecomeKeyWindow)
@ -261,10 +274,6 @@
-(void) setEnabled:(bool)enable -(void) setEnabled:(bool)enable
{ {
_isEnabled = enable; _isEnabled = enable;
[[self standardWindowButton:NSWindowCloseButton] setEnabled:enable];
[[self standardWindowButton:NSWindowMiniaturizeButton] setEnabled:enable];
[[self standardWindowButton:NSWindowZoomButton] setEnabled:enable];
} }
-(void)becomeKeyWindow -(void)becomeKeyWindow

2
native/Avalonia.Native/src/OSX/PopupImpl.mm

@ -29,7 +29,7 @@ private:
[Window setLevel:NSPopUpMenuWindowLevel]; [Window setLevel:NSPopUpMenuWindowLevel];
} }
protected: protected:
virtual NSWindowStyleMask GetStyle() override virtual NSWindowStyleMask CalculateStyleMask() override
{ {
return NSWindowStyleMaskBorderless; return NSWindowStyleMaskBorderless;
} }

5
native/Avalonia.Native/src/OSX/WindowBaseImpl.h

@ -105,9 +105,8 @@ BEGIN_INTERFACE_MAP()
virtual void BringToFront (); virtual void BringToFront ();
protected: protected:
virtual NSWindowStyleMask GetStyle(); virtual NSWindowStyleMask CalculateStyleMask() = 0;
virtual void UpdateStyle();
void UpdateStyle();
private: private:
void CreateNSWindow (bool isDialog); void CreateNSWindow (bool isDialog);

29
native/Avalonia.Native/src/OSX/WindowBaseImpl.mm

@ -35,18 +35,14 @@ WindowBaseImpl::WindowBaseImpl(IAvnWindowBaseEvents *events, IAvnGlContext *gl,
lastSize = NSSize { 100, 100 }; lastSize = NSSize { 100, 100 };
lastMaxSize = NSSize { CGFLOAT_MAX, CGFLOAT_MAX}; lastMaxSize = NSSize { CGFLOAT_MAX, CGFLOAT_MAX};
lastMinSize = NSSize { 0, 0 }; lastMinSize = NSSize { 0, 0 };
lastMenu = nullptr; lastMenu = nullptr;
CreateNSWindow(usePanel); CreateNSWindow(usePanel);
[Window setContentView:StandardContainer]; [Window setContentView:StandardContainer];
[Window setStyleMask:NSWindowStyleMaskBorderless];
[Window setBackingType:NSBackingStoreBuffered]; [Window setBackingType:NSBackingStoreBuffered];
[Window setContentMinSize:lastMinSize]; [Window setContentMinSize:lastMinSize];
[Window setContentMaxSize:lastMaxSize]; [Window setContentMaxSize:lastMaxSize];
[Window setOpaque:false]; [Window setOpaque:false];
} }
@ -564,12 +560,8 @@ bool WindowBaseImpl::IsModal() {
return false; return false;
} }
NSWindowStyleMask WindowBaseImpl::GetStyle() {
return NSWindowStyleMaskBorderless;
}
void WindowBaseImpl::UpdateStyle() { void WindowBaseImpl::UpdateStyle() {
[Window setStyleMask:GetStyle()]; [Window setStyleMask:CalculateStyleMask()];
} }
void WindowBaseImpl::CleanNSWindow() { void WindowBaseImpl::CleanNSWindow() {
@ -580,21 +572,12 @@ void WindowBaseImpl::CleanNSWindow() {
} }
} }
void WindowBaseImpl::CreateNSWindow(bool isDialog) { void WindowBaseImpl::CreateNSWindow(bool usePanel) {
if (isDialog) { if (usePanel) {
if (![Window isKindOfClass:[AvnPanel class]]) { Window = [[AvnPanel alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:NSWindowStyleMaskBorderless];
CleanNSWindow(); [Window setHidesOnDeactivate:false];
Window = [[AvnPanel alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:GetStyle()];
[Window setHidesOnDeactivate:false];
}
} else { } else {
if (![Window isKindOfClass:[AvnWindow class]]) { Window = [[AvnWindow alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:NSWindowStyleMaskBorderless];
CleanNSWindow();
Window = [[AvnWindow alloc] initWithParent:this contentRect:NSRect{0, 0, lastSize} styleMask:GetStyle()];
}
} }
} }

6
native/Avalonia.Native/src/OSX/WindowImpl.h

@ -41,8 +41,6 @@ BEGIN_INTERFACE_MAP()
WindowImpl(IAvnWindowEvents* events, IAvnGlContext* gl); WindowImpl(IAvnWindowEvents* events, IAvnGlContext* gl);
void HideOrShowTrafficLights ();
virtual HRESULT Show (bool activate, bool isDialog) override; virtual HRESULT Show (bool activate, bool isDialog) override;
virtual HRESULT SetEnabled (bool enable) override; virtual HRESULT SetEnabled (bool enable) override;
@ -100,9 +98,11 @@ BEGIN_INTERFACE_MAP()
bool CanBecomeKeyWindow (); bool CanBecomeKeyWindow ();
protected: protected:
virtual NSWindowStyleMask GetStyle() override; virtual NSWindowStyleMask CalculateStyleMask() override;
void UpdateStyle () override;
private: private:
void ZOrderChildWindows();
void OnInitialiseNSWindow(); void OnInitialiseNSWindow();
NSString *_lastTitle; NSString *_lastTitle;
}; };

101
native/Avalonia.Native/src/OSX/WindowImpl.mm

@ -30,19 +30,6 @@ WindowImpl::WindowImpl(IAvnWindowEvents *events, IAvnGlContext *gl) : WindowBase
OnInitialiseNSWindow(); OnInitialiseNSWindow();
} }
void WindowImpl::HideOrShowTrafficLights() {
if (Window == nil) {
return;
}
bool wantsChrome = (_extendClientHints & AvnSystemChrome) || (_extendClientHints & AvnPreferSystemChrome);
bool hasTrafficLights = _isClientAreaExtended ? wantsChrome : _decorations == SystemDecorationsFull;
[[Window standardWindowButton:NSWindowCloseButton] setHidden:!hasTrafficLights];
[[Window standardWindowButton:NSWindowMiniaturizeButton] setHidden:!hasTrafficLights];
[[Window standardWindowButton:NSWindowZoomButton] setHidden:!hasTrafficLights];
}
void WindowImpl::OnInitialiseNSWindow(){ void WindowImpl::OnInitialiseNSWindow(){
[GetWindowProtocol() setCanBecomeKeyWindow:true]; [GetWindowProtocol() setCanBecomeKeyWindow:true];
@ -67,8 +54,6 @@ HRESULT WindowImpl::Show(bool activate, bool isDialog) {
WindowBaseImpl::Show(activate, isDialog); WindowBaseImpl::Show(activate, isDialog);
GetWindowState(&_actualWindowState); GetWindowState(&_actualWindowState);
HideOrShowTrafficLights();
return SetWindowState(_lastWindowState); return SetWindowState(_lastWindowState);
} }
} }
@ -134,14 +119,19 @@ void WindowImpl::BringToFront()
} }
[Window invalidateShadow]; [Window invalidateShadow];
ZOrderChildWindows();
}
}
void WindowImpl::ZOrderChildWindows()
{
for(auto iterator = _children.begin(); iterator != _children.end(); iterator++)
{
auto window = (*iterator)->Window;
for(auto iterator = _children.begin(); iterator != _children.end(); iterator++) // #9565: Only bring window to front if it's on the currently active space
{ if ([window isOnActiveSpace]) {
auto window = (*iterator)->Window; (*iterator)->BringToFront();
// #9565: Only bring window to front if it's on the currently active space
if ([window isOnActiveSpace])
(*iterator)->BringToFront();
} }
} }
} }
@ -161,13 +151,15 @@ bool WindowImpl::CanBecomeKeyWindow()
void WindowImpl::StartStateTransition() { void WindowImpl::StartStateTransition() {
_transitioningWindowState = true; _transitioningWindowState = true;
UpdateStyle();
} }
void WindowImpl::EndStateTransition() { void WindowImpl::EndStateTransition() {
_transitioningWindowState = false; _transitioningWindowState = false;
UpdateStyle();
// Ensure correct order of child windows after fullscreen transition. // Ensure correct order of child windows after fullscreen transition.
BringToFront(); ZOrderChildWindows();
} }
SystemDecorations WindowImpl::Decorations() { SystemDecorations WindowImpl::Decorations() {
@ -225,16 +217,12 @@ bool WindowImpl::IsZoomed() {
} }
void WindowImpl::DoZoom() { void WindowImpl::DoZoom() {
switch (_decorations) { if (_decorations == SystemDecorationsNone ||
case SystemDecorationsNone: _decorations == SystemDecorationsBorderOnly ||
case SystemDecorationsBorderOnly: _canResize == false) {
[Window setFrame:[Window screen].visibleFrame display:true]; [Window setFrame:[Window screen].visibleFrame display:true];
break; } else {
[Window performZoom:Window];
case SystemDecorationsFull:
[Window performZoom:Window];
break;
} }
} }
@ -261,8 +249,6 @@ HRESULT WindowImpl::SetDecorations(SystemDecorations value) {
UpdateStyle(); UpdateStyle();
HideOrShowTrafficLights();
switch (_decorations) { switch (_decorations) {
case SystemDecorationsNone: case SystemDecorationsNone:
[Window setHasShadow:NO]; [Window setHasShadow:NO];
@ -419,9 +405,6 @@ HRESULT WindowImpl::SetExtendClientArea(bool enable) {
} }
[GetWindowProtocol() setIsExtended:enable]; [GetWindowProtocol() setIsExtended:enable];
HideOrShowTrafficLights();
UpdateStyle(); UpdateStyle();
} }
@ -577,14 +560,16 @@ bool WindowImpl::IsOwned() {
return _parent != nullptr; return _parent != nullptr;
} }
NSWindowStyleMask WindowImpl::GetStyle() { NSWindowStyleMask WindowImpl::CalculateStyleMask() {
unsigned long s = NSWindowStyleMaskBorderless; // Use the current style mask and only clear the flags we're going to be modifying.
unsigned long s = [Window styleMask] &
~(NSWindowStyleMaskFullSizeContentView |
NSWindowStyleMaskTitled |
NSWindowStyleMaskClosable |
NSWindowStyleMaskResizable |
NSWindowStyleMaskMiniaturizable |
NSWindowStyleMaskTexturedBackground);
if(_actualWindowState == FullScreen)
{
s |= NSWindowStyleMaskFullScreen;
}
switch (_decorations) { switch (_decorations) {
case SystemDecorationsNone: case SystemDecorationsNone:
s = s | NSWindowStyleMaskFullSizeContentView; s = s | NSWindowStyleMaskFullSizeContentView;
@ -597,7 +582,7 @@ NSWindowStyleMask WindowImpl::GetStyle() {
case SystemDecorationsFull: case SystemDecorationsFull:
s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable; s = s | NSWindowStyleMaskTitled | NSWindowStyleMaskClosable;
if (_canResize && _isEnabled) { if ((_canResize && _isEnabled) || _transitioningWindowState) {
s = s | NSWindowStyleMaskResizable; s = s | NSWindowStyleMaskResizable;
} }
break; break;
@ -612,3 +597,25 @@ NSWindowStyleMask WindowImpl::GetStyle() {
} }
return s; return s;
} }
void WindowImpl::UpdateStyle() {
WindowBaseImpl::UpdateStyle();
if (Window == nil) {
return;
}
bool wantsChrome = (_extendClientHints & AvnSystemChrome) || (_extendClientHints & AvnPreferSystemChrome);
bool hasTrafficLights = _isClientAreaExtended ? wantsChrome : _decorations == SystemDecorationsFull;
NSButton* closeButton = [Window standardWindowButton:NSWindowCloseButton];
NSButton* miniaturizeButton = [Window standardWindowButton:NSWindowMiniaturizeButton];
NSButton* zoomButton = [Window standardWindowButton:NSWindowZoomButton];
[closeButton setHidden:!hasTrafficLights];
[closeButton setEnabled:_isEnabled];
[miniaturizeButton setHidden:!hasTrafficLights];
[miniaturizeButton setEnabled:_isEnabled];
[zoomButton setHidden:!hasTrafficLights];
[zoomButton setEnabled:_isEnabled && _canResize];
}

1
samples/IntegrationTestApp/MainWindow.axaml

@ -140,6 +140,7 @@
<ComboBoxItem Name="ShowWindowStateMaximized">Maximized</ComboBoxItem> <ComboBoxItem Name="ShowWindowStateMaximized">Maximized</ComboBoxItem>
<ComboBoxItem Name="ShowWindowStateFullScreen">FullScreen</ComboBoxItem> <ComboBoxItem Name="ShowWindowStateFullScreen">FullScreen</ComboBoxItem>
</ComboBox> </ComboBox>
<CheckBox Name="ShowWindowCanResize" IsChecked="True">Can Resize</CheckBox>
<Button Name="ShowWindow">Show Window</Button> <Button Name="ShowWindow">Show Window</Button>
<Button Name="SendToBack">Send to Back</Button> <Button Name="SendToBack">Send to Back</Button>
<Button Name="EnterFullscreen">Enter Fullscreen</Button> <Button Name="EnterFullscreen">Enter Fullscreen</Button>

2
samples/IntegrationTestApp/MainWindow.axaml.cs

@ -66,11 +66,13 @@ namespace IntegrationTestApp
var locationComboBox = this.GetControl<ComboBox>("ShowWindowLocation"); var locationComboBox = this.GetControl<ComboBox>("ShowWindowLocation");
var stateComboBox = this.GetControl<ComboBox>("ShowWindowState"); var stateComboBox = this.GetControl<ComboBox>("ShowWindowState");
var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null; var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null;
var canResizeCheckBox = this.GetControl<CheckBox>("ShowWindowCanResize");
var owner = (Window)this.GetVisualRoot()!; var owner = (Window)this.GetVisualRoot()!;
var window = new ShowWindowTest var window = new ShowWindowTest
{ {
WindowStartupLocation = (WindowStartupLocation)locationComboBox.SelectedIndex, WindowStartupLocation = (WindowStartupLocation)locationComboBox.SelectedIndex,
CanResize = canResizeCheckBox.IsChecked.Value,
}; };
if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime) if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime lifetime)

15
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -1182,8 +1182,21 @@ namespace Avalonia.Win32
var y = monitorInfo.rcWork.top; var y = monitorInfo.rcWork.top;
var cx = Math.Abs(monitorInfo.rcWork.right - x); var cx = Math.Abs(monitorInfo.rcWork.right - x);
var cy = Math.Abs(monitorInfo.rcWork.bottom - y); var cy = Math.Abs(monitorInfo.rcWork.bottom - y);
var style = (WindowStyles)GetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE);
SetWindowPos(_hwnd, WindowPosZOrder.HWND_NOTOPMOST, x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW); if (!style.HasFlag(WindowStyles.WS_SIZEFRAME))
{
// When calling SetWindowPos on a maximized window it automatically adjusts
// for "hidden" borders which are placed offscreen, EVEN IF THE WINDOW HAS
// NO BORDERS, meaning that the window is placed wrong when we have CanResize
// == false. Account for this here.
var borderThickness = BorderThickness;
x -= (int)borderThickness.Left;
cx += (int)borderThickness.Left + (int)borderThickness.Right;
cy += (int)borderThickness.Bottom;
}
SetWindowPos(_hwnd, WindowPosZOrder.HWND_NOTOPMOST, x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW | SetWindowPosFlags.SWP_FRAMECHANGED);
} }
} }
} }

52
tests/Avalonia.IntegrationTests.Appium/WindowTests.cs

@ -30,9 +30,9 @@ namespace Avalonia.IntegrationTests.Appium
[Theory] [Theory]
[MemberData(nameof(StartupLocationData))] [MemberData(nameof(StartupLocationData))]
public void StartupLocation(Size? size, ShowWindowMode mode, WindowStartupLocation location) public void StartupLocation(Size? size, ShowWindowMode mode, WindowStartupLocation location, bool canResize)
{ {
using var window = OpenWindow(size, mode, location); using var window = OpenWindow(size, mode, location, canResize: canResize);
var info = GetWindowInfo(); var info = GetWindowInfo();
if (size.HasValue) if (size.HasValue)
@ -63,9 +63,9 @@ namespace Avalonia.IntegrationTests.Appium
[Theory] [Theory]
[MemberData(nameof(WindowStateData))] [MemberData(nameof(WindowStateData))]
public void WindowState(Size? size, ShowWindowMode mode, WindowState state) public void WindowState(Size? size, ShowWindowMode mode, WindowState state, bool canResize)
{ {
using var window = OpenWindow(size, mode, state: state); using var window = OpenWindow(size, mode, state: state, canResize: canResize);
try try
{ {
@ -230,10 +230,10 @@ namespace Avalonia.IntegrationTests.Appium
Assert.Equal(new Rgba32(255, 0, 0), centerColor); Assert.Equal(new Rgba32(255, 0, 0), centerColor);
} }
public static TheoryData<Size?, ShowWindowMode, WindowStartupLocation> StartupLocationData() public static TheoryData<Size?, ShowWindowMode, WindowStartupLocation, bool> StartupLocationData()
{ {
var sizes = new Size?[] { null, new Size(400, 300) }; var sizes = new Size?[] { null, new Size(400, 300) };
var data = new TheoryData<Size?, ShowWindowMode, WindowStartupLocation>(); var data = new TheoryData<Size?, ShowWindowMode, WindowStartupLocation, bool>();
foreach (var size in sizes) foreach (var size in sizes)
{ {
@ -243,7 +243,8 @@ namespace Avalonia.IntegrationTests.Appium
{ {
if (!(location == WindowStartupLocation.CenterOwner && mode == ShowWindowMode.NonOwned)) if (!(location == WindowStartupLocation.CenterOwner && mode == ShowWindowMode.NonOwned))
{ {
data.Add(size, mode, location); data.Add(size, mode, location, true);
data.Add(size, mode, location, false);
} }
} }
} }
@ -252,10 +253,10 @@ namespace Avalonia.IntegrationTests.Appium
return data; return data;
} }
public static TheoryData<Size?, ShowWindowMode, WindowState> WindowStateData() public static TheoryData<Size?, ShowWindowMode, WindowState, bool> WindowStateData()
{ {
var sizes = new Size?[] { null, new Size(400, 300) }; var sizes = new Size?[] { null, new Size(400, 300) };
var data = new TheoryData<Size?, ShowWindowMode, WindowState>(); var data = new TheoryData<Size?, ShowWindowMode, WindowState, bool>();
foreach (var size in sizes) foreach (var size in sizes)
{ {
@ -273,7 +274,8 @@ namespace Avalonia.IntegrationTests.Appium
mode != ShowWindowMode.NonOwned) mode != ShowWindowMode.NonOwned)
continue; continue;
data.Add(size, mode, state); data.Add(size, mode, state, true);
data.Add(size, mode, state, false);
} }
} }
} }
@ -311,25 +313,39 @@ namespace Avalonia.IntegrationTests.Appium
Size? size, Size? size,
ShowWindowMode mode, ShowWindowMode mode,
WindowStartupLocation location = WindowStartupLocation.Manual, WindowStartupLocation location = WindowStartupLocation.Manual,
WindowState state = Controls.WindowState.Normal) WindowState state = Controls.WindowState.Normal,
bool canResize = true)
{ {
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize"); var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode"); var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation"); var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
var stateComboBox = _session.FindElementByAccessibilityId("ShowWindowState"); var stateComboBox = _session.FindElementByAccessibilityId("ShowWindowState");
var canResizeCheckBox = _session.FindElementByAccessibilityId("ShowWindowCanResize");
var showButton = _session.FindElementByAccessibilityId("ShowWindow"); var showButton = _session.FindElementByAccessibilityId("ShowWindow");
if (size.HasValue) if (size.HasValue)
sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}"); sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}");
modeComboBox.Click(); if (modeComboBox.GetComboBoxValue() != mode.ToString())
_session.FindElementByName(mode.ToString()).SendClick(); {
modeComboBox.Click();
_session.FindElementByName(mode.ToString()).SendClick();
}
if (locationComboBox.GetComboBoxValue() != location.ToString())
{
locationComboBox.Click();
_session.FindElementByName(location.ToString()).SendClick();
}
locationComboBox.Click(); if (stateComboBox.GetComboBoxValue() != state.ToString())
_session.FindElementByName(location.ToString()).SendClick(); {
stateComboBox.Click();
_session.FindElementByAccessibilityId($"ShowWindowState{state}").SendClick();
}
stateComboBox.Click(); if (canResizeCheckBox.GetIsChecked() != canResize)
_session.FindElementByAccessibilityId($"ShowWindowState{state}").SendClick(); canResizeCheckBox.Click();
return showButton.OpenWindowWithClick(); return showButton.OpenWindowWithClick();
} }

38
tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

@ -323,21 +323,49 @@ namespace Avalonia.IntegrationTests.Appium
secondaryWindow.GetChromeButtons().close.Click(); secondaryWindow.GetChromeButtons().close.Click();
} }
private IDisposable OpenWindow(PixelSize? size, ShowWindowMode mode, WindowStartupLocation location) [PlatformTheory(TestPlatforms.MacOS)]
[InlineData(ShowWindowMode.NonOwned)]
[InlineData(ShowWindowMode.Owned)]
[InlineData(ShowWindowMode.Modal)]
public void Window_Has_Disabled_Zoom_Button_When_CanResize_Is_False(ShowWindowMode mode)
{
using (OpenWindow(null, mode, WindowStartupLocation.Manual, canResize: false))
{
var secondaryWindow = GetWindow("SecondaryWindow");
var (_, _, zoomButton) = secondaryWindow.GetChromeButtons();
Assert.False(zoomButton.Enabled);
}
}
private IDisposable OpenWindow(
PixelSize? size,
ShowWindowMode mode,
WindowStartupLocation location,
bool canResize = true)
{ {
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize"); var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode"); var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation"); var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
var canResizeCheckBox = _session.FindElementByAccessibilityId("ShowWindowCanResize");
var showButton = _session.FindElementByAccessibilityId("ShowWindow"); var showButton = _session.FindElementByAccessibilityId("ShowWindow");
if (size.HasValue) if (size.HasValue)
sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}"); sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}");
modeComboBox.Click(); if (modeComboBox.GetComboBoxValue() != mode.ToString())
_session.FindElementByName(mode.ToString()).SendClick(); {
modeComboBox.Click();
_session.FindElementByName(mode.ToString()).SendClick();
}
locationComboBox.Click(); if (locationComboBox.GetComboBoxValue() != location.ToString())
_session.FindElementByName(location.ToString()).SendClick(); {
locationComboBox.Click();
_session.FindElementByName(location.ToString()).SendClick();
}
if (canResizeCheckBox.GetIsChecked() != canResize)
canResizeCheckBox.Click();
return showButton.OpenWindowWithClick(); return showButton.OpenWindowWithClick();
} }

Loading…
Cancel
Save