File indexing completed on 2024-04-28 03:54:38

0001 /* This file is part of the KDE libraries
0002  * SPDX-FileCopyrightText: 2009 Dario Freddi <drf at kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #ifndef XSYNCBASEDPOLLER_H
0008 #define XSYNCBASEDPOLLER_H
0009 
0010 #include "kabstractidletimepoller_p.h"
0011 #include <QHash>
0012 
0013 #include <config-kidletime.h>
0014 
0015 #include <X11/Xlib.h>
0016 #include <X11/extensions/sync.h>
0017 #include <xcb/xcb.h>
0018 
0019 #include "fixx11h.h"
0020 
0021 class XSyncBasedPoller : public KAbstractIdleTimePoller
0022 {
0023     Q_OBJECT
0024     Q_PLUGIN_METADATA(IID KAbstractIdleTimePoller_iid FILE "xcb.json")
0025     Q_INTERFACES(KAbstractIdleTimePoller)
0026 
0027 public:
0028     static XSyncBasedPoller *instance();
0029 
0030     explicit XSyncBasedPoller(QObject *parent = nullptr);
0031     ~XSyncBasedPoller() override;
0032 
0033     bool isAvailable() override;
0034     bool setUpPoller() override;
0035     void unloadPoller() override;
0036 
0037     bool xcbEvent(xcb_generic_event_t *event);
0038 
0039     QList<int> timeouts() const override;
0040 
0041 public Q_SLOTS:
0042     void addTimeout(int nextTimeout) override;
0043     void removeTimeout(int nextTimeout) override;
0044 
0045     int forcePollRequest() override;
0046     void catchIdleEvent() override;
0047     void stopCatchingIdleEvents() override;
0048     void simulateUserActivity() override;
0049 
0050 private Q_SLOTS:
0051     int poll();
0052     void reloadAlarms();
0053 
0054 private:
0055     void setAlarm(Display *dpy, XSyncAlarm *alarm, XSyncCounter counter, XSyncTestType test, XSyncValue value);
0056 
0057 private:
0058     Display *m_display;
0059     xcb_connection_t *m_xcb_connection;
0060 
0061     int m_sync_event;
0062     XSyncCounter m_idleCounter;
0063     QHash<int, XSyncAlarm> m_timeoutAlarm;
0064     XSyncAlarm m_resetAlarm;
0065     bool m_available;
0066 };
0067 
0068 #endif /* XSYNCBASEDPOLLER_H */