win32 screen saver now handled.

This commit is contained in:
crs 2002-06-23 21:53:31 +00:00
parent 7100e07d2b
commit 76db457830
9 changed files with 221 additions and 26 deletions

View File

@ -2,6 +2,7 @@
#include "CClient.h" #include "CClient.h"
#include "CClipboard.h" #include "CClipboard.h"
#include "CMSWindowsClipboard.h" #include "CMSWindowsClipboard.h"
#include "CMSWindowsScreenSaver.h"
#include "CPlatform.h" #include "CPlatform.h"
#include "XScreen.h" #include "XScreen.h"
#include "CLock.h" #include "CLock.h"
@ -97,6 +98,9 @@ CMSWindowsSecondaryScreen::open(CClient* client)
grabClipboard(id); grabClipboard(id);
} }
// disable the screen saver
getScreenSaver()->disable();
// hide the cursor // hide the cursor
m_active = true; m_active = true;
leave(); leave();
@ -107,6 +111,9 @@ CMSWindowsSecondaryScreen::close()
{ {
assert(m_client != NULL); assert(m_client != NULL);
// restore the screen saver settings
getScreenSaver()->enable();
// close the display // close the display
closeDisplay(); closeDisplay();
@ -382,6 +389,17 @@ CMSWindowsSecondaryScreen::grabClipboard(ClipboardID /*id*/)
} }
} }
void
CMSWindowsSecondaryScreen::screenSaver(bool activate)
{
if (activate) {
getScreenSaver()->activate();
}
else {
getScreenSaver()->deactivate();
}
}
void void
CMSWindowsSecondaryScreen::getMousePos(SInt32& x, SInt32& y) const CMSWindowsSecondaryScreen::getMousePos(SInt32& x, SInt32& y) const
{ {

View File

@ -36,6 +36,7 @@ public:
virtual void mouseWheel(SInt32 delta); virtual void mouseWheel(SInt32 delta);
virtual void setClipboard(ClipboardID, const IClipboard*); virtual void setClipboard(ClipboardID, const IClipboard*);
virtual void grabClipboard(ClipboardID); virtual void grabClipboard(ClipboardID);
virtual void screenSaver(bool activate);
virtual void getMousePos(SInt32& x, SInt32& y) const; virtual void getMousePos(SInt32& x, SInt32& y) const;
virtual void getShape(SInt32&, SInt32&, SInt32&, SInt32&) const; virtual void getShape(SInt32&, SInt32&, SInt32&, SInt32&) const;
virtual SInt32 getJumpZoneSize() const; virtual SInt32 getJumpZoneSize() const;

View File

@ -1,4 +1,5 @@
#include "CMSWindowsScreen.h" #include "CMSWindowsScreen.h"
#include "CMSWindowsScreenSaver.h"
#include "CThread.h" #include "CThread.h"
#include "CLock.h" #include "CLock.h"
#include "TMethodJob.h" #include "TMethodJob.h"
@ -27,7 +28,8 @@ CMSWindowsScreen::CMSWindowsScreen() :
m_cursor(NULL), m_cursor(NULL),
m_x(0), m_y(0), m_x(0), m_y(0),
m_w(0), m_h(0), m_w(0), m_h(0),
m_thread(0) m_thread(0),
m_screenSaver(NULL)
{ {
assert(s_screen == NULL); assert(s_screen == NULL);
s_screen = this; s_screen = this;
@ -114,6 +116,9 @@ CMSWindowsScreen::openDisplay()
// let subclass prep display // let subclass prep display
onOpenDisplay(); onOpenDisplay();
// initialize the screen saver
m_screenSaver = new CMSWindowsScreenSaver();
} }
void void
@ -122,6 +127,10 @@ CMSWindowsScreen::closeDisplay()
assert(s_instance != NULL); assert(s_instance != NULL);
assert(m_class != 0); assert(m_class != 0);
// done with screen saver
delete m_screenSaver;
m_screenSaver = NULL;
// let subclass close down display // let subclass close down display
onCloseDisplay(); onCloseDisplay();
@ -203,6 +212,12 @@ CMSWindowsScreen::isCurrentDesktop(HDESK desk) const
getCurrentDesktopName()); getCurrentDesktopName());
} }
CMSWindowsScreenSaver*
CMSWindowsScreen::getScreenSaver() const
{
return m_screenSaver;
}
void void
CMSWindowsScreen::getEvent(MSG* msg) const CMSWindowsScreen::getEvent(MSG* msg) const
{ {

View File

@ -7,6 +7,7 @@
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
class CMSWindowsScreenSaver;
class CThread; class CThread;
class CMSWindowsScreen { class CMSWindowsScreen {
@ -61,6 +62,10 @@ protected:
// windows 95/98/me. // windows 95/98/me.
bool isCurrentDesktop(HDESK desk) const; bool isCurrentDesktop(HDESK desk) const;
// get the screen saver object
CMSWindowsScreenSaver*
getScreenSaver() const;
// wait for and get the next message. cancellable. // wait for and get the next message. cancellable.
void getEvent(MSG*) const; void getEvent(MSG*) const;
@ -91,6 +96,7 @@ private:
SInt32 m_x, m_y; SInt32 m_x, m_y;
SInt32 m_w, m_h; SInt32 m_w, m_h;
DWORD m_thread; DWORD m_thread;
CMSWindowsScreenSaver* m_screenSaver;
static CMSWindowsScreen* s_screen; static CMSWindowsScreen* s_screen;
}; };

View File

@ -95,6 +95,10 @@ SOURCE=.\CMSWindowsScreen.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\CMSWindowsScreenSaver.cpp
# End Source File
# Begin Source File
SOURCE=.\CPlatform.cpp SOURCE=.\CPlatform.cpp
# End Source File # End Source File
# End Group # End Group
@ -111,6 +115,10 @@ SOURCE=.\CMSWindowsScreen.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\CMSWindowsScreenSaver.h
# End Source File
# Begin Source File
SOURCE=.\CPlatform.h SOURCE=.\CPlatform.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -1,6 +1,7 @@
#include "CMSWindowsPrimaryScreen.h" #include "CMSWindowsPrimaryScreen.h"
#include "CServer.h" #include "CServer.h"
#include "CMSWindowsClipboard.h" #include "CMSWindowsClipboard.h"
#include "CMSWindowsScreenSaver.h"
#include "CPlatform.h" #include "CPlatform.h"
#include "XScreen.h" #include "XScreen.h"
#include "XSynergy.h" #include "XSynergy.h"
@ -34,15 +35,29 @@ CMSWindowsPrimaryScreen::CMSWindowsPrimaryScreen() :
m_setRelay = (SetRelayFunc)GetProcAddress(m_hookLibrary, "setRelay"); m_setRelay = (SetRelayFunc)GetProcAddress(m_hookLibrary, "setRelay");
m_install = (InstallFunc)GetProcAddress(m_hookLibrary, "install"); m_install = (InstallFunc)GetProcAddress(m_hookLibrary, "install");
m_uninstall = (UninstallFunc)GetProcAddress(m_hookLibrary, "uninstall"); m_uninstall = (UninstallFunc)GetProcAddress(m_hookLibrary, "uninstall");
m_init = (InitFunc)GetProcAddress(m_hookLibrary, "init");
m_cleanup = (CleanupFunc)GetProcAddress(m_hookLibrary, "cleanup");
if (m_setZone == NULL || if (m_setZone == NULL ||
m_setRelay == NULL || m_setRelay == NULL ||
m_install == NULL || m_install == NULL ||
m_uninstall == NULL) { m_uninstall == NULL ||
m_init == NULL ||
m_cleanup == NULL) {
log((CLOG_ERR "invalid hook library")); log((CLOG_ERR "invalid hook library"));
FreeLibrary(m_hookLibrary); FreeLibrary(m_hookLibrary);
throw XScreenOpenFailure(); throw XScreenOpenFailure();
} }
// get the screen saver functions
m_installScreenSaver = (InstallScreenSaverFunc)GetProcAddress(
m_hookLibrary, "installScreenSaver");
m_uninstallScreenSaver = (UninstallScreenSaverFunc)GetProcAddress(
m_hookLibrary, "uninstallScreenSaver");
if (m_installScreenSaver == NULL || m_uninstallScreenSaver == NULL) {
// disable uninstall if install is unavailable
m_uninstallScreenSaver = NULL;
}
// detect operating system // detect operating system
m_is95Family = CPlatform::isWindows95Family(); m_is95Family = CPlatform::isWindows95Family();
@ -56,6 +71,11 @@ CMSWindowsPrimaryScreen::~CMSWindowsPrimaryScreen()
assert(m_hookLibrary != NULL); assert(m_hookLibrary != NULL);
assert(m_window == NULL); assert(m_window == NULL);
// uninstall screen saver hook
if (m_uninstallScreenSaver != NULL) {
m_uninstallScreenSaver();
}
// done with hook library // done with hook library
FreeLibrary(m_hookLibrary); FreeLibrary(m_hookLibrary);
} }
@ -346,6 +366,12 @@ CMSWindowsPrimaryScreen::isLockedToScreen() const
return false; return false;
} }
bool
CMSWindowsPrimaryScreen::isScreenSaverActive() const
{
return getScreenSaver()->isActive();
}
void void
CMSWindowsPrimaryScreen::onOpenDisplay() CMSWindowsPrimaryScreen::onOpenDisplay()
{ {
@ -355,6 +381,14 @@ CMSWindowsPrimaryScreen::onOpenDisplay()
// save thread id. we'll need to pass this to the hook library. // save thread id. we'll need to pass this to the hook library.
m_threadID = GetCurrentThreadId(); m_threadID = GetCurrentThreadId();
// initialize hook library
m_init(m_threadID);
// install the screen saver hook
if (m_installScreenSaver != NULL) {
m_installScreenSaver();
}
// get the input desktop and switch to it // get the input desktop and switch to it
if (m_is95Family) { if (m_is95Family) {
if (!openDesktop()) { if (!openDesktop()) {
@ -379,6 +413,14 @@ CMSWindowsPrimaryScreen::onCloseDisplay()
switchDesktop(NULL); switchDesktop(NULL);
} }
// uninstall the screen saver hook
if (m_uninstallScreenSaver != NULL) {
m_uninstallScreenSaver();
}
// cleanup hook library
m_cleanup();
// clear thread id // clear thread id
m_threadID = 0; m_threadID = 0;
@ -507,6 +549,17 @@ CMSWindowsPrimaryScreen::onPreTranslate(MSG* msg)
m_y = static_cast<SInt32>(msg->lParam); m_y = static_cast<SInt32>(msg->lParam);
return true; return true;
case SYNERGY_MSG_SCREEN_SAVER:
if (msg->wParam != 0) {
if (getScreenSaver()->checkStarted(msg->message, FALSE, 0)) {
m_server->onScreenSaver(true);
}
}
else {
m_server->onScreenSaver(false);
}
return true;
case WM_TIMER: case WM_TIMER:
// if current desktop is not the input desktop then switch to it // if current desktop is not the input desktop then switch to it
if (!m_is95Family) { if (!m_is95Family) {
@ -709,7 +762,7 @@ bool
CMSWindowsPrimaryScreen::openDesktop() CMSWindowsPrimaryScreen::openDesktop()
{ {
// install hooks // install hooks
m_install(m_threadID); m_install();
// note -- we use a fullscreen window to grab input. it should // note -- we use a fullscreen window to grab input. it should
// be possible to use a 1x1 window but i've run into problems // be possible to use a 1x1 window but i've run into problems
@ -819,7 +872,7 @@ CMSWindowsPrimaryScreen::switchDesktop(HDESK desk)
} }
// install hooks // install hooks
m_install(m_threadID); m_install();
// note -- we use a fullscreen window to grab input. it should // note -- we use a fullscreen window to grab input. it should
// be possible to use a 1x1 window but i've run into problems // be possible to use a 1x1 window but i've run into problems

View File

@ -30,6 +30,7 @@ public:
virtual void getClipboard(ClipboardID, IClipboard*) const; virtual void getClipboard(ClipboardID, IClipboard*) const;
virtual KeyModifierMask getToggleMask() const; virtual KeyModifierMask getToggleMask() const;
virtual bool isLockedToScreen() const; virtual bool isLockedToScreen() const;
virtual bool isScreenSaverActive() const;
protected: protected:
// CMSWindowsScreen overrides // CMSWindowsScreen overrides
@ -106,10 +107,14 @@ private:
// hook library stuff // hook library stuff
HINSTANCE m_hookLibrary; HINSTANCE m_hookLibrary;
InitFunc m_init;
CleanupFunc m_cleanup;
InstallFunc m_install; InstallFunc m_install;
UninstallFunc m_uninstall; UninstallFunc m_uninstall;
SetZoneFunc m_setZone; SetZoneFunc m_setZone;
SetRelayFunc m_setRelay; SetRelayFunc m_setRelay;
InstallScreenSaverFunc m_installScreenSaver;
UninstallScreenSaverFunc m_uninstallScreenSaver;
// stuff for restoring active window // stuff for restoring active window
HWND m_lastForegroundWindow; HWND m_lastForegroundWindow;

View File

@ -45,6 +45,7 @@ static HANDLE g_keyHookThread = NULL;
static DWORD g_keyHookThreadID = 0; static DWORD g_keyHookThreadID = 0;
static HANDLE g_keyHookEvent = NULL; static HANDLE g_keyHookEvent = NULL;
static HHOOK g_keyboardLL = NULL; static HHOOK g_keyboardLL = NULL;
static bool g_screenSaver = false;
static bool g_relay = false; static bool g_relay = false;
static SInt32 g_zoneSize = 0; static SInt32 g_zoneSize = 0;
static UInt32 g_zoneSides = 0; static UInt32 g_zoneSides = 0;
@ -247,6 +248,14 @@ LRESULT CALLBACK
getMessageHook(int code, WPARAM wParam, LPARAM lParam) getMessageHook(int code, WPARAM wParam, LPARAM lParam)
{ {
if (code >= 0) { if (code >= 0) {
if (g_screenSaver) {
MSG* msg = reinterpret_cast<MSG*>(lParam);
if (msg->message == WM_SYSCOMMAND && msg->wParam == SC_SCREENSAVE) {
// broadcast screen saver started message
PostThreadMessage(g_threadID,
SYNERGY_MSG_SCREEN_SAVER, TRUE, 0);
}
}
if (g_relay) { if (g_relay) {
MSG* msg = reinterpret_cast<MSG*>(lParam); MSG* msg = reinterpret_cast<MSG*>(lParam);
if (msg->message == g_wmMouseWheel) { if (msg->message == g_wmMouseWheel) {
@ -455,19 +464,46 @@ DllMain(HINSTANCE instance, DWORD reason, LPVOID)
extern "C" { extern "C" {
int int
install(DWORD threadID) init(DWORD threadID)
{ {
assert(g_threadID == 0);
assert(g_hinstance != NULL); assert(g_hinstance != NULL);
assert(g_keyboard == NULL);
assert(g_mouse == NULL); // see if already initialized
assert(g_cbt == NULL); if (g_threadID != 0) {
assert(g_wheelSupport != kWheelOld || g_getMessage == NULL); return 0;
}
// save thread id. we'll post messages to this thread's // save thread id. we'll post messages to this thread's
// message queue. // message queue.
g_threadID = threadID; g_threadID = threadID;
return 1;
}
int
cleanup(void)
{
assert(g_hinstance != NULL);
g_threadID = 0;
return 1;
}
int
install()
{
assert(g_hinstance != NULL);
assert(g_keyboard == NULL);
assert(g_mouse == NULL);
assert(g_cbt == NULL);
assert(g_getMessage == NULL || g_screenSaver);
// must be initialized
if (g_threadID == 0) {
return 0;
}
// set defaults // set defaults
g_relay = false; g_relay = false;
g_zoneSize = 0; g_zoneSize = 0;
@ -520,8 +556,8 @@ install(DWORD threadID)
return 0; return 0;
} }
// install GetMessage hook // install GetMessage hook (unless already installed)
if (g_wheelSupport == kWheelOld) { if (g_wheelSupport == kWheelOld && g_getMessage == NULL) {
g_getMessage = SetWindowsHookEx(WH_GETMESSAGE, g_getMessage = SetWindowsHookEx(WH_GETMESSAGE,
&getMessageHook, &getMessageHook,
g_hinstance, g_hinstance,
@ -563,9 +599,7 @@ install(DWORD threadID)
int int
uninstall(void) uninstall(void)
{ {
assert(g_keyboard != NULL); assert(g_hinstance != NULL);
assert(g_mouse != NULL);
assert(g_cbt != NULL);
// uninstall hooks // uninstall hooks
if (g_keyHookThread != NULL) { if (g_keyHookThread != NULL) {
@ -577,17 +611,22 @@ uninstall(void)
g_keyHookThread = NULL; g_keyHookThread = NULL;
g_keyHookThreadID = 0; g_keyHookThreadID = 0;
} }
if (g_keyboard != NULL) {
UnhookWindowsHookEx(g_keyboard); UnhookWindowsHookEx(g_keyboard);
}
if (g_mouse != NULL) {
UnhookWindowsHookEx(g_mouse); UnhookWindowsHookEx(g_mouse);
}
if (g_cbt != NULL) {
UnhookWindowsHookEx(g_cbt); UnhookWindowsHookEx(g_cbt);
if (g_getMessage != NULL) { }
if (g_getMessage != NULL && !g_screenSaver) {
UnhookWindowsHookEx(g_getMessage); UnhookWindowsHookEx(g_getMessage);
g_getMessage = NULL;
} }
g_keyboard = NULL; g_keyboard = NULL;
g_mouse = NULL; g_mouse = NULL;
g_cbt = NULL; g_cbt = NULL;
g_getMessage = NULL;
g_threadID = 0;
// show the cursor // show the cursor
restoreCursor(); restoreCursor();
@ -595,6 +634,47 @@ uninstall(void)
return 1; return 1;
} }
int
installScreenSaver(void)
{
assert(g_hinstance != NULL);
// must be initialized
if (g_threadID == 0) {
return 0;
}
// generate screen saver messages
g_screenSaver = true;
// install hook unless it's already installed
if (g_getMessage == NULL) {
g_getMessage = SetWindowsHookEx(WH_GETMESSAGE,
&getMessageHook,
g_hinstance,
0);
}
return (g_getMessage != NULL) ? 1 : 0;
}
int
uninstallScreenSaver(void)
{
assert(g_hinstance != NULL);
// uninstall hook unless the mouse wheel hook is installed
if (g_getMessage != NULL && g_threadID == 0) {
UnhookWindowsHookEx(g_getMessage);
g_getMessage = NULL;
}
// screen saver hook is no longer installed
g_screenSaver = false;
return 1;
}
void void
setZone(UInt32 sides, setZone(UInt32 sides,
SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 x, SInt32 y, SInt32 w, SInt32 h,

View File

@ -22,17 +22,26 @@
#define SYNERGY_MSG_MOUSE_MOVE WM_APP + 0x0014 // x; y #define SYNERGY_MSG_MOUSE_MOVE WM_APP + 0x0014 // x; y
#define SYNERGY_MSG_POST_WARP WM_APP + 0x0015 // x; y #define SYNERGY_MSG_POST_WARP WM_APP + 0x0015 // x; y
#define SYNERGY_MSG_MOUSE_WHEEL WM_APP + 0x0016 // delta; <unused> #define SYNERGY_MSG_MOUSE_WHEEL WM_APP + 0x0016 // delta; <unused>
#define SYNERGY_MSG_SCREEN_SAVER WM_APP + 0x0017 // activated; <unused>
extern "C" { extern "C" {
typedef int (*InstallFunc)(DWORD targetQueueThreadID); typedef int (*InitFunc)(DWORD targetQueueThreadID);
typedef int (*CleanupFunc)(void);
typedef int (*InstallFunc)(void);
typedef int (*UninstallFunc)(void); typedef int (*UninstallFunc)(void);
typedef int (*InstallScreenSaverFunc)(void);
typedef int (*UninstallScreenSaverFunc)(void);
typedef void (*SetZoneFunc)(UInt32, typedef void (*SetZoneFunc)(UInt32,
SInt32, SInt32, SInt32, SInt32, SInt32); SInt32, SInt32, SInt32, SInt32, SInt32);
typedef void (*SetRelayFunc)(void); typedef void (*SetRelayFunc)(void);
CSYNERGYHOOK_API int install(DWORD); CSYNERGYHOOK_API int init(DWORD);
CSYNERGYHOOK_API int cleanup(void);
CSYNERGYHOOK_API int install(void);
CSYNERGYHOOK_API int uninstall(void); CSYNERGYHOOK_API int uninstall(void);
CSYNERGYHOOK_API int installScreenSaver(void);
CSYNERGYHOOK_API int uninstallScreenSaver(void);
CSYNERGYHOOK_API void setZone(UInt32 sides, CSYNERGYHOOK_API void setZone(UInt32 sides,
SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 x, SInt32 y, SInt32 w, SInt32 h,
SInt32 jumpZoneSize); SInt32 jumpZoneSize);