188 lines
4.2 KiB
C++
188 lines
4.2 KiB
C++
|
#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);
|
||
|
}
|
||
|
|
||
|
|
||
|
|