2025-04-27 07:49:33 -04:00

222 lines
5.9 KiB
C

/****************************************************************************\
* Module Name: minmax.c
*
* Copyright (c) 1985 - 1999, Microsoft Corporation
*
* Misc util functions
*
* 10-25-90 MikeHar Ported from Windows.
* 14-Feb-1991 mikeke Added Revalidation code (None)
\****************************************************************************/
#include "precomp.h"
#pragma hdrstop
VOID ZapActiveAndFocus(VOID)
{
PQ pq = PtiCurrent()->pq;
Unlock(&pq->spwndActive);
Unlock(&pq->spwndFocus);
}
VOID SetDialogPointer(PWND pwnd, LONG_PTR lPtr) {
if ((pwnd->cbwndExtra < DLGWINDOWEXTRA)
|| TestWF(pwnd, WFSERVERSIDEPROC)
|| (PpiCurrent() != GETPTI(pwnd)->ppi)) {
RIPMSG1(RIP_WARNING, "SetDialogPointer: Unexpected pwnd:%#p", pwnd);
return;
}
((PDIALOG)pwnd)->pdlg = (PDLG)lPtr;
if (lPtr == 0) {
pwnd->fnid |= FNID_CLEANEDUP_BIT;
ClrWF(pwnd, WFDIALOGWINDOW);
} else {
if (pwnd->fnid == 0) {
pwnd->fnid = FNID_DIALOG;
}
SetWF(pwnd, WFDIALOGWINDOW);
}
}
BOOL _SetProgmanWindow(PWND pwnd) {
PDESKTOPINFO pdeskinfo = GETDESKINFO(PtiCurrent());
if (pwnd != NULL) {
// Fail the call if another shell window exists
if (pdeskinfo->spwndProgman != NULL)
return(FALSE);
}
Lock(&pdeskinfo->spwndProgman, pwnd);
return(TRUE);
}
BOOL _SetTaskmanWindow(PWND pwnd) {
PDESKTOPINFO pdeskinfo = GETDESKINFO(PtiCurrent());
if (pwnd != NULL) {
// Fail the call if another shell window exists
if (pdeskinfo->spwndTaskman != NULL)
return(FALSE);
}
Lock(&pdeskinfo->spwndTaskman, pwnd);
return(TRUE);
}
/***************************************************************************\
*
* SetShellWindow()
*
* Returns true if shell window is successfully set. Note that we return
* FALSE if a shell window already exists. I.E., this works on a first
* come, first serve basis.
*
* We also do NOT allow child windows to be shell windows. Other than that,
* it's up to the caller to size her window appropriately.
*
* The pwndBkGnd is provided for the explorer shell. Since the shellwnd
* and the window which does the drawing of background wallpapers are
* different, we need to provide means by which we can draw directly on
* the background window during hung-app drawing. The pwnd and pwndBkGnd
* will be identical if called through the SetShellWindow() api.
*
*
\***************************************************************************/
BOOL xxxSetShellWindow(PWND pwnd, PWND pwndBkGnd)
{
PTHREADINFO ptiCurrent = PtiCurrent();
PDESKTOPINFO pdeskinfo = GETDESKINFO(ptiCurrent);
PPROCESSINFO ppiShellProcess;
UserAssert(pwnd);
/*
* Fail the call if another shell window exists
*/
if (pdeskinfo->spwndShell != NULL)
return(FALSE);
/*
* The shell window must be
* (1) Top-level
* (2) Unowned
* (3) Not topmost
*/
if (TestwndChild(pwnd) ||
(pwnd->spwndOwner != NULL) ||
TestWF(pwnd, WEFTOPMOST)) {
RIPMSG0(RIP_WARNING, "xxxSetShellWindow: Invalid type of window");
return(FALSE);
}
/*
* Chicago has a totally different input model which has special code
* that checks for Ctrl-Esc and sends it to the shell. We can get
* the same functionality, without totally re-writing our input model
* by just automatically installing the Ctrl-Esc as a hotkey for the
* shell window. The hotkey delivery code has a special case which
* turns this into a WM_SYSCOMMAND message instead of a WM_HOTKEY
* message.
*
* We don't both checking for failure. Somebody could already have
* a Ctrl-Esc handler installed.
*/
_RegisterHotKey(pwnd,SC_TASKLIST,MOD_CONTROL,VK_ESCAPE);
/*
* This is the shell window wright.
* So get the process id for the shell.
*/
ppiShellProcess = GETPTI(pwnd)->ppi;
/*
* Set the shell process id to the desktop only if it's the first instance
*/
if ((ppiShellProcess != NULL) && (pdeskinfo->ppiShellProcess == NULL)) {
pdeskinfo->ppiShellProcess = ppiShellProcess;
}
Lock(&pdeskinfo->spwndShell, pwnd);
Lock(&pdeskinfo->spwndBkGnd, pwndBkGnd);
/*
* Push window to bottom of stack.
*/
SetWF(pdeskinfo->spwndShell, WFBOTTOMMOST);
xxxSetWindowPos(pdeskinfo->spwndShell,
PWND_BOTTOM,
0,
0,
0,
0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
return(TRUE);
}
/***************************************************************************\
* _InitPwSB()
*
* History:
* 10-23-90 MikeHar Ported from WaWaWaWindows.
* 11-28-90 JimA Changed to int *
* 01-21-91 IanJa Prefix '_' denoting exported function (although not API)
\***************************************************************************/
PSBINFO _InitPwSB(
PWND pwnd)
{
if (pwnd->pSBInfo) {
/*
* If memory is already allocated, don't bother to do it again.
*/
return pwnd->pSBInfo;
}
pwnd->pSBInfo = (PSBINFO)DesktopAlloc(pwnd->head.rpdesk,
sizeof(SBINFO),
DTAG_SBINFO);
if (pwnd->pSBInfo != NULL) {
/*
* rgw[0] = 0; */ /* LPTR zeros all 6 words
*/
/*
* rgw[1] = 0;
*/
/*
* rgw[3] = 0;
*/
/*
* rgw[4] = 0;
*/
pwnd->pSBInfo->Vert.posMax = 100;
pwnd->pSBInfo->Horz.posMax = 100;
}
return pwnd->pSBInfo;
}