[WIN32SS] Move SwitchToThisWindow codes to win32k (#987)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Sat, 27 Oct 2018 17:56:16 +0000 (02:56 +0900)
committerGitHub <noreply@github.com>
Sat, 27 Oct 2018 17:56:16 +0000 (02:56 +0900)
- Implement user32!SwitchToThisWindow by NtUserCallTwoParam TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW.
- Improve user32!CloseWindow with using SetActiveWindow and ShowWindow (synchronized).
CORE-15165

win32ss/user/ntuser/simplecall.c
win32ss/user/user32/include/ntwrapper.h
win32ss/user/user32/windows/window.c

index c7ad21f..0d2042b 100644 (file)
@@ -3,7 +3,8 @@
  * PROJECT:          ReactOS kernel
  * PURPOSE:          NtUserCallXxx call stubs
  * FILE:             win32ss/user/ntuser/simplecall.c
- * PROGRAMER:        Ge van Geldorp (ge@gse.nl)
+ * PROGRAMERS:       Ge van Geldorp (ge@gse.nl)
+ *                   Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include <win32k.h>
@@ -505,9 +506,24 @@ NtUserCallTwoParam(
         }
 
         case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW:
-            STUB
+        {
+            HWND hwnd = (HWND)Param1;
             Ret = 0;
+            Window = UserGetWindowObject(hwnd);
+            if (!Window)
+            {
+                break;
+            }
+            if ((BOOL)Param2)
+            {
+                if (Window->style & WS_MINIMIZE)
+                {
+                    UserPostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
+                }
+            }
+            UserSetActiveWindow(Window);
             break;
+        }
 
         case TWOPARAM_ROUTINE_SETCARETPOS:
             Ret = (DWORD_PTR)co_IntSetCaretPos((int)Param1, (int)Param2);
index 01a07e4..e1d31f9 100644 (file)
@@ -688,6 +688,11 @@ EXTINLINE BOOL NtUserxUpdateUiState(HWND hWnd, DWORD Param)
     return (BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)Param, TWOPARAM_ROUTINE_ROS_UPDATEUISTATE);
 }
 
+EXTINLINE VOID NtUserxSwitchToThisWindow(HWND hWnd, BOOL bUnknown)
+{
+    NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)bUnknown, TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW);
+}
+
 EXTINLINE BOOL NtUserxShowOwnedPopups(HWND hWnd, BOOL fShow)
 {
     return (BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, fShow, TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS);
index cad8861..df54380 100644 (file)
@@ -79,22 +79,9 @@ BringWindowToTop(HWND hWnd)
 
 
 VOID WINAPI
-SwitchToThisWindow(HWND hwnd, BOOL fAltTab)
+SwitchToThisWindow(HWND hwnd, BOOL bUnknown)
 {
-    HWND hwndFG;
-    if (fAltTab)
-    {
-        if (IsIconic(hwnd))
-            PostMessageW(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
-        SetForegroundWindow(hwnd);
-    }
-    else
-    {
-        hwndFG = GetForegroundWindow();
-        PostMessageW(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
-        SetWindowPos(hwnd, hwndFG, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-        SetWindowPos(hwndFG, hwnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-    }
+    NtUserxSwitchToThisWindow(hwnd, bUnknown);
 }
 
 
@@ -127,7 +114,9 @@ ChildWindowFromPointEx(HWND hwndParent,
 BOOL WINAPI
 CloseWindow(HWND hWnd)
 {
-    return PostMessageW(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+    /* NOTE: CloseWindow does minimizes, and doesn't close. */
+    SetActiveWindow(hWnd);
+    return ShowWindow(hWnd, SW_SHOWMINIMIZED);
 }
 
 FORCEINLINE