Browse Source

Added Window.ShowActive for win32.

pull/5063/head
Steven Kirk 6 years ago
parent
commit
ea90f05f83
  1. 4
      src/Avalonia.Controls/Platform/IWindowBaseImpl.cs
  2. 20
      src/Avalonia.Controls/Window.cs
  3. 2
      src/Avalonia.Controls/WindowBase.cs
  4. 2
      src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs
  5. 2
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  6. 7
      src/Avalonia.Headless/HeadlessWindowImpl.cs
  7. 2
      src/Avalonia.X11/X11Window.cs
  8. 3
      src/Windows/Avalonia.Win32/PopupImpl.cs
  9. 2
      src/Windows/Avalonia.Win32/Win32Platform.cs
  10. 14
      src/Windows/Avalonia.Win32/WindowImpl.cs
  11. 16
      tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs
  12. 2
      tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs
  13. 2
      tests/Avalonia.UnitTests/MockWindowingPlatform.cs

4
src/Avalonia.Controls/Platform/IWindowBaseImpl.cs

@ -5,9 +5,9 @@ namespace Avalonia.Platform
public interface IWindowBaseImpl : ITopLevelImpl public interface IWindowBaseImpl : ITopLevelImpl
{ {
/// <summary> /// <summary>
/// Shows the top level. /// Shows the window.
/// </summary> /// </summary>
void Show(); void Show(bool activate);
/// <summary> /// <summary>
/// Hides the window. /// Hides the window.

20
src/Avalonia.Controls/Window.cs

@ -129,6 +129,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty<SystemDecorations> SystemDecorationsProperty = public static readonly StyledProperty<SystemDecorations> SystemDecorationsProperty =
AvaloniaProperty.Register<Window, SystemDecorations>(nameof(SystemDecorations), SystemDecorations.Full); AvaloniaProperty.Register<Window, SystemDecorations>(nameof(SystemDecorations), SystemDecorations.Full);
/// <summary>
/// Defines the <see cref="ShowActivated"/> property.
/// </summary>
public static readonly StyledProperty<bool> ShowActivatedProperty =
AvaloniaProperty.Register<Window, bool>(nameof(ShowActivated), true);
/// <summary> /// <summary>
/// Enables or disables the taskbar icon /// Enables or disables the taskbar icon
/// </summary> /// </summary>
@ -352,13 +358,21 @@ namespace Avalonia.Controls
/// <summary> /// <summary>
/// Sets the system decorations (title bar, border, etc) /// Sets the system decorations (title bar, border, etc)
/// </summary> /// </summary>
///
public SystemDecorations SystemDecorations public SystemDecorations SystemDecorations
{ {
get { return GetValue(SystemDecorationsProperty); } get { return GetValue(SystemDecorationsProperty); }
set { SetValue(SystemDecorationsProperty, value); } set { SetValue(SystemDecorationsProperty, value); }
} }
/// <summary>
/// Gets or sets a value that indicates whether a window is activated when first shown.
/// </summary>
public bool ShowActivated
{
get { return GetValue(ShowActivatedProperty); }
set { SetValue(ShowActivatedProperty, value); }
}
/// <summary> /// <summary>
/// Enables or disables the taskbar icon /// Enables or disables the taskbar icon
/// </summary> /// </summary>
@ -650,7 +664,7 @@ namespace Avalonia.Controls
Owner = parent; Owner = parent;
parent?.AddChild(this, false); parent?.AddChild(this, false);
PlatformImpl?.Show(); PlatformImpl?.Show(ShowActivated);
Renderer?.Start(); Renderer?.Start();
SetWindowStartupLocation(Owner?.PlatformImpl); SetWindowStartupLocation(Owner?.PlatformImpl);
} }
@ -720,7 +734,7 @@ namespace Avalonia.Controls
PlatformImpl?.SetParent(owner.PlatformImpl); PlatformImpl?.SetParent(owner.PlatformImpl);
Owner = owner; Owner = owner;
owner.AddChild(this, true); owner.AddChild(this, true);
PlatformImpl?.Show(); PlatformImpl?.Show(ShowActivated);
Renderer?.Start(); Renderer?.Start();

2
src/Avalonia.Controls/WindowBase.cs

@ -162,7 +162,7 @@ namespace Avalonia.Controls
LayoutManager.ExecuteInitialLayoutPass(); LayoutManager.ExecuteInitialLayoutPass();
_hasExecutedInitialLayoutPass = true; _hasExecutedInitialLayoutPass = true;
} }
PlatformImpl?.Show(); PlatformImpl?.Show(true);
Renderer?.Start(); Renderer?.Start();
OnOpened(EventArgs.Empty); OnOpened(EventArgs.Empty);
} }

2
src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs

@ -20,7 +20,7 @@ namespace Avalonia.DesignerSupport.Remote
ClientSize = new Size(1, 1); ClientSize = new Size(1, 1);
} }
public void Show() public void Show(bool activate)
{ {
} }

2
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@ -77,7 +77,7 @@ namespace Avalonia.DesignerSupport.Remote
{ {
} }
public void Show() public void Show(bool activate)
{ {
} }

7
src/Avalonia.Headless/HeadlessWindowImpl.cs

@ -75,9 +75,10 @@ namespace Avalonia.Headless
public Action Closed { get; set; } public Action Closed { get; set; }
public IMouseDevice MouseDevice { get; } public IMouseDevice MouseDevice { get; }
public void Show() public void Show(bool activate)
{ {
Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input); if (activate)
Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input);
} }
public void Hide() public void Hide()
@ -148,7 +149,7 @@ namespace Avalonia.Headless
public void ShowDialog(IWindowImpl parent) public void ShowDialog(IWindowImpl parent)
{ {
Show(); Show(true);
} }
public void SetSystemDecorations(bool enabled) public void SetSystemDecorations(bool enabled)

2
src/Avalonia.X11/X11Window.cs

@ -815,7 +815,7 @@ namespace Avalonia.X11
XSetTransientForHint(_x11.Display, _handle, parent.Handle.Handle); XSetTransientForHint(_x11.Display, _handle, parent.Handle.Handle);
} }
public void Show() public void Show(bool activate)
{ {
_wasMappedAtLeastOnce = true; _wasMappedAtLeastOnce = true;
XMapWindow(_x11.Display, _handle); XMapWindow(_x11.Display, _handle);

3
src/Windows/Avalonia.Win32/PopupImpl.cs

@ -17,8 +17,9 @@ namespace Avalonia.Win32
[ThreadStatic] [ThreadStatic]
private static IntPtr s_parentHandle; private static IntPtr s_parentHandle;
public override void Show() public override void Show(bool activate)
{ {
// Popups are always shown non-activated.
UnmanagedMethods.ShowWindow(Handle.Handle, UnmanagedMethods.ShowWindowCommand.ShowNoActivate); UnmanagedMethods.ShowWindow(Handle.Handle, UnmanagedMethods.ShowWindowCommand.ShowNoActivate);
// We need to steal focus if it's held by a child window of our toplevel window // We need to steal focus if it's held by a child window of our toplevel window

2
src/Windows/Avalonia.Win32/Win32Platform.cs

@ -229,7 +229,7 @@ namespace Avalonia.Win32
public IWindowImpl CreateEmbeddableWindow() public IWindowImpl CreateEmbeddableWindow()
{ {
var embedded = new EmbeddedWindowImpl(); var embedded = new EmbeddedWindowImpl();
embedded.Show(); embedded.Show(true);
return embedded; return embedded;
} }

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

@ -240,7 +240,7 @@ namespace Avalonia.Win32
{ {
if (IsWindowVisible(_hwnd)) if (IsWindowVisible(_hwnd))
{ {
ShowWindow(value); ShowWindow(value, true);
} }
else else
{ {
@ -550,10 +550,11 @@ namespace Avalonia.Win32
UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide); UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide);
} }
public virtual void Show() public virtual void Show(bool activate)
{ {
SetWindowLongPtr(_hwnd, (int)WindowLongParam.GWL_HWNDPARENT, _parent != null ? _parent._hwnd : IntPtr.Zero); SetWindowLongPtr(_hwnd, (int)WindowLongParam.GWL_HWNDPARENT, _parent != null ? _parent._hwnd : IntPtr.Zero);
ShowWindow(_showWindowState);
ShowWindow(_showWindowState, activate);
} }
public Action GotInputWhenDisabled { get; set; } public Action GotInputWhenDisabled { get; set; }
@ -891,7 +892,7 @@ namespace Avalonia.Win32
ExtendClientAreaToDecorationsChanged?.Invoke(_isClientAreaExtended); ExtendClientAreaToDecorationsChanged?.Invoke(_isClientAreaExtended);
} }
private void ShowWindow(WindowState state) private void ShowWindow(WindowState state, bool activate)
{ {
ShowWindowCommand? command; ShowWindowCommand? command;
@ -901,7 +902,7 @@ namespace Avalonia.Win32
{ {
case WindowState.Minimized: case WindowState.Minimized:
newWindowProperties.IsFullScreen = false; newWindowProperties.IsFullScreen = false;
command = ShowWindowCommand.Minimize; command = activate ? ShowWindowCommand.Minimize : ShowWindowCommand.ShowMinNoActive;
break; break;
case WindowState.Maximized: case WindowState.Maximized:
newWindowProperties.IsFullScreen = false; newWindowProperties.IsFullScreen = false;
@ -910,7 +911,8 @@ namespace Avalonia.Win32
case WindowState.Normal: case WindowState.Normal:
newWindowProperties.IsFullScreen = false; newWindowProperties.IsFullScreen = false;
command = ShowWindowCommand.Restore; command = IsWindowVisible(_hwnd) ? ShowWindowCommand.Restore :
activate ? ShowWindowCommand.Normal : ShowWindowCommand.ShowNoActivate;
break; break;
case WindowState.FullScreen: case WindowState.FullScreen:

16
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

@ -79,7 +79,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show()).Verifiable(); popupImpl.Setup(x => x.Show(true)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); popupImpl.Setup(x => x.Hide()).Verifiable();
var sut = new ContextMenu(); var sut = new ContextMenu();
@ -99,7 +99,7 @@ namespace Avalonia.Controls.UnitTests
_mouse.Click(target); _mouse.Click(target);
Assert.False(sut.IsOpen); Assert.False(sut.IsOpen);
popupImpl.Verify(x => x.Show(), Times.Once); popupImpl.Verify(x => x.Show(true), Times.Once);
popupImpl.Verify(x => x.Hide(), Times.Once); popupImpl.Verify(x => x.Hide(), Times.Once);
} }
} }
@ -109,7 +109,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show()).Verifiable(); popupImpl.Setup(x => x.Show(true)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); popupImpl.Setup(x => x.Hide()).Verifiable();
var sut = new ContextMenu(); var sut = new ContextMenu();
@ -130,7 +130,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(sut.IsOpen); Assert.True(sut.IsOpen);
popupImpl.Verify(x => x.Hide(), Times.Once); popupImpl.Verify(x => x.Hide(), Times.Once);
popupImpl.Verify(x => x.Show(), Times.Exactly(2)); popupImpl.Verify(x => x.Show(true), Times.Exactly(2));
} }
} }
@ -177,7 +177,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show()).Verifiable(); popupImpl.Setup(x => x.Show(true)).Verifiable();
bool eventCalled = false; bool eventCalled = false;
var sut = new ContextMenu(); var sut = new ContextMenu();
@ -193,7 +193,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(eventCalled); Assert.True(eventCalled);
Assert.False(sut.IsOpen); Assert.False(sut.IsOpen);
popupImpl.Verify(x => x.Show(), Times.Never); popupImpl.Verify(x => x.Show(true), Times.Never);
} }
} }
@ -297,7 +297,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show()).Verifiable(); popupImpl.Setup(x => x.Show(true)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); popupImpl.Setup(x => x.Hide()).Verifiable();
bool eventCalled = false; bool eventCalled = false;
@ -321,7 +321,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(eventCalled); Assert.True(eventCalled);
Assert.True(sut.IsOpen); Assert.True(sut.IsOpen);
popupImpl.Verify(x => x.Show(), Times.Once()); popupImpl.Verify(x => x.Show(true), Times.Once());
popupImpl.Verify(x => x.Hide(), Times.Never); popupImpl.Verify(x => x.Hide(), Times.Never);
} }
} }

2
tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs

@ -137,7 +137,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestWindowBase(windowImpl.Object); var target = new TestWindowBase(windowImpl.Object);
target.IsVisible = true; target.IsVisible = true;
windowImpl.Verify(x => x.Show()); windowImpl.Verify(x => x.Show(true));
} }
} }

2
tests/Avalonia.UnitTests/MockWindowingPlatform.cs

@ -58,7 +58,7 @@ namespace Avalonia.UnitTests
windowImpl.Object.Resized?.Invoke(clientSize); windowImpl.Object.Resized?.Invoke(clientSize);
}); });
windowImpl.Setup(x => x.Show()).Callback(() => windowImpl.Setup(x => x.Show(true)).Callback(() =>
{ {
windowImpl.Object.Activated?.Invoke(); windowImpl.Object.Activated?.Invoke();
}); });

Loading…
Cancel
Save