mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[NTUSER] Implement HSHELL_RUDEAPPACTIVATE notification (#4147)
- 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
This commit is contained in:
parent
821223b3d5
commit
79c926c893
3 changed files with 54 additions and 0 deletions
|
@ -15,6 +15,7 @@ PTHREADINFO gptiForeground = NULL;
|
||||||
PPROCESSINFO gppiLockSFW = NULL;
|
PPROCESSINFO gppiLockSFW = NULL;
|
||||||
ULONG guSFWLockCount = 0; // Rule #8, No menus are active. So should be zero.
|
ULONG guSFWLockCount = 0; // Rule #8, No menus are active. So should be zero.
|
||||||
PTHREADINFO ptiLastInput = NULL;
|
PTHREADINFO ptiLastInput = NULL;
|
||||||
|
HWND ghwndOldFullscreen = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check locking of a process or one or more menus are active.
|
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;
|
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
|
VOID FASTCALL
|
||||||
UpdateShellHook(PWND Window)
|
UpdateShellHook(PWND Window)
|
||||||
{
|
{
|
||||||
|
if (IntCheckFullscreen(Window))
|
||||||
|
return;
|
||||||
|
|
||||||
if ( Window->spwndParent == UserGetDesktopWindow() &&
|
if ( Window->spwndParent == UserGetDesktopWindow() &&
|
||||||
(!(Window->ExStyle & WS_EX_TOOLWINDOW) ||
|
(!(Window->ExStyle & WS_EX_TOOLWINDOW) ||
|
||||||
(Window->ExStyle & WS_EX_APPWINDOW)))
|
(Window->ExStyle & WS_EX_APPWINDOW)))
|
||||||
|
|
|
@ -29,3 +29,4 @@ VOID FASTCALL IntActivateWindow(PWND,PTHREADINFO,HANDLE,DWORD);
|
||||||
BOOL FASTCALL IntDeactivateWindow(PTHREADINFO,HANDLE);
|
BOOL FASTCALL IntDeactivateWindow(PTHREADINFO,HANDLE);
|
||||||
BOOL FASTCALL co_IntSetForegroundMessageQueue(PWND,PTHREADINFO,BOOL,DWORD );
|
BOOL FASTCALL co_IntSetForegroundMessageQueue(PWND,PTHREADINFO,BOOL,DWORD );
|
||||||
VOID FASTCALL UpdateShellHook(PWND);
|
VOID FASTCALL UpdateShellHook(PWND);
|
||||||
|
BOOL FASTCALL IntCheckFullscreen(PWND Window);
|
||||||
|
|
|
@ -1926,6 +1926,10 @@ co_WinPosSetWindowPos(
|
||||||
Window->head.pti->cVisWindows++;
|
Window->head.pti->cVisWindows++;
|
||||||
IntNotifyWinEvent(EVENT_OBJECT_SHOW, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
|
IntNotifyWinEvent(EVENT_OBJECT_SHOW, Window, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IntCheckFullscreen(Window);
|
||||||
|
}
|
||||||
|
|
||||||
if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
|
if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue