|
|
/*
* Copyright (c) 1985 - 1999, Microsoft Corporation */
#include "precomp.h"
#pragma hdrstop
// ----------------------------------------------------------------------------
//
// IsVSlick() -
//
// TRUE if window is positioned at +100,+100 from bottom right of screen --
// probably VSlick -- which has two Tray Windows, one is unowned but off the
// screen....we want the owned one since its on the screen
//
// ----------------------------------------------------------------------------
BOOL IsVSlick(PWND pwnd) { if (gpDispInfo->cMonitors == 1 && ((unsigned) pwnd->rcWindow.left > (unsigned) gpDispInfo->rcScreen.right ) && ((unsigned) pwnd->rcWindow.top > (unsigned) gpDispInfo->rcScreen.bottom) && (pwnd->rcWindow.top == (gpDispInfo->rcScreen.bottom+100)) && (pwnd->rcWindow.left == (gpDispInfo->rcScreen.right+100))) { // MUST BE THE ONE AND ONLY V-SLICK
return(TRUE); }
return(FALSE); }
// ----------------------------------------------------------------------------
//
// Is31TrayWindow() -
//
// extra grilling required for 3.1 and earlier apps before letting 'em in the
// tray -- trust me, you DON'T want to change this code. -- JEFFBOG 11/10/94
//
// ----------------------------------------------------------------------------
BOOL Is31TrayWindow(PWND pwnd) { PWND pwnd2;
if (!(pwnd2 = pwnd->spwndOwner)) return (!IsVSlick(pwnd)); // unowned -- do we want you?
if (TestWF(pwnd2, WEFTOOLWINDOW)) return(FALSE); // owned by a tool window -- we don't want
return((FHas31TrayStyles(pwnd2) ? (IsVSlick(pwnd2)) : TRUE)); }
// ----------------------------------------------------------------------------
//
// IsTrayWindow() -
//
// TRUE if the window passes all the necessary checks -- making it a window
// that should appear in the tray.
//
// ----------------------------------------------------------------------------
BOOL IsTrayWindow(PWND pwnd) { if ((pwnd==NULL) || !(FDoTray() && (FCallHookTray() || FPostTray(pwnd->head.rpdesk))) || !FTopLevel(pwnd)) return(FALSE);
// Check for WS_EX_APPWINDOW or WS_EX_TOOLWINDOW "overriding" bits
if (TestWF(pwnd, WEFAPPWINDOW)) return(TRUE);
if (TestWF(pwnd, WEFTOOLWINDOW)) return(FALSE);
if (TestWF(pwnd, WEFNOACTIVATE)) { return FALSE; }
if (TestWF(pwnd, WFWIN40COMPAT)) { if (pwnd->spwndOwner == NULL) return(TRUE); if (TestWF(pwnd->spwndOwner, WFWIN40COMPAT)) return(FALSE); // if this window is owned by a 3.1 window, check it like a 3.1 window
}
if (!FHas31TrayStyles(pwnd)) return(FALSE);
return(Is31TrayWindow(pwnd)); }
/***************************************************************************\
* xxxSetTrayWindow * * History: * 11-Dec-1996 adams Created. \***************************************************************************/
void xxxSetTrayWindow(PDESKTOP pdesk, PWND pwnd, PMONITOR pMonitor) { HWND hwnd;
CheckLock(pMonitor);
if (pwnd == STW_SAME) { pwnd = pdesk->spwndTray; hwnd = PtoH(pwnd); } else { CheckLock(pwnd); hwnd = PtoH(pwnd); Lock(&(pdesk->spwndTray), pwnd); }
if (!pMonitor) { if (pwnd) { pMonitor = _MonitorFromWindow(pwnd, MONITOR_DEFAULTTOPRIMARY); } else { pMonitor = GetPrimaryMonitor(); } }
if ( FPostTray(pdesk)) { PostShellHookMessages( pMonitor->cFullScreen ? HSHELL_RUDEAPPACTIVATED : HSHELL_WINDOWACTIVATED, (LPARAM) hwnd); }
if ( FCallHookTray() ) { xxxCallHook( HSHELL_WINDOWACTIVATED, (WPARAM) hwnd, (pMonitor->cFullScreen ? 1 : 0), WH_SHELL); } }
/***************************************************************************\
* xxxAddFullScreen * * Adds an app to the fullscreen list and moves the tray if it is * the first fullscreen app. * * History: * 27-Feb-1997 adams Commented. \***************************************************************************/
BOOL xxxAddFullScreen(PWND pwnd, PMONITOR pMonitor) { BOOL fYielded;
PDESKTOP pdesk = pwnd->head.rpdesk;
CheckLock(pwnd); CheckLock(pMonitor);
if (pdesk == NULL) return FALSE;
fYielded = FALSE; if (!TestWF(pwnd, WFFULLSCREEN) && FCallTray(pdesk)) { SetWF(pwnd, WFFULLSCREEN);
if (pMonitor->cFullScreen++ == 0) { xxxSetTrayWindow(pdesk, STW_SAME, pMonitor); fYielded = TRUE; }
pwnd = pwnd->spwndOwner; if ( pwnd && !TestWF(pwnd, WFCHILD) && pwnd->rcWindow.right == 0 && pwnd->rcWindow.left == 0 && !TestWF(pwnd, WFVISIBLE)) {
TL tlpwnd; ThreadLock(pwnd, &tlpwnd); if (xxxAddFullScreen(pwnd, pMonitor)) { fYielded = TRUE; }
ThreadUnlock(&tlpwnd); } }
return fYielded; }
/***************************************************************************\
* xxxRemoveFullScreen * * Adds an app to the fullscreen list and moves the tray if there * are no more fullscreen apps. * * History: * 27-Feb-1997 adams Commented. \***************************************************************************/
BOOL xxxRemoveFullScreen(PWND pwnd, PMONITOR pMonitor) { PDESKTOP pdesk = pwnd->head.rpdesk; BOOL fYielded;
CheckLock(pwnd); CheckLock(pMonitor);
if (pdesk == NULL) return FALSE;
fYielded = FALSE; if (TestWF(pwnd, WFFULLSCREEN) && FCallTray(pdesk)) { ClrWF(pwnd, WFFULLSCREEN);
if (--pMonitor->cFullScreen == 0) { xxxSetTrayWindow(pdesk, STW_SAME, pMonitor); fYielded = TRUE; }
/*
* (adams): Remove this assertion temporarily while I work on * a fix for the problem. * * UserAssert(pMonitor->cFullScreen >= 0); */ }
return fYielded; }
|