9#include <QGuiApplication>
10#include <QLoggingCategory>
11#include <QWaylandClientExtensionTemplate>
12#include <QtWaylandClientVersion>
14#include <qpa/qplatformnativeinterface.h>
16#include "qwayland-ext-idle-notify-v1.h"
17#include "qwayland-idle.h"
19Q_DECLARE_LOGGING_CATEGORY(POLLER)
20Q_LOGGING_CATEGORY(POLLER,
"kf5idletime_wayland")
32class IdleTimeout : public
QObject
36 IdleTimeout() =
default;
39 void resumeFromIdle();
42class IdleTimeoutKwin :
public IdleTimeout,
public QtWayland::org_kde_kwin_idle_timeout
46 IdleTimeoutKwin(struct ::org_kde_kwin_idle_timeout *
object)
48 , QtWayland::org_kde_kwin_idle_timeout(object)
59 void org_kde_kwin_idle_timeout_idle()
override {
62 void org_kde_kwin_idle_timeout_resumed()
override {
67class IdleTimeoutExt :
public IdleTimeout,
public QtWayland::ext_idle_notification_v1
71 IdleTimeoutExt(struct ::ext_idle_notification_v1 *
object)
73 , QtWayland::ext_idle_notification_v1(object)
85 void ext_idle_notification_v1_idled()
override
89 void ext_idle_notification_v1_resumed()
override
95class IdleManagerKwin :
public QWaylandClientExtensionTemplate<IdleManagerKwin>,
public QtWayland::org_kde_kwin_idle
99 : QWaylandClientExtensionTemplate<IdleManagerKwin>(1)
105class IdleManagerExt :
public QWaylandClientExtensionTemplate<IdleManagerExt>,
public QtWayland::ext_idle_notifier_v1
109 : QWaylandClientExtensionTemplate<IdleManagerExt>(1)
115 if (qGuiApp && isActive()) {
122 : KAbstractIdleTimePoller(parent)
123 , m_idleManagerKwin(new IdleManagerKwin)
124 , m_idleManagerExt(new IdleManagerExt)
128Poller::~Poller() =
default;
130bool Poller::isAvailable()
132 return m_idleManagerKwin->isActive() || m_idleManagerExt->isActive();
135void Poller::addTimeout(
int nextTimeout)
137 if (m_timeouts.
contains(nextTimeout)) {
141 auto timeout = createTimeout(nextTimeout);
146 connect(timeout, &IdleTimeout::idle,
this, [
this, nextTimeout] {
147 Q_EMIT timeoutReached(nextTimeout);
149 connect(timeout, &IdleTimeout::resumeFromIdle,
this, &Poller::resumingFromIdle);
153void Poller::removeTimeout(
int nextTimeout)
155 m_timeouts.
remove(nextTimeout);
163void Poller::catchIdleEvent()
165 if (m_catchResumeTimeout) {
169 if (!isAvailable()) {
173 m_catchResumeTimeout.
reset(createTimeout(0));
174 if (!m_catchResumeTimeout) {
177 connect(m_catchResumeTimeout.
get(), &IdleTimeout::resumeFromIdle,
this, [
this] {
178 stopCatchingIdleEvents();
179 Q_EMIT resumingFromIdle();
183void Poller::stopCatchingIdleEvents()
185 m_catchResumeTimeout.
reset();
188int Poller::forcePollRequest()
190 qCWarning(POLLER) <<
"This plugin does not support polling idle time";
194void Poller::simulateUserActivity()
198IdleTimeout* Poller::createTimeout(
int timeout)
200 QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
201 if (!nativeInterface) {
204 auto seat =
static_cast<wl_seat *
>(nativeInterface->nativeResourceForIntegration(
"wl_seat"));
209 if (m_idleManagerExt->isActive()) {
210 return new IdleTimeoutExt(m_idleManagerExt->get_idle_notification(timeout, seat));
212 if (m_idleManagerKwin->isActive()) {
213 return new IdleTimeoutKwin(m_idleManagerKwin->get_idle_timeout(seat, timeout));
218#include "moc_poller.cpp"
void initialize(StandardShortcut id)
bool contains(const Key &key) const const
iterator insert(const Key &key, const T &value)
bool remove(const Key &key)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)