[WIN32SS] WindowSnap must not affect the taskbar
authorJoachim Henze <Joachim.Henze@reactos.org>
Tue, 20 Aug 2019 10:07:56 +0000 (12:07 +0200)
committerJoachim Henze <Joachim.Henze@reactos.org>
Tue, 20 Aug 2019 10:07:56 +0000 (12:07 +0200)
This fixes regression CORE-16289 where we could not longer
move the taskbar at a different than default location,
as WindowSnap would interfere.

Many Thanks to the patches author Doug Lyons.

Eventually the heuristic that we use here to identify the
taskbar via used window-styles could be improved later.
Theoretically possible that it bails out on some other windows.

The regression was introduced by 0.4.12-dev-373-g
7e396787ed00a3939031447725f79697a41878e1

win32ss/user/ntuser/defwnd.c
win32ss/user/ntuser/nonclient.c

index fc55c4a..7b07ec4 100644 (file)
@@ -539,6 +539,9 @@ IntDefWindowProc(
    PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
    LRESULT lResult = 0;
    USER_REFERENCE_ENTRY Ref;
+   BOOL IsTaskBar;
+   DWORD Style;
+   DWORD ExStyle;
 
    if (Msg > WM_USER) return 0;
 
@@ -785,7 +788,22 @@ IntDefWindowProc(
          {
             HWND hwndTop = UserGetForegroundWindow();
             PWND topWnd = UserGetWindowObject(hwndTop);
-            if (topWnd)
+
+            /* Test for typical TaskBar ExStyle Values */
+            ExStyle = (topWnd->ExStyle & WS_EX_TOOLWINDOW);
+            TRACE("ExStyle is '%x'.\n", ExStyle);
+
+            /* Test for typical TaskBar Style Values */
+            Style = (topWnd->style & (WS_POPUP | WS_VISIBLE |
+                        WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
+            TRACE("Style is '%x'.\n", Style);
+
+            /* Test for masked typical TaskBar Style and ExStyles to detect TaskBar */
+            IsTaskBar = (Style == (WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN))
+                        && (ExStyle == WS_EX_TOOLWINDOW);
+            TRACE("This %s the TaskBar.\n", IsTaskBar ? "is" : "is not");
+
+            if (topWnd && !IsTaskBar)  /* Second test is so we are not touching the Taskbar */
             {
                if ((topWnd->style & WS_THICKFRAME) == 0)
                {
index ba8dece..0c7dac8 100644 (file)
@@ -256,6 +256,8 @@ DefWndDoSizeMove(PWND pwnd, WORD wParam)
    //PMONITOR mon = 0; Don't port sync from wine!!! This breaks explorer task bar sizing!!
    //                  The task bar can grow in size and can not reduce due to the change
    //                  in the work area.
+   DWORD ExStyleTB, StyleTB;
+   BOOL IsTaskBar;
 
    Style = pwnd->style;
    ExStyle = pwnd->ExStyle;
@@ -394,6 +396,20 @@ DefWndDoSizeMove(PWND pwnd, WORD wParam)
       /* Exit on button-up */
       if (msg.message == WM_LBUTTONUP)
       {
+         /* Test for typical TaskBar ExStyle Values */
+         ExStyleTB = (ExStyle & WS_EX_TOOLWINDOW);
+         TRACE("ExStyle is '%x'.\n", ExStyleTB);
+
+         /* Test for typical TaskBar Style Values */
+         StyleTB = (Style & (WS_POPUP | WS_VISIBLE |
+                        WS_CLIPSIBLINGS | WS_CLIPCHILDREN));
+         TRACE("Style is '%x'.\n", StyleTB);
+
+         /* Test for masked typical TaskBar Style and ExStyles to detect TaskBar */
+         IsTaskBar = (StyleTB == (WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN))
+                     && (ExStyleTB == WS_EX_TOOLWINDOW);
+         TRACE("This %s the TaskBar.\n", IsTaskBar ? "is" : "is not");
+
          // check for snapping if was moved by caption
          if (hittest == HTCAPTION && thickframe && (ExStyle & WS_EX_MDICHILD) == 0)
          {
@@ -401,6 +417,11 @@ DefWndDoSizeMove(PWND pwnd, WORD wParam)
             BOOL doSideSnap = FALSE;
             UserSystemParametersInfo(SPI_GETWORKAREA, 0, &snapRect, 0);
 
+            /* if this is the taskbar, then we want to just exit */
+            if (IsTaskBar)
+            {
+               break;
+            }
             // snap to left
             if (pt.x <= snapRect.left)
             {