6 #include "idle_interface.h" 9 #include "resource_p.h" 10 #include "seat_interface.h" 15 #include <wayland-server.h> 16 #include <wayland-idle-server-protocol.h> 23 class IdleInterface::Private :
public Global::Private
26 Private(IdleInterface *q, Display *d);
32 void bind(wl_client *client, uint32_t version, uint32_t
id)
override;
33 static void getIdleTimeoutCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *seat, uint32_t timeout);
35 static void unbind(wl_resource *resource);
36 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);
58 static void simulateUserActivityCallback(wl_client *client, wl_resource *resource);
59 IdleTimeoutInterface *q_func() {
60 return reinterpret_cast<IdleTimeoutInterface*
>(q);
62 static const struct org_kde_kwin_idle_timeout_interface s_interface;
65 const quint32 IdleInterface::Private::s_version = 1;
68 const struct org_kde_kwin_idle_interface IdleInterface::Private::s_interface = {
69 getIdleTimeoutCallback
73 IdleInterface::Private::Private(IdleInterface *q, Display *d)
74 : Global::Private(d, &org_kde_kwin_idle_interface, s_version)
79 void IdleInterface::Private::getIdleTimeoutCallback(wl_client *client, wl_resource *resource, uint32_t
id, wl_resource *seat, uint32_t timeout)
81 Private *p = cast(resource);
82 SeatInterface *s = SeatInterface::get(seat);
84 IdleTimeoutInterface *idleTimeout =
new IdleTimeoutInterface(s, p->q, resource);
85 idleTimeout->create(p->display->getConnection(client), wl_resource_get_version(resource), id);
86 if (!idleTimeout->resource()) {
87 wl_resource_post_no_memory(resource);
91 p->idleTimeouts << idleTimeout;
92 QObject::connect(idleTimeout, &IdleTimeoutInterface::aboutToBeUnbound, p->q, [p, idleTimeout]() {
93 p->idleTimeouts.removeOne(idleTimeout);
95 idleTimeout->d_func()->setup(timeout);
98 void IdleInterface::Private::bind(wl_client *client, uint32_t version, uint32_t
id)
100 auto c = display->getConnection(client);
101 wl_resource *resource = c->createResource(&org_kde_kwin_idle_interface, qMin(version, s_version),
id);
103 wl_client_post_no_memory(client);
106 wl_resource_set_implementation(resource, &s_interface,
this, unbind);
110 void IdleInterface::Private::unbind(wl_resource *resource)
115 IdleInterface::IdleInterface(Display *display,
QObject *
parent)
116 : Global(new Private(this, display), parent)
120 IdleInterface::~IdleInterface() =
default;
122 void IdleInterface::inhibit()
126 if (d->inhibitCount == 1) {
127 Q_EMIT inhibitedChanged();
131 void IdleInterface::uninhibit()
135 if (d->inhibitCount == 0) {
136 Q_EMIT inhibitedChanged();
140 bool IdleInterface::isInhibited()
const 143 return d->inhibitCount > 0;
146 void IdleInterface::simulateUserActivity()
149 for (
auto i : qAsConst(d->idleTimeouts)) {
150 i->d_func()->simulateUserActivity();
154 IdleInterface::Private *IdleInterface::d_func()
const 156 return reinterpret_cast<Private*
>(d.
data());
160 const struct org_kde_kwin_idle_timeout_interface IdleTimeoutInterface::Private::s_interface = {
161 resourceDestroyedCallback,
162 simulateUserActivityCallback
166 IdleTimeoutInterface::Private::Private(
SeatInterface *seat, IdleTimeoutInterface *q,
IdleInterface *manager, wl_resource *parentResource)
167 : Resource::Private(q, manager, parentResource, &org_kde_kwin_idle_timeout_interface, &s_interface)
172 IdleTimeoutInterface::Private::~Private() =
default;
174 void IdleTimeoutInterface::Private::simulateUserActivityCallback(wl_client *client, wl_resource *resource)
177 Private *p =
reinterpret_cast<Private*
>(wl_resource_get_user_data(resource));
178 p->simulateUserActivity();
181 void IdleTimeoutInterface::Private::simulateUserActivity()
187 if (qobject_cast<IdleInterface*>(global)->isInhibited()) {
191 if (!timer->isActive() && resource) {
192 org_kde_kwin_idle_timeout_send_resumed(resource);
197 void IdleTimeoutInterface::Private::setup(quint32 timeout)
203 timer->setSingleShot(
true);
205 timer->setInterval(qMax(timeout, 5000u));
209 org_kde_kwin_idle_timeout_send_idle(resource);
213 if (qobject_cast<IdleInterface*>(global)->isInhibited()) {
221 :
Resource(
new Private(seat,
this, parent, parentResource))
223 connect(seat, &SeatInterface::timestampChanged,
this,
226 d->simulateUserActivity();
229 connect(parent, &IdleInterface::inhibitedChanged,
this,
236 if (qobject_cast<IdleInterface*>(d->global)->isInhibited()) {
237 if (!d->timer->isActive() && d->resource) {
238 org_kde_kwin_idle_timeout_send_resumed(d->resource);
248 IdleTimeoutInterface::~IdleTimeoutInterface() =
default;
250 IdleTimeoutInterface::Private *IdleTimeoutInterface::d_func()
const 252 return reinterpret_cast<IdleTimeoutInterface::Private*
>(d.data());
void simulateUserActivity()
Calling this method allows the Compositor to simulate user activity.
Represents a Seat on the Wayland Display.
Global representing the org_kde_kwin_idle interface.
Represents a bound Resource.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const