[NTUSER] Implement HSHELL_RUDEAPPACTIVATE notification (#4147)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Wed, 8 Dec 2021 09:26:22 +0000 (18:26 +0900)
committerGitHub <noreply@github.com>
Wed, 8 Dec 2021 09:26:22 +0000 (18:26 +0900)
- Add IntIsWindowFullscreen function to judge whether the window is fullscreen.
- Add IntCheckFullscreen function to notify HSHELL_RUDEAPPACTIVATE if fullscreen.
- Add IntCheckFullscreen call in UpdateShellHook function.
- Add IntCheckFullscreen call in co_WinPosSetWindowPos function.
CORE-16130

win32ss/user/ntuser/focus.c
win32ss/user/ntuser/focus.h
win32ss/user/ntuser/winpos.c

index 3c5ee19..a9ea096 100644 (file)
@@ -15,6 +15,7 @@ PTHREADINFO gptiForeground = NULL;
 PPROCESSINFO gppiLockSFW = NULL;
 ULONG guSFWLockCount = 0; // Rule #8, No menus are active. So should be zero.
 PTHREADINFO ptiLastInput = NULL;
+HWND ghwndOldFullscreen = NULL;
 
 /*
   Check locking of a process or one or more menus are active.
@@ -48,9 +49,57 @@ IntGetThreadFocusWindow(VOID)
    return ThreadQueue->spwndFocus ? UserHMGetHandle(ThreadQueue->spwndFocus) : 0;
 }
 
+BOOL FASTCALL IntIsWindowFullscreen(PWND Window)
+{
+    RECTL rclAnd, rclMonitor, rclWindow;
+    PMONITOR pMonitor;
+
+    if (!Window || !(Window->style & WS_VISIBLE) || (Window->style & WS_CHILD) ||
+        (Window->ExStyle & WS_EX_TOOLWINDOW) || !IntGetWindowRect(Window, &rclWindow))
+    {
+        return FALSE;
+    }
+
+    pMonitor = UserGetPrimaryMonitor();
+    if (!pMonitor)
+    {
+        RECTL_vSetRect(&rclMonitor, 0, 0,
+                       UserGetSystemMetrics(SM_CXSCREEN), UserGetSystemMetrics(SM_CYSCREEN));
+    }
+    else
+    {
+        rclMonitor = *(LPRECTL)&pMonitor->rcMonitor;
+    }
+
+    RECTL_bIntersectRect(&rclAnd, &rclMonitor, &rclWindow);
+    return RtlEqualMemory(&rclAnd, &rclMonitor, sizeof(RECTL));
+}
+
+BOOL FASTCALL IntCheckFullscreen(PWND Window)
+{
+    HWND hWnd;
+
+    if (ghwndOldFullscreen && !IntIsWindowFullscreen(ValidateHwndNoErr(ghwndOldFullscreen)))
+        ghwndOldFullscreen = NULL;
+
+    if (!IntIsWindowFullscreen(Window))
+        return FALSE;
+
+    hWnd = UserHMGetHandle(Window);
+    if (ghwndOldFullscreen != hWnd)
+    {
+        co_IntShellHookNotify(HSHELL_RUDEAPPACTIVATED, (WPARAM)hWnd, TRUE);
+        ghwndOldFullscreen = hWnd;
+    }
+    return TRUE;
+}
+
 VOID FASTCALL
 UpdateShellHook(PWND Window)
 {
+   if (IntCheckFullscreen(Window))
+       return;
+
    if ( Window->spwndParent == UserGetDesktopWindow() &&
        (!(Window->ExStyle & WS_EX_TOOLWINDOW) ||
          (Window->ExStyle & WS_EX_APPWINDOW)))
index 821d7b4..37ada34 100644 (file)
@@ -29,3 +29,4 @@ VOID FASTCALL IntActivateWindow(PWND,PTHREADINFO,HANDLE,DWORD);
 BOOL FASTCALL IntDeactivateWindow(PTHREADINFO,HANDLE);
 BOOL FASTCALL co_IntSetForegroundMessageQueue(PWND,PTHREADINFO,BOOL,DWORD );
 VOID FASTCALL UpdateShellHook(PWND);
+BOOL FASTCALL IntCheckFullscreen(PWND Window);
index 550a074..da70805 100644 (file)
@@ -1926,6 +1926,10 @@ co_WinPosSetWindowPos(
       Window->head.pti->cVisWindows++;
       IntNotifyWinEvent(EVENT_OBJECT_SHOW, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
    }
+   else
+   {
+      IntCheckFullscreen(Window);
+   }
 
    if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
    {