diff --git a/src/lib/platform/IXWindowsImpl.h b/src/lib/platform/IXWindowsImpl.h index 263f5a6f..a759b37a 100644 --- a/src/lib/platform/IXWindowsImpl.h +++ b/src/lib/platform/IXWindowsImpl.h @@ -186,6 +186,15 @@ public: virtual int XRefreshKeyboardMapping(XMappingEvent* event_map) = 0; virtual int XISelectEvents(Display* display, Window w, XIEventMask* masks, int num_masks) = 0; - - + virtual Atom XInternAtom(Display* display, _Xconst char* atom_name, + Bool only_if_exists) = 0; + virtual int XGetScreenSaver(Display* display, int* timeout_return, + int* interval_return, int* prefer_blanking_return, + int* allow_exposures_return) = 0; + virtual int XSetScreenSaver(Display* display, int timeout, int interval, + int prefer_blanking, int allow_exposures) = 0; + virtual int XForceScreenSaver(Display* display, int mode) = 0; + virtual int XFree(void* data) = 0; + virtual Status DPMSEnable(Display* display) = 0; + virtual Status DPMSDisable(Display* display) = 0; }; diff --git a/src/lib/platform/XWindowsImpl.cpp b/src/lib/platform/XWindowsImpl.cpp index bf6bb99c..8c1548c2 100644 --- a/src/lib/platform/XWindowsImpl.cpp +++ b/src/lib/platform/XWindowsImpl.cpp @@ -487,3 +487,44 @@ int XWindowsImpl::XISelectEvents(Display* display, Window w, XIEventMask* masks, return ::XISelectEvents(display, w, masks, num_masks); } +Atom XWindowsImpl::XInternAtom(Display* display, _Xconst char* atom_name, + Bool only_if_exists) +{ + return ::XInternAtom(display, atom_name, only_if_exists); +} + +int XWindowsImpl::XGetScreenSaver(Display* display, int* timeout_return, + int* interval_return, + int* prefer_blanking_return, + int* allow_exposures_return) +{ + return ::XGetScreenSaver(display, timeout_return, interval_return, + prefer_blanking_return, allow_exposures_return); +} + +int XWindowsImpl::XSetScreenSaver(Display* display, int timeout, int interval, + int prefer_blanking, int allow_exposures) +{ + return ::XSetScreenSaver(display, timeout, interval, prefer_blanking, + allow_exposures); +} + +int XWindowsImpl::XForceScreenSaver(Display* display, int mode) +{ + return ::XForceScreenSaver(display, mode); +} + +int XWindowsImpl::XFree(void* data) +{ + return ::XFree(data); +} + +Status XWindowsImpl::DPMSEnable(Display* display) +{ + return ::DPMSEnable(display); +} + +Status XWindowsImpl::DPMSDisable(Display* display) +{ + return ::DPMSDisable(display); +} diff --git a/src/lib/platform/XWindowsImpl.h b/src/lib/platform/XWindowsImpl.h index 32131be9..5cca0eb2 100644 --- a/src/lib/platform/XWindowsImpl.h +++ b/src/lib/platform/XWindowsImpl.h @@ -148,5 +148,15 @@ public: virtual int XRefreshKeyboardMapping(XMappingEvent* event_map); virtual int XISelectEvents(Display* display, Window w, XIEventMask* masks, int num_masks); + virtual Atom XInternAtom(Display* display, _Xconst char* atom_name, + Bool only_if_exists); + virtual int XGetScreenSaver(Display* display, int* timeout_return, + int* interval_return, int* prefer_blanking_return, + int* allow_exposures_return); + virtual int XSetScreenSaver(Display* display, int timeout, int interval, + int prefer_blanking, int allow_exposures); + virtual int XForceScreenSaver(Display* display, int mode); + virtual int XFree(void* data); + virtual Status DPMSEnable(Display* display); + virtual Status DPMSDisable(Display* display); }; - diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp index 9d0b7c35..953a607d 100644 --- a/src/lib/platform/XWindowsScreen.cpp +++ b/src/lib/platform/XWindowsScreen.cpp @@ -114,7 +114,7 @@ XWindowsScreen::XWindowsScreen( m_root = m_impl->do_DefaultRootWindow(m_display); saveShape(); m_window = openWindow(); - m_screensaver = new XWindowsScreenSaver(m_display, + m_screensaver = new XWindowsScreenSaver(m_impl, m_display, m_window, getEventTarget(), events); m_keyState = new XWindowsKeyState(m_display, m_xkb, events, m_keyMap); LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_xinerama ? "(xinerama)" : "")); diff --git a/src/lib/platform/XWindowsScreenSaver.cpp b/src/lib/platform/XWindowsScreenSaver.cpp index bc457f92..5c4ef913 100644 --- a/src/lib/platform/XWindowsScreenSaver.cpp +++ b/src/lib/platform/XWindowsScreenSaver.cpp @@ -58,8 +58,9 @@ extern Status DPMSInfo(Display *, CARD16 *, BOOL *); // XWindowsScreenSaver // -XWindowsScreenSaver::XWindowsScreenSaver( - Display* display, Window window, void* eventTarget, IEventQueue* events) : +XWindowsScreenSaver::XWindowsScreenSaver(IXWindowsImpl* impl, Display* display, + Window window, void* eventTarget, + IEventQueue* events) : m_display(display), m_xscreensaverSink(window), m_eventTarget(eventTarget), @@ -72,22 +73,23 @@ XWindowsScreenSaver::XWindowsScreenSaver( m_disablePos(0), m_events(events) { + m_impl = impl; // get atoms - m_atomScreenSaver = XInternAtom(m_display, - "SCREENSAVER", False); - m_atomScreenSaverVersion = XInternAtom(m_display, - "_SCREENSAVER_VERSION", False); - m_atomScreenSaverActivate = XInternAtom(m_display, - "ACTIVATE", False); - m_atomScreenSaverDeactivate = XInternAtom(m_display, - "DEACTIVATE", False); + m_atomScreenSaver = m_impl->XInternAtom(m_display, "SCREENSAVER", False); + m_atomScreenSaverVersion = m_impl->XInternAtom(m_display, + "_SCREENSAVER_VERSION", + False); + m_atomScreenSaverActivate = m_impl->XInternAtom(m_display, "ACTIVATE", + False); + m_atomScreenSaverDeactivate = m_impl->XInternAtom(m_display, "DEACTIVATE", + False); // check for DPMS extension. this is an alternative screen saver // that powers down the display. #if HAVE_X11_EXTENSIONS_DPMS_H int eventBase, errorBase; - if (DPMSQueryExtension(m_display, &eventBase, &errorBase)) { - if (DPMSCapable(m_display)) { + if (m_impl->DPMSQueryExtension(m_display, &eventBase, &errorBase)) { + if (m_impl->DPMSCapable(m_display)) { // we have DPMS m_dpms = true; } @@ -98,11 +100,12 @@ XWindowsScreenSaver::XWindowsScreenSaver( bool error = false; { XWindowsUtil::ErrorLock lock(m_display, &error); - Window root = DefaultRootWindow(m_display); + Window root = m_impl->do_DefaultRootWindow(m_display); XWindowAttributes attr; - XGetWindowAttributes(m_display, root, &attr); + m_impl->XGetWindowAttributes(m_display, root, &attr); m_rootEventMask = attr.your_event_mask; - XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); + m_impl->XSelectInput(m_display, root, + m_rootEventMask | SubstructureNotifyMask); } if (error) { LOG((CLOG_DEBUG "didn't set root event mask")); @@ -110,8 +113,8 @@ XWindowsScreenSaver::XWindowsScreenSaver( } // get the built-in settings - XGetScreenSaver(m_display, &m_timeout, &m_interval, - &m_preferBlanking, &m_allowExposures); + m_impl->XGetScreenSaver(m_display, &m_timeout, &m_interval, + &m_preferBlanking, &m_allowExposures); // get the DPMS settings m_dpmsEnabled = isDPMSEnabled(); @@ -137,11 +140,12 @@ XWindowsScreenSaver::~XWindowsScreenSaver() if (m_display != NULL) { enableDPMS(m_dpmsEnabled); - XSetScreenSaver(m_display, m_timeout, m_interval, - m_preferBlanking, m_allowExposures); + m_impl->XSetScreenSaver(m_display, m_timeout, m_interval, + m_preferBlanking, m_allowExposures); clearWatchForXScreenSaver(); XWindowsUtil::ErrorLock lock(m_display); - XSelectInput(m_display, DefaultRootWindow(m_display), m_rootEventMask); + m_impl->XSelectInput(m_display, DefaultRootWindow(m_display), + m_rootEventMask); } } @@ -221,8 +225,8 @@ XWindowsScreenSaver::enable() updateDisableTimer(); // for built-in X screen saver - XSetScreenSaver(m_display, m_timeout, m_interval, - m_preferBlanking, m_allowExposures); + m_impl->XSetScreenSaver(m_display, m_timeout, m_interval, m_preferBlanking, + m_allowExposures); // for DPMS enableDPMS(m_dpmsEnabled); @@ -236,10 +240,10 @@ XWindowsScreenSaver::disable() updateDisableTimer(); // use built-in X screen saver - XGetScreenSaver(m_display, &m_timeout, &m_interval, - &m_preferBlanking, &m_allowExposures); - XSetScreenSaver(m_display, 0, m_interval, - m_preferBlanking, m_allowExposures); + m_impl->XGetScreenSaver(m_display, &m_timeout, &m_interval, + &m_preferBlanking, &m_allowExposures); + m_impl->XSetScreenSaver(m_display, 0, m_interval, m_preferBlanking, + m_allowExposures); // for DPMS m_dpmsEnabled = isDPMSEnabled(); @@ -267,7 +271,7 @@ XWindowsScreenSaver::activate() // try built-in X screen saver if (m_timeout != 0) { - XForceScreenSaver(m_display, ScreenSaverActive); + m_impl->XForceScreenSaver(m_display, ScreenSaverActive); } // try DPMS @@ -297,7 +301,7 @@ XWindowsScreenSaver::deactivate() } // use built-in X screen saver - XForceScreenSaver(m_display, ScreenSaverReset); + m_impl->XForceScreenSaver(m_display, ScreenSaverReset); } bool @@ -326,14 +330,14 @@ XWindowsScreenSaver::findXScreenSaver() Window root = DefaultRootWindow(m_display); Window rw, pw, *cw; unsigned int nc; - if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { + if (m_impl->XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { for (unsigned int i = 0; i < nc; ++i) { if (isXScreenSaver(cw[i])) { setXScreenSaver(cw[i]); break; } } - XFree(cw); + m_impl->XFree(cw); } } @@ -357,7 +361,7 @@ XWindowsScreenSaver::setXScreenSaver(Window window) XWindowAttributes attr; { XWindowsUtil::ErrorLock lock(m_display, &error); - XGetWindowAttributes(m_display, m_xscreensaver, &attr); + m_impl->XGetWindowAttributes(m_display, m_xscreensaver, &attr); } setXScreenSaverActive(!error && attr.map_state != IsUnmapped); @@ -430,7 +434,7 @@ XWindowsScreenSaver::sendXScreenSaverCommand(Atom cmd, long arg1, long arg2) bool error = false; { XWindowsUtil::ErrorLock lock(m_display, &error); - XSendEvent(m_display, m_xscreensaver, False, 0, &event); + m_impl->XSendEvent(m_display, m_xscreensaver, False, 0, &event); } if (error) { findXScreenSaver(); @@ -447,11 +451,11 @@ XWindowsScreenSaver::watchForXScreenSaver() Window root = DefaultRootWindow(m_display); Window rw, pw, *cw; unsigned int nc; - if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { + if (m_impl->XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { for (unsigned int i = 0; i < nc; ++i) { addWatchXScreenSaver(cw[i]); } - XFree(cw); + m_impl->XFree(cw); } // now check for xscreensaver window in case it set the property @@ -469,7 +473,7 @@ XWindowsScreenSaver::clearWatchForXScreenSaver() XWindowsUtil::ErrorLock lock(m_display); for (WatchList::iterator index = m_watchWindows.begin(); index != m_watchWindows.end(); ++index) { - XSelectInput(m_display, index->first, index->second); + m_impl->XSelectInput(m_display, index->first, index->second); } m_watchWindows.clear(); } @@ -482,7 +486,7 @@ XWindowsScreenSaver::addWatchXScreenSaver(Window window) XWindowAttributes attr; { XWindowsUtil::ErrorLock lock(m_display, &error); - XGetWindowAttributes(m_display, window, &attr); + m_impl->XGetWindowAttributes(m_display, window, &attr); } // if successful and window uses override_redirect (like xscreensaver @@ -491,8 +495,8 @@ XWindowsScreenSaver::addWatchXScreenSaver(Window window) error = false; { XWindowsUtil::ErrorLock lock(m_display, &error); - XSelectInput(m_display, window, - attr.your_event_mask | PropertyChangeMask); + m_impl->XSelectInput(m_display, window, + attr.your_event_mask | PropertyChangeMask); } if (!error) { // if successful then add the window to our list @@ -535,7 +539,7 @@ XWindowsScreenSaver::handleDisableTimer(const Event&, void*) event.xmotion.same_screen = True; XWindowsUtil::ErrorLock lock(m_display); - XSendEvent(m_display, m_xscreensaver, False, 0, &event); + m_impl->XSendEvent(m_display, m_xscreensaver, False, 0, &event); m_disablePos = 20 - m_disablePos; } @@ -548,7 +552,8 @@ XWindowsScreenSaver::activateDPMS(bool activate) if (m_dpms) { // DPMSForceLevel will generate a BadMatch if DPMS is disabled XWindowsUtil::ErrorLock lock(m_display); - DPMSForceLevel(m_display, activate ? DPMSModeStandby : DPMSModeOn); + m_impl->DPMSForceLevel(m_display, + activate ? DPMSModeStandby : DPMSModeOn); } #endif } @@ -559,10 +564,10 @@ XWindowsScreenSaver::enableDPMS(bool enable) #if HAVE_X11_EXTENSIONS_DPMS_H if (m_dpms) { if (enable) { - DPMSEnable(m_display); + m_impl->DPMSEnable(m_display); } else { - DPMSDisable(m_display); + m_impl->DPMSDisable(m_display); } } #endif @@ -575,7 +580,7 @@ XWindowsScreenSaver::isDPMSEnabled() const if (m_dpms) { CARD16 level; BOOL state; - DPMSInfo(m_display, &level, &state); + m_impl->DPMSInfo(m_display, &level, &state); return (state != False); } else { @@ -593,7 +598,7 @@ XWindowsScreenSaver::isDPMSActivated() const if (m_dpms) { CARD16 level; BOOL state; - DPMSInfo(m_display, &level, &state); + m_impl->DPMSInfo(m_display, &level, &state); return (level != DPMSModeOn); } else { diff --git a/src/lib/platform/XWindowsScreenSaver.h b/src/lib/platform/XWindowsScreenSaver.h index db85f41a..1761db28 100644 --- a/src/lib/platform/XWindowsScreenSaver.h +++ b/src/lib/platform/XWindowsScreenSaver.h @@ -21,6 +21,7 @@ #include "barrier/IScreenSaver.h" #include "base/IEventQueue.h" #include "common/stdmap.h" +#include "XWindowsImpl.h" #if X_DISPLAY_MISSING # error X11 is required to build barrier @@ -34,7 +35,8 @@ class EventQueueTimer; //! X11 screen saver implementation class XWindowsScreenSaver : public IScreenSaver { public: - XWindowsScreenSaver(Display*, Window, void* eventTarget, IEventQueue* events); + XWindowsScreenSaver(IXWindowsImpl* impl, Display*, Window, + void* eventTarget, IEventQueue* events); virtual ~XWindowsScreenSaver(); //! @name manipulators @@ -112,6 +114,8 @@ private: private: typedef std::map WatchList; + IXWindowsImpl* m_impl; + // the X display Display* m_display;