Browse Source

Cleanup even more.

pull/3705/head
Dariusz Komosinski 7 years ago
parent
commit
0d5af630f9
  1. 104
      src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs
  2. 76
      src/Windows/Avalonia.Win32/WindowImpl.cs

104
src/Windows/Avalonia.Win32/WindowImpl.WndProc.cs

@ -26,31 +26,40 @@ namespace Avalonia.Win32
switch ((WindowsMessage)msg) switch ((WindowsMessage)msg)
{ {
case WindowsMessage.WM_ACTIVATE: case WindowsMessage.WM_ACTIVATE:
{
var wa = (WindowActivate)(ToInt32(wParam) & 0xffff); var wa = (WindowActivate)(ToInt32(wParam) & 0xffff);
switch (wa) switch (wa)
{ {
case WindowActivate.WA_ACTIVE: case WindowActivate.WA_ACTIVE:
case WindowActivate.WA_CLICKACTIVE: case WindowActivate.WA_CLICKACTIVE:
{
Activated?.Invoke(); Activated?.Invoke();
break; break;
}
case WindowActivate.WA_INACTIVE: case WindowActivate.WA_INACTIVE:
{
Deactivated?.Invoke(); Deactivated?.Invoke();
break; break;
}
} }
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_NCCALCSIZE: case WindowsMessage.WM_NCCALCSIZE:
{
if (ToInt32(wParam) == 1 && !HasFullDecorations) if (ToInt32(wParam) == 1 && !HasFullDecorations)
{ {
return IntPtr.Zero; return IntPtr.Zero;
} }
break; break;
}
case WindowsMessage.WM_CLOSE: case WindowsMessage.WM_CLOSE:
{
bool? preventClosing = Closing?.Invoke(); bool? preventClosing = Closing?.Invoke();
if (preventClosing == true) if (preventClosing == true)
{ {
@ -58,13 +67,16 @@ namespace Avalonia.Win32
} }
break; break;
}
case WindowsMessage.WM_DESTROY: case WindowsMessage.WM_DESTROY:
{
//Window doesn't exist anymore //Window doesn't exist anymore
_hwnd = IntPtr.Zero; _hwnd = IntPtr.Zero;
//Remove root reference to this class, so unmanaged delegate can be collected //Remove root reference to this class, so unmanaged delegate can be collected
s_instances.Remove(this); s_instances.Remove(this);
Closed?.Invoke(); Closed?.Invoke();
if (_parent != null) if (_parent != null)
{ {
_parent._disabledBy.Remove(this); _parent._disabledBy.Remove(this);
@ -76,8 +88,10 @@ namespace Avalonia.Win32
//Free other resources //Free other resources
Dispose(); Dispose();
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_DPICHANGED: case WindowsMessage.WM_DPICHANGED:
{
var dpi = ToInt32(wParam) & 0xffff; var dpi = ToInt32(wParam) & 0xffff;
var newDisplayRect = Marshal.PtrToStructure<RECT>(lParam); var newDisplayRect = Marshal.PtrToStructure<RECT>(lParam);
_scaling = dpi / 96.0; _scaling = dpi / 96.0;
@ -91,9 +105,11 @@ namespace Avalonia.Win32
SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOZORDER |
SetWindowPosFlags.SWP_NOACTIVATE); SetWindowPosFlags.SWP_NOACTIVATE);
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_KEYDOWN: case WindowsMessage.WM_KEYDOWN:
case WindowsMessage.WM_SYSKEYDOWN: case WindowsMessage.WM_SYSKEYDOWN:
{
e = new RawKeyEventArgs( e = new RawKeyEventArgs(
WindowsKeyboardDevice.Instance, WindowsKeyboardDevice.Instance,
timestamp, timestamp,
@ -102,13 +118,17 @@ namespace Avalonia.Win32
KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)), KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)),
WindowsKeyboardDevice.Instance.Modifiers); WindowsKeyboardDevice.Instance.Modifiers);
break; break;
}
case WindowsMessage.WM_MENUCHAR: case WindowsMessage.WM_MENUCHAR:
{
// mute the system beep // mute the system beep
return (IntPtr)((Int32)MenuCharParam.MNC_CLOSE << 16); return (IntPtr)((int)MenuCharParam.MNC_CLOSE << 16);
}
case WindowsMessage.WM_KEYUP: case WindowsMessage.WM_KEYUP:
case WindowsMessage.WM_SYSKEYUP: case WindowsMessage.WM_SYSKEYUP:
{
e = new RawKeyEventArgs( e = new RawKeyEventArgs(
WindowsKeyboardDevice.Instance, WindowsKeyboardDevice.Instance,
timestamp, timestamp,
@ -117,7 +137,9 @@ namespace Avalonia.Win32
KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)), KeyInterop.KeyFromVirtualKey(ToInt32(wParam), ToInt32(lParam)),
WindowsKeyboardDevice.Instance.Modifiers); WindowsKeyboardDevice.Instance.Modifiers);
break; break;
}
case WindowsMessage.WM_CHAR: case WindowsMessage.WM_CHAR:
{
// Ignore control chars // Ignore control chars
if (ToInt32(wParam) >= 32) if (ToInt32(wParam) >= 32)
{ {
@ -126,13 +148,18 @@ namespace Avalonia.Win32
} }
break; break;
}
case WindowsMessage.WM_LBUTTONDOWN: case WindowsMessage.WM_LBUTTONDOWN:
case WindowsMessage.WM_RBUTTONDOWN: case WindowsMessage.WM_RBUTTONDOWN:
case WindowsMessage.WM_MBUTTONDOWN: case WindowsMessage.WM_MBUTTONDOWN:
case WindowsMessage.WM_XBUTTONDOWN: case WindowsMessage.WM_XBUTTONDOWN:
{
if (ShouldIgnoreTouchEmulatedMessage()) if (ShouldIgnoreTouchEmulatedMessage())
{
break; break;
}
e = new RawPointerEventArgs( e = new RawPointerEventArgs(
_mouseDevice, _mouseDevice,
timestamp, timestamp,
@ -149,13 +176,18 @@ namespace Avalonia.Win32
}, },
DipFromLParam(lParam), GetMouseModifiers(wParam)); DipFromLParam(lParam), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_LBUTTONUP: case WindowsMessage.WM_LBUTTONUP:
case WindowsMessage.WM_RBUTTONUP: case WindowsMessage.WM_RBUTTONUP:
case WindowsMessage.WM_MBUTTONUP: case WindowsMessage.WM_MBUTTONUP:
case WindowsMessage.WM_XBUTTONUP: case WindowsMessage.WM_XBUTTONUP:
{
if (ShouldIgnoreTouchEmulatedMessage()) if (ShouldIgnoreTouchEmulatedMessage())
{
break; break;
}
e = new RawPointerEventArgs( e = new RawPointerEventArgs(
_mouseDevice, _mouseDevice,
timestamp, timestamp,
@ -172,10 +204,15 @@ namespace Avalonia.Win32
}, },
DipFromLParam(lParam), GetMouseModifiers(wParam)); DipFromLParam(lParam), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_MOUSEMOVE: case WindowsMessage.WM_MOUSEMOVE:
{
if (ShouldIgnoreTouchEmulatedMessage()) if (ShouldIgnoreTouchEmulatedMessage())
{
break; break;
}
if (!_trackingMouse) if (!_trackingMouse)
{ {
var tm = new TRACKMOUSEEVENT var tm = new TRACKMOUSEEVENT
@ -197,8 +234,10 @@ namespace Avalonia.Win32
DipFromLParam(lParam), GetMouseModifiers(wParam)); DipFromLParam(lParam), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_MOUSEWHEEL: case WindowsMessage.WM_MOUSEWHEEL:
{
e = new RawMouseWheelEventArgs( e = new RawMouseWheelEventArgs(
_mouseDevice, _mouseDevice,
timestamp, timestamp,
@ -206,8 +245,10 @@ namespace Avalonia.Win32
PointToClient(PointFromLParam(lParam)), PointToClient(PointFromLParam(lParam)),
new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), GetMouseModifiers(wParam)); new Vector(0, (ToInt32(wParam) >> 16) / wheelDelta), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_MOUSEHWHEEL: case WindowsMessage.WM_MOUSEHWHEEL:
{
e = new RawMouseWheelEventArgs( e = new RawMouseWheelEventArgs(
_mouseDevice, _mouseDevice,
timestamp, timestamp,
@ -215,8 +256,10 @@ namespace Avalonia.Win32
PointToClient(PointFromLParam(lParam)), PointToClient(PointFromLParam(lParam)),
new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), GetMouseModifiers(wParam)); new Vector(-(ToInt32(wParam) >> 16) / wheelDelta, 0), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_MOUSELEAVE: case WindowsMessage.WM_MOUSELEAVE:
{
_trackingMouse = false; _trackingMouse = false;
e = new RawPointerEventArgs( e = new RawPointerEventArgs(
_mouseDevice, _mouseDevice,
@ -225,11 +268,13 @@ namespace Avalonia.Win32
RawPointerEventType.LeaveWindow, RawPointerEventType.LeaveWindow,
new Point(-1, -1), WindowsKeyboardDevice.Instance.Modifiers); new Point(-1, -1), WindowsKeyboardDevice.Instance.Modifiers);
break; break;
}
case WindowsMessage.WM_NCLBUTTONDOWN: case WindowsMessage.WM_NCLBUTTONDOWN:
case WindowsMessage.WM_NCRBUTTONDOWN: case WindowsMessage.WM_NCRBUTTONDOWN:
case WindowsMessage.WM_NCMBUTTONDOWN: case WindowsMessage.WM_NCMBUTTONDOWN:
case WindowsMessage.WM_NCXBUTTONDOWN: case WindowsMessage.WM_NCXBUTTONDOWN:
{
e = new RawPointerEventArgs( e = new RawPointerEventArgs(
_mouseDevice, _mouseDevice,
timestamp, timestamp,
@ -247,14 +292,15 @@ namespace Avalonia.Win32
}, },
PointToClient(PointFromLParam(lParam)), GetMouseModifiers(wParam)); PointToClient(PointFromLParam(lParam)), GetMouseModifiers(wParam));
break; break;
}
case WindowsMessage.WM_TOUCH: case WindowsMessage.WM_TOUCH:
{
var touchInputCount = wParam.ToInt32(); var touchInputCount = wParam.ToInt32();
var pTouchInputs = stackalloc TOUCHINPUT[touchInputCount]; var pTouchInputs = stackalloc TOUCHINPUT[touchInputCount];
var touchInputs = new Span<TOUCHINPUT>(pTouchInputs, touchInputCount); var touchInputs = new Span<TOUCHINPUT>(pTouchInputs, touchInputCount);
if (GetTouchInputInfo(lParam, (uint)touchInputCount, pTouchInputs, if (GetTouchInputInfo(lParam, (uint)touchInputCount, pTouchInputs, Marshal.SizeOf<TOUCHINPUT>()))
Marshal.SizeOf<TOUCHINPUT>()))
{ {
foreach (var touchInput in touchInputs) foreach (var touchInput in touchInputs)
{ {
@ -275,27 +321,32 @@ namespace Avalonia.Win32
} }
break; break;
}
case WindowsMessage.WM_NCPAINT: case WindowsMessage.WM_NCPAINT:
{
if (!HasFullDecorations) if (!HasFullDecorations)
{ {
return IntPtr.Zero; return IntPtr.Zero;
} }
break; break;
}
case WindowsMessage.WM_NCACTIVATE: case WindowsMessage.WM_NCACTIVATE:
{
if (!HasFullDecorations) if (!HasFullDecorations)
{ {
return new IntPtr(1); return new IntPtr(1);
} }
break; break;
}
case WindowsMessage.WM_PAINT: case WindowsMessage.WM_PAINT:
{
using (_rendererLock.Lock()) using (_rendererLock.Lock())
{ {
PAINTSTRUCT ps; if (BeginPaint(_hwnd, out PAINTSTRUCT ps) != IntPtr.Zero)
if (BeginPaint(_hwnd, out ps) != IntPtr.Zero)
{ {
var f = Scaling; var f = Scaling;
var r = ps.rcPaint; var r = ps.rcPaint;
@ -306,8 +357,10 @@ namespace Avalonia.Win32
} }
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_SIZE: case WindowsMessage.WM_SIZE:
{
using (_rendererLock.Lock()) using (_rendererLock.Lock())
{ {
// Do nothing here, just block until the pending frame render is completed on the render thread // Do nothing here, just block until the pending frame render is completed on the render thread
@ -334,38 +387,52 @@ namespace Avalonia.Win32
} }
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_MOVE: case WindowsMessage.WM_MOVE:
{
PositionChanged?.Invoke(new PixelPoint((short)(ToInt32(lParam) & 0xffff), PositionChanged?.Invoke(new PixelPoint((short)(ToInt32(lParam) & 0xffff),
(short)(ToInt32(lParam) >> 16))); (short)(ToInt32(lParam) >> 16)));
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_GETMINMAXINFO: case WindowsMessage.WM_GETMINMAXINFO:
{
MINMAXINFO mmi = Marshal.PtrToStructure<MINMAXINFO>(lParam); MINMAXINFO mmi = Marshal.PtrToStructure<MINMAXINFO>(lParam);
if (_minSize.Width > 0) if (_minSize.Width > 0)
{
mmi.ptMinTrackSize.X = mmi.ptMinTrackSize.X =
(int)((_minSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right); (int)((_minSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right);
}
if (_minSize.Height > 0) if (_minSize.Height > 0)
{
mmi.ptMinTrackSize.Y = mmi.ptMinTrackSize.Y =
(int)((_minSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom); (int)((_minSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom);
}
if (!Double.IsInfinity(_maxSize.Width) && _maxSize.Width > 0) if (!double.IsInfinity(_maxSize.Width) && _maxSize.Width > 0)
{
mmi.ptMaxTrackSize.X = mmi.ptMaxTrackSize.X =
(int)((_maxSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right); (int)((_maxSize.Width * Scaling) + BorderThickness.Left + BorderThickness.Right);
}
if (!Double.IsInfinity(_maxSize.Height) && _maxSize.Height > 0) if (!double.IsInfinity(_maxSize.Height) && _maxSize.Height > 0)
{
mmi.ptMaxTrackSize.Y = mmi.ptMaxTrackSize.Y =
(int)((_maxSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom); (int)((_maxSize.Height * Scaling) + BorderThickness.Top + BorderThickness.Bottom);
}
Marshal.StructureToPtr(mmi, lParam, true); Marshal.StructureToPtr(mmi, lParam, true);
return IntPtr.Zero; return IntPtr.Zero;
}
case WindowsMessage.WM_DISPLAYCHANGE: case WindowsMessage.WM_DISPLAYCHANGE:
{
(Screen as ScreenImpl)?.InvalidateScreensCache(); (Screen as ScreenImpl)?.InvalidateScreensCache();
return IntPtr.Zero; return IntPtr.Zero;
}
} }
#if USE_MANAGED_DRAG #if USE_MANAGED_DRAG
@ -384,7 +451,9 @@ namespace Avalonia.Win32
} }
using (_rendererLock.Lock()) using (_rendererLock.Lock())
{
return DefWindowProc(hWnd, msg, wParam, lParam); return DefWindowProc(hWnd, msg, wParam, lParam);
}
} }
private static int ToInt32(IntPtr ptr) private static int ToInt32(IntPtr ptr)
@ -410,7 +479,10 @@ namespace Avalonia.Win32
private bool ShouldIgnoreTouchEmulatedMessage() private bool ShouldIgnoreTouchEmulatedMessage()
{ {
if (!_multitouch) if (!_multitouch)
{
return false; return false;
}
var marker = 0xFF515700L; var marker = 0xFF515700L;
var info = GetMessageExtraInfo().ToInt64(); var info = GetMessageExtraInfo().ToInt64();
return (info & marker) == marker; return (info & marker) == marker;
@ -420,16 +492,32 @@ namespace Avalonia.Win32
{ {
var keys = (ModifierKeys)ToInt32(wParam); var keys = (ModifierKeys)ToInt32(wParam);
var modifiers = WindowsKeyboardDevice.Instance.Modifiers; var modifiers = WindowsKeyboardDevice.Instance.Modifiers;
if (keys.HasFlagCustom(ModifierKeys.MK_LBUTTON)) if (keys.HasFlagCustom(ModifierKeys.MK_LBUTTON))
{
modifiers |= RawInputModifiers.LeftMouseButton; modifiers |= RawInputModifiers.LeftMouseButton;
}
if (keys.HasFlagCustom(ModifierKeys.MK_RBUTTON)) if (keys.HasFlagCustom(ModifierKeys.MK_RBUTTON))
{
modifiers |= RawInputModifiers.RightMouseButton; modifiers |= RawInputModifiers.RightMouseButton;
}
if (keys.HasFlagCustom(ModifierKeys.MK_MBUTTON)) if (keys.HasFlagCustom(ModifierKeys.MK_MBUTTON))
{
modifiers |= RawInputModifiers.MiddleMouseButton; modifiers |= RawInputModifiers.MiddleMouseButton;
}
if (keys.HasFlagCustom(ModifierKeys.MK_XBUTTON1)) if (keys.HasFlagCustom(ModifierKeys.MK_XBUTTON1))
{
modifiers |= RawInputModifiers.XButton1MouseButton; modifiers |= RawInputModifiers.XButton1MouseButton;
}
if (keys.HasFlagCustom(ModifierKeys.MK_XBUTTON2)) if (keys.HasFlagCustom(ModifierKeys.MK_XBUTTON2))
{
modifiers |= RawInputModifiers.XButton2MouseButton; modifiers |= RawInputModifiers.XButton2MouseButton;
}
return modifiers; return modifiers;
} }
} }

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

@ -312,15 +312,6 @@ namespace Avalonia.Win32
} }
} }
public void SetSystemDecorations(SystemDecorations value)
{
var newWindowProperties = _windowProperties;
newWindowProperties.Decorations = value;
UpdateWindowProperties(newWindowProperties);
}
public void Invalidate(Rect rect) public void Invalidate(Rect rect)
{ {
var scaling = Scaling; var scaling = Scaling;
@ -356,11 +347,6 @@ namespace Avalonia.Win32
CreateDropTarget(); CreateDropTarget();
} }
public void SetTitle(string title)
{
SetWindowText(_hwnd, title);
}
public void Hide() public void Hide()
{ {
if (_parent != null) if (_parent != null)
@ -407,30 +393,20 @@ namespace Avalonia.Win32
#endif #endif
} }
public void SetTitle(string title)
{
SetWindowText(_hwnd, title);
}
public void SetCursor(IPlatformHandle cursor) public void SetCursor(IPlatformHandle cursor)
{ {
var hCursor = cursor?.Handle ?? DefaultCursor; var hCursor = cursor?.Handle ?? DefaultCursor;
SetClassLong(_hwnd, ClassLongIndex.GCLP_HCURSOR, hCursor); SetClassLong(_hwnd, ClassLongIndex.GCLP_HCURSOR, hCursor);
if (_owner.IsPointerOver) if (_owner.IsPointerOver)
{
UnmanagedMethods.SetCursor(hCursor); UnmanagedMethods.SetCursor(hCursor);
} }
protected virtual IntPtr CreateWindowOverride(ushort atom)
{
return CreateWindowEx(
0,
atom,
null,
(int)WindowStyles.WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
} }
public void SetIcon(IWindowIconImpl icon) public void SetIcon(IWindowIconImpl icon)
@ -459,6 +435,15 @@ namespace Avalonia.Win32
UpdateWindowProperties(newWindowProperties); UpdateWindowProperties(newWindowProperties);
} }
public void SetSystemDecorations(SystemDecorations value)
{
var newWindowProperties = _windowProperties;
newWindowProperties.Decorations = value;
UpdateWindowProperties(newWindowProperties);
}
public void SetTopmost(bool value) public void SetTopmost(bool value)
{ {
if (value == _topmost) if (value == _topmost)
@ -475,6 +460,23 @@ namespace Avalonia.Win32
_topmost = value; _topmost = value;
} }
protected virtual IntPtr CreateWindowOverride(ushort atom)
{
return CreateWindowEx(
0,
atom,
null,
(int)WindowStyles.WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
}
private void CreateWindow() private void CreateWindow()
{ {
// Ensure that the delegate doesn't get garbage collected by storing it as a field. // Ensure that the delegate doesn't get garbage collected by storing it as a field.
@ -482,12 +484,13 @@ namespace Avalonia.Win32
_className = $"Avalonia-{Guid.NewGuid().ToString()}"; _className = $"Avalonia-{Guid.NewGuid().ToString()}";
// Unique DC helps with performance when using Gpu based rendering
const ClassStyles windowClassStyle = ClassStyles.CS_OWNDC | ClassStyles.CS_HREDRAW | ClassStyles.CS_VREDRAW;
var wndClassEx = new WNDCLASSEX var wndClassEx = new WNDCLASSEX
{ {
cbSize = Marshal.SizeOf<WNDCLASSEX>(), cbSize = Marshal.SizeOf<WNDCLASSEX>(),
style = style = (int)windowClassStyle,
(int)(ClassStyles.CS_OWNDC | ClassStyles.CS_HREDRAW |
ClassStyles.CS_VREDRAW), // Unique DC helps with performance when using Gpu based rendering
lpfnWndProc = _wndProcDelegate, lpfnWndProc = _wndProcDelegate,
hInstance = GetModuleHandle(null), hInstance = GetModuleHandle(null),
hCursor = DefaultCursor, hCursor = DefaultCursor,
@ -605,8 +608,7 @@ namespace Avalonia.Win32
private void SetStyle(WindowStyles style) => SetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE, (uint)style); private void SetStyle(WindowStyles style) => SetWindowLong(_hwnd, (int)WindowLongParam.GWL_STYLE, (uint)style);
private void SetExtendedStyle(WindowStyles style) => private void SetExtendedStyle(WindowStyles style) => SetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE, (uint)style);
SetWindowLong(_hwnd, (int)WindowLongParam.GWL_EXSTYLE, (uint)style);
private void UpdateEnabled() private void UpdateEnabled()
{ {
@ -617,6 +619,8 @@ namespace Avalonia.Win32
{ {
var oldProperties = _windowProperties; var oldProperties = _windowProperties;
// Calling SetWindowPos will cause events to be sent and we need to respond
// according to the new values already.
_windowProperties = newProperties; _windowProperties = newProperties;
if (oldProperties.ShowInTaskbar != newProperties.ShowInTaskbar) if (oldProperties.ShowInTaskbar != newProperties.ShowInTaskbar)

Loading…
Cancel
Save