mirror of
https://github.com/debauchee/barrier.git
synced 2024-12-24 03:23:15 +03:00
4bf0836eae
It was doing that already if started through synergy but not if started by something outside of synergy. In particular, if you use `xscreensaver-command --activate' synergy used to send fake mouse motion events every 5 seconds to deactivate it. That's unlikely to be what the user wanted, especially if the locking is enabled since it would force the password dialog to appear. As before, it's recommended that client screens not use locking because xscreensaver will not deactivate without getting a password even if we make the request through a programmatic interface. Presumably that's for security reasons but it makes life harder for synergy.
162 lines
4.5 KiB
C++
162 lines
4.5 KiB
C++
/*
|
|
* synergy -- mouse and keyboard sharing utility
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
*
|
|
* This package is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* found in the file COPYING that should have accompanied this file.
|
|
*
|
|
* This package is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef CXWINDOWSSCREENSAVER_H
|
|
#define CXWINDOWSSCREENSAVER_H
|
|
|
|
#include "IScreenSaver.h"
|
|
#include "stdmap.h"
|
|
#if defined(X_DISPLAY_MISSING)
|
|
# error X11 is required to build synergy
|
|
#else
|
|
# include <X11/Xlib.h>
|
|
#endif
|
|
|
|
class IJob;
|
|
class CXWindowsScreen;
|
|
|
|
//! X11 screen saver implementation
|
|
class CXWindowsScreenSaver : public IScreenSaver {
|
|
public:
|
|
// note -- the caller must ensure that Display* passed to c'tor isn't
|
|
// being used in another call to Xlib when calling any method on this
|
|
// object (including during the c'tor and d'tor).
|
|
CXWindowsScreenSaver(CXWindowsScreen*, Display*);
|
|
virtual ~CXWindowsScreenSaver();
|
|
|
|
//! @name manipulators
|
|
//@{
|
|
|
|
//! Event filtering
|
|
/*!
|
|
Called for each event before event translation and dispatch. Return
|
|
true to skip translation and dispatch. Subclasses should call the
|
|
superclass's version first and return true if it returns true.
|
|
*/
|
|
bool onPreDispatch(const XEvent*);
|
|
|
|
//! Set notify target
|
|
/*!
|
|
Tells this object to send a ClientMessage to the given window
|
|
when the screen saver activates or deactivates. Only one window
|
|
can be notified at a time. The message type is the "SCREENSAVER"
|
|
atom, the format is 32, and the data.l[0] member is non-zero
|
|
if activated, zero if deactivated. Pass None to disable
|
|
notification.
|
|
*/
|
|
void setNotify(Window);
|
|
|
|
//@}
|
|
|
|
// IScreenSaver overrides
|
|
virtual void enable();
|
|
virtual void disable();
|
|
virtual void activate();
|
|
virtual void deactivate();
|
|
virtual bool isActive() const;
|
|
|
|
private:
|
|
// send a notification
|
|
void sendNotify(bool activated);
|
|
|
|
// find and set the running xscreensaver's window. returns true iff
|
|
// found.
|
|
bool findXScreenSaver();
|
|
|
|
// set the xscreensaver's window, updating the activation state flag
|
|
void setXScreenSaver(Window);
|
|
|
|
// returns true if the window appears to be the xscreensaver window
|
|
bool isXScreenSaver(Window) const;
|
|
|
|
// set xscreensaver's activation state flag. sends notification
|
|
// if the state has changed.
|
|
void setXScreenSaverActive(bool activated);
|
|
|
|
// send a command to xscreensaver
|
|
void sendXScreenSaverCommand(Atom, long = 0, long = 0);
|
|
|
|
// watch all windows that could potentially be the xscreensaver for
|
|
// the events that will confirm it.
|
|
void watchForXScreenSaver();
|
|
|
|
// stop watching all watched windows
|
|
void clearWatchForXScreenSaver();
|
|
|
|
// add window to the watch list
|
|
void addWatchXScreenSaver(Window window);
|
|
|
|
// install/uninstall the job used to suppress the screensaver
|
|
void updateDisableJob();
|
|
|
|
// called periodically to prevent the screen saver from starting
|
|
void disableCallback(void*);
|
|
|
|
private:
|
|
typedef std::map<Window, long> CWatchList;
|
|
|
|
// the event loop object
|
|
CXWindowsScreen* m_screen;
|
|
|
|
// the X display
|
|
Display* m_display;
|
|
|
|
// old event mask on root window
|
|
long m_rootEventMask;
|
|
|
|
// window to notify on screen saver activation/deactivation
|
|
Window m_notify;
|
|
|
|
// xscreensaver's window
|
|
Window m_xscreensaver;
|
|
|
|
// xscreensaver activation state
|
|
bool m_xscreensaverActive;
|
|
|
|
// dummy window to receive xscreensaver repsonses
|
|
Window m_xscreensaverSink;
|
|
|
|
// potential xscreensaver windows being watched
|
|
CWatchList m_watchWindows;
|
|
|
|
// atoms used to communicate with xscreensaver's window
|
|
Atom m_atomScreenSaver;
|
|
Atom m_atomScreenSaverVersion;
|
|
Atom m_atomScreenSaverActivate;
|
|
Atom m_atomScreenSaverDeactivate;
|
|
Atom m_atomSynergyScreenSaver;
|
|
|
|
// built-in screen saver settings
|
|
int m_timeout;
|
|
int m_interval;
|
|
int m_preferBlanking;
|
|
int m_allowExposures;
|
|
|
|
// true iff the client wants the screen saver suppressed
|
|
bool m_disabled;
|
|
|
|
// true iff we're ignoring m_disabled. this is true, for example,
|
|
// when the client has called activate() and so presumably wants
|
|
// to activate the screen saver even if disabled.
|
|
bool m_suppressDisable;
|
|
|
|
// true iff the disabled job timer is installed
|
|
bool m_disableJobInstalled;
|
|
|
|
// the job used to invoke disableCallback
|
|
IJob* m_disableJob;
|
|
};
|
|
|
|
#endif
|