|
|
#include "precomp.h"
//
// SWL.CPP
// Shared Window List
//
// Copyright(c) Microsoft 1997-
//
#define MLZ_FILE_ZONE ZONE_CORE
//
// SWL strategy when network packets are not available
//
// The SWL only sends one type of message - the window structure message.
// When no network packets are available the SWL will drop its current
// packet and remember that the window structure has changed since it was
// last able to send a packet. SWL_Periodic will also return FALSE when
// this happens so that the DCS will know not to send any updates if it
// failed to send a window structure.
//
// This pending of window structure messages is integrated with the
// ignore envelopes where the SWL wants to ignore changes caused by itself
// (or other components if they call the SWL_Begin/EndIgnoreWindowChanges
// functions).
//
//
// SWL strategy for backward compatibility.
//
// The differences between the R2.0 and 3.0 SWL protocol are:
// 1. Tokenless packets.
// 2. No shadows.
//
//
// SWL_HostStarting()
//
BOOL ASHost::SWL_HostStarting(void) { BOOL rc = FALSE;
DebugEntry(ASHost::SWL_HostStarting);
//
// If this is NT, get the name of our startup desktop
//
if (!g_asWin95) { ASSERT(m_aswlOurDesktopName[0] == 0); GetUserObjectInformation(GetThreadDesktop(g_asMainThreadId), UOI_NAME, m_aswlOurDesktopName, sizeof(m_aswlOurDesktopName), NULL);
TRACE_OUT(("Our desktop name is %s", m_aswlOurDesktopName)); }
if (!m_aswlOurDesktopName[0]) { // Use default name
TRACE_OUT(("Couldn't get desktop name; using %s", NAME_DESKTOP_DEFAULT)); lstrcpy(m_aswlOurDesktopName, NAME_DESKTOP_DEFAULT); }
rc = TRUE;
DebugExitBOOL(ASHost::SWL_HostStarting, rc); return(rc); }
//
// SWL_UpdateCurrentDesktop()
//
// This checks what the current desktop is, and if it's changed, updates
// the NT input hooks for winlogon/screensaver for the service. But normal
// SWL and AWC also make use of this info.
//
void ASHost::SWL_UpdateCurrentDesktop(void) { HDESK hDeskCurrent = NULL; UINT newCurrentDesktop; char szName[SWL_DESKTOPNAME_MAX];
DebugEntry(ASHost::SWL_UpdateCurrentDesktop);
newCurrentDesktop = DESKTOP_OURS;
if (g_asWin95) { // Nothing to do
DC_QUIT; }
//
// Get the current desktop. If we can't even get it, assume it's the
// winlogon desktop.
//
hDeskCurrent = OpenInputDesktop(0, TRUE, DESKTOP_READOBJECTS); if (!hDeskCurrent) { TRACE_OUT(("OpenInputDesktop failed; must be WINLOGON")); newCurrentDesktop = DESKTOP_WINLOGON; DC_QUIT; }
// Get the name of the current desktop
szName[0] = 0; GetUserObjectInformation(hDeskCurrent, UOI_NAME, szName, sizeof(szName), NULL); TRACE_OUT(("GetUserObjectInformation returned %s for name", szName));
if (!lstrcmpi(szName, m_aswlOurDesktopName)) { newCurrentDesktop = DESKTOP_OURS; } else if (!lstrcmpi(szName, NAME_DESKTOP_SCREENSAVER)) { newCurrentDesktop = DESKTOP_SCREENSAVER; } else if (!lstrcmpi(szName, NAME_DESKTOP_WINLOGON)) { newCurrentDesktop = DESKTOP_WINLOGON; } else { newCurrentDesktop = DESKTOP_OTHER; }
DC_EXIT_POINT: if (newCurrentDesktop != m_swlCurrentDesktop) { //
// If this is the service, adjust where we playback events
// and/or block local input.
//
OSI_DesktopSwitch(m_swlCurrentDesktop, newCurrentDesktop); m_swlCurrentDesktop = newCurrentDesktop; }
if (hDeskCurrent != NULL) { CloseDesktop(hDeskCurrent); }
DebugExitVOID(ASHost::SWL_UpdateCurrentDesktop); }
//
// SWL_IsOurDesktopActive()
//
BOOL ASHost::SWL_IsOurDesktopActive(void) { return(!g_asSharedMemory->fullScreen && (m_swlCurrentDesktop == DESKTOP_OURS)); }
//
// SWL_Periodic()
//
// DESCRIPTION:
//
// Called periodically. If the window structure has changed (such that it
// impacts remote systems) then send a new one if we can.
//
//
void ASHost::SWL_Periodic(void) { DebugEntry(ASSHost::SWL_Periodic);
SWL_UpdateCurrentDesktop();
DebugExitVOID(ASHost::SWL_Periodic); }
|