| 34 | // |
| 35 | |
| 36 | XWindowsScreenSaver::XWindowsScreenSaver(Display *display, Window window, void *eventTarget, IEventQueue *events) |
| 37 | : m_display(display), |
| 38 | m_xscreensaverSink(window), |
| 39 | m_eventTarget(eventTarget), |
| 40 | m_events(events) |
| 41 | { |
| 42 | // get atoms |
| 43 | m_atomScreenSaver = XInternAtom(m_display, "SCREENSAVER", False); |
| 44 | m_atomScreenSaverVersion = XInternAtom(m_display, "_SCREENSAVER_VERSION", False); |
| 45 | m_atomScreenSaverActivate = XInternAtom(m_display, "ACTIVATE", False); |
| 46 | m_atomScreenSaverDeactivate = XInternAtom(m_display, "DEACTIVATE", False); |
| 47 | |
| 48 | // check for DPMS extension. this is an alternative screen saver |
| 49 | // that powers down the display. |
| 50 | #if HAVE_X11_EXTENSIONS_DPMS_H |
| 51 | int eventBase; |
| 52 | int errorBase; |
| 53 | if (DPMSQueryExtension(m_display, &eventBase, &errorBase) && DPMSCapable(m_display)) { |
| 54 | // we have DPMS |
| 55 | m_dpms = true; |
| 56 | } |
| 57 | #endif |
| 58 | |
| 59 | // watch top-level windows for changes |
| 60 | bool error = false; |
| 61 | { |
| 62 | XWindowsUtil::ErrorLock lock(m_display, &error); |
| 63 | Window root = DefaultRootWindow(m_display); |
| 64 | XWindowAttributes attr; |
| 65 | XGetWindowAttributes(m_display, root, &attr); |
| 66 | m_rootEventMask = attr.your_event_mask; |
| 67 | XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); |
| 68 | } |
| 69 | if (error) { |
| 70 | LOG_DEBUG("didn't set root event mask"); |
| 71 | m_rootEventMask = 0; |
| 72 | } |
| 73 | |
| 74 | // get the built-in settings |
| 75 | XGetScreenSaver(m_display, &m_timeout, &m_interval, &m_preferBlanking, &m_allowExposures); |
| 76 | |
| 77 | // get the DPMS settings |
| 78 | m_dpmsEnabled = isDPMSEnabled(); |
| 79 | |
| 80 | // get the xscreensaver window, if any |
| 81 | if (!findXScreenSaver()) { |
| 82 | setXScreenSaver(None); |
| 83 | } |
| 84 | |
| 85 | // install disable timer event handler |
| 86 | m_events->addHandler(EventTypes::Timer, this, [this](const auto &) { handleDisableTimer(); }); |
| 87 | } |
| 88 | |
| 89 | XWindowsScreenSaver::~XWindowsScreenSaver() |
| 90 | { |
nothing calls this directly
no test coverage detected