6 #include "idle_interface.h"
9 #include "resource_p.h"
10 #include "seat_interface.h"
15 #include <wayland-idle-server-protocol.h>
16 #include <wayland-server.h>
22 class IdleInterface::Private :
public Global::Private
25 Private(IdleInterface *q, Display *d);
31 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
32 static void getIdleTimeoutCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *seat, uint32_t timeout);
34 static void unbind(wl_resource *resource);
35 static Private *cast(wl_resource *r)
37 return reinterpret_cast<Private *
>(wl_resource_get_user_data(r));
41 static const struct org_kde_kwin_idle_interface s_interface;
42 static const quint32 s_version;
45 class IdleTimeoutInterface::Private :
public Resource::Private
48 Private(SeatInterface *seat, IdleTimeoutInterface *q, IdleInterface *manager, wl_resource *parentResource);
50 void setup(quint32 timeout);
52 void simulateUserActivity();
58 static void simulateUserActivityCallback(wl_client *client, wl_resource *resource);
59 IdleTimeoutInterface *q_func()
61 return reinterpret_cast<IdleTimeoutInterface *
>(q);
63 static const struct org_kde_kwin_idle_timeout_interface s_interface;
66 const quint32 IdleInterface::Private::s_version = 1;
69 const struct org_kde_kwin_idle_interface IdleInterface::Private::s_interface = {getIdleTimeoutCallback};
72 IdleInterface::Private::Private(IdleInterface *q, Display *d)
73 : Global::Private(d, &org_kde_kwin_idle_interface, s_version)
78 void IdleInterface::Private::getIdleTimeoutCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *seat, uint32_t timeout)
80 Private *p = cast(resource);
83 IdleTimeoutInterface *idleTimeout =
new IdleTimeoutInterface(s, p->q, resource);
84 idleTimeout->create(p->display->getConnection(client), wl_resource_get_version(resource),
id);
85 if (!idleTimeout->resource()) {
86 wl_resource_post_no_memory(resource);
90 p->idleTimeouts << idleTimeout;
91 QObject::connect(idleTimeout, &IdleTimeoutInterface::aboutToBeUnbound, p->q, [p, idleTimeout]() {
92 p->idleTimeouts.removeOne(idleTimeout);
94 idleTimeout->d_func()->setup(timeout);
97 void IdleInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
99 auto c = display->getConnection(client);
100 wl_resource *resource = c->createResource(&org_kde_kwin_idle_interface, qMin(version, s_version),
id);
102 wl_client_post_no_memory(client);
105 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
109 void IdleInterface::Private::unbind(wl_resource *resource)
114 IdleInterface::IdleInterface(Display *display,
QObject *parent)
115 : Global(new Private(this, display), parent)
119 IdleInterface::~IdleInterface() =
default;
121 void IdleInterface::inhibit()
125 if (d->inhibitCount == 1) {
126 Q_EMIT inhibitedChanged();
130 void IdleInterface::uninhibit()
134 if (d->inhibitCount == 0) {
135 Q_EMIT inhibitedChanged();
139 bool IdleInterface::isInhibited()
const
142 return d->inhibitCount > 0;
145 void IdleInterface::simulateUserActivity()
148 for (
auto i : std::as_const(d->idleTimeouts)) {
149 i->d_func()->simulateUserActivity();
153 IdleInterface::Private *IdleInterface::d_func()
const
155 return reinterpret_cast<Private *
>(d.data());
159 const struct org_kde_kwin_idle_timeout_interface IdleTimeoutInterface::Private::s_interface = {resourceDestroyedCallback, simulateUserActivityCallback};
162 IdleTimeoutInterface::Private::Private(SeatInterface *seat, IdleTimeoutInterface *q, IdleInterface *manager, wl_resource *parentResource)
163 :
Resource::Private(q, manager, parentResource, &org_kde_kwin_idle_timeout_interface, &s_interface)
168 IdleTimeoutInterface::Private::~Private() =
default;
170 void IdleTimeoutInterface::Private::simulateUserActivityCallback(wl_client *client, wl_resource *resource)
173 Private *p =
reinterpret_cast<Private *
>(wl_resource_get_user_data(resource));
174 p->simulateUserActivity();
177 void IdleTimeoutInterface::Private::simulateUserActivity()
183 if (qobject_cast<IdleInterface *>(global)->isInhibited()) {
187 if (!timer->isActive() && resource) {
188 org_kde_kwin_idle_timeout_send_resumed(resource);
193 void IdleTimeoutInterface::Private::setup(quint32 timeout)
199 timer->setSingleShot(
true);
201 timer->setInterval(qMax(timeout, 5000u));
204 org_kde_kwin_idle_timeout_send_idle(resource);
207 if (qobject_cast<IdleInterface *>(global)->isInhibited()) {
214 IdleTimeoutInterface::IdleTimeoutInterface(SeatInterface *seat, IdleInterface *parent, wl_resource *parentResource)
215 :
Resource(new Private(seat, this, parent, parentResource))
217 connect(seat, &SeatInterface::timestampChanged,
this, [
this] {
219 d->simulateUserActivity();
227 if (qobject_cast<IdleInterface *>(d->global)->isInhibited()) {
228 if (!d->timer->isActive() && d->resource) {
229 org_kde_kwin_idle_timeout_send_resumed(d->resource);
238 IdleTimeoutInterface::~IdleTimeoutInterface() =
default;
240 IdleTimeoutInterface::Private *IdleTimeoutInterface::d_func()
const
242 return reinterpret_cast<IdleTimeoutInterface::Private *
>(d.data());