KWayland

dpms_interface.cpp
1 /*
2  SPDX-FileCopyrightText: 2015 Martin Gräßlin <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6 #include "display.h"
7 #include "dpms_interface_p.h"
8 #include "output_interface.h"
9 
10 namespace KWayland
11 {
12 namespace Server
13 {
14 const quint32 DpmsManagerInterface::Private::s_version = 1;
15 
16 #ifndef K_DOXYGEN
17 const struct org_kde_kwin_dpms_manager_interface DpmsManagerInterface::Private::s_interface = {getDpmsCallback};
18 #endif
19 
20 DpmsManagerInterface::Private::Private(DpmsManagerInterface *qptr, Display *d)
21  : Global::Private(d, &org_kde_kwin_dpms_manager_interface, s_version)
22  , q(qptr)
23 {
24 }
25 
26 void DpmsManagerInterface::Private::bind(wl_client *client, uint32_t version, uint32_t id)
27 {
28  auto c = display->getConnection(client);
29  wl_resource *dpms = c->createResource(&org_kde_kwin_dpms_manager_interface, qMin(version, s_version), id);
30  if (!dpms) {
31  wl_client_post_no_memory(client);
32  return;
33  }
34  wl_resource_set_implementation(dpms, &s_interface, this, nullptr);
35 }
36 
37 void DpmsManagerInterface::Private::getDpmsCallback(wl_client *client, wl_resource *resource, uint32_t id, wl_resource *output)
38 {
39  auto p = Private::cast(resource);
40  auto c = p->display->getConnection(client);
41  OutputInterface *o = OutputInterface::get(output);
42  DpmsInterface *dpms = new DpmsInterface(o, resource, p->q);
43  dpms->create(c, wl_resource_get_version(resource), id);
44  if (!dpms->resource()) {
45  wl_resource_post_no_memory(resource);
46  return;
47  }
48  dpms->sendSupported();
49  dpms->sendMode();
50  dpms->sendDone();
51 }
52 
53 DpmsManagerInterface::DpmsManagerInterface(Display *display, QObject *parent)
54  : Global(new Private(this, display), parent)
55 {
56 }
57 
58 DpmsManagerInterface::~DpmsManagerInterface() = default;
59 
60 #ifndef K_DOXYGEN
61 const struct org_kde_kwin_dpms_interface DpmsInterface::Private::s_interface = {setCallback, resourceDestroyedCallback};
62 #endif
63 
64 DpmsInterface::Private::Private(DpmsInterface *q, DpmsManagerInterface *g, wl_resource *parentResource, OutputInterface *outputInterface)
65  : Resource::Private(q, g, parentResource, &org_kde_kwin_dpms_interface, &s_interface)
66  , output(outputInterface)
67 {
68 }
69 
70 void DpmsInterface::Private::setCallback(wl_client *client, wl_resource *resource, uint32_t mode)
71 {
72  Q_UNUSED(client)
73  OutputInterface::DpmsMode dpmsMode;
74  switch (mode) {
75  case ORG_KDE_KWIN_DPMS_MODE_ON:
76  dpmsMode = OutputInterface::DpmsMode::On;
77  break;
78  case ORG_KDE_KWIN_DPMS_MODE_STANDBY:
79  dpmsMode = OutputInterface::DpmsMode::Standby;
80  break;
81  case ORG_KDE_KWIN_DPMS_MODE_SUSPEND:
82  dpmsMode = OutputInterface::DpmsMode::Suspend;
83  break;
84  case ORG_KDE_KWIN_DPMS_MODE_OFF:
85  dpmsMode = OutputInterface::DpmsMode::Off;
86  break;
87  default:
88  return;
89  }
90  Q_EMIT cast<Private>(resource)->output->dpmsModeRequested(dpmsMode);
91 }
92 
93 DpmsInterface::DpmsInterface(OutputInterface *output, wl_resource *parentResource, DpmsManagerInterface *manager)
94  : Resource(new Private(this, manager, parentResource, output))
95 {
96  connect(output, &OutputInterface::dpmsSupportedChanged, this, [this] {
97  sendSupported();
98  sendDone();
99  });
100  connect(output, &OutputInterface::dpmsModeChanged, this, [this] {
101  sendMode();
102  sendDone();
103  });
104 }
105 
106 DpmsInterface::~DpmsInterface() = default;
107 
108 void DpmsInterface::sendSupported()
109 {
110  Q_D();
111  org_kde_kwin_dpms_send_supported(d->resource, d->output->isDpmsSupported() ? 1 : 0);
112 }
113 
114 void DpmsInterface::sendMode()
115 {
116  Q_D();
117  const auto mode = d->output->dpmsMode();
118  org_kde_kwin_dpms_mode wlMode;
119  switch (mode) {
120  case OutputInterface::DpmsMode::On:
121  wlMode = ORG_KDE_KWIN_DPMS_MODE_ON;
122  break;
123  case OutputInterface::DpmsMode::Standby:
124  wlMode = ORG_KDE_KWIN_DPMS_MODE_STANDBY;
125  break;
126  case OutputInterface::DpmsMode::Suspend:
127  wlMode = ORG_KDE_KWIN_DPMS_MODE_SUSPEND;
128  break;
129  case OutputInterface::DpmsMode::Off:
130  wlMode = ORG_KDE_KWIN_DPMS_MODE_OFF;
131  break;
132  default:
133  Q_UNREACHABLE();
134  }
135  org_kde_kwin_dpms_send_mode(d->resource, wlMode);
136 }
137 
138 void DpmsInterface::sendDone()
139 {
140  Q_D();
141  org_kde_kwin_dpms_send_done(d->resource);
142  client()->flush();
143 }
144 
145 DpmsInterface::Private *DpmsInterface::d_func() const
146 {
147  return reinterpret_cast<Private *>(d.data());
148 }
149 
150 }
151 }
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QPointer< Output > output() const
Definition: dpms.cpp:248
Q_D(Todo)
virtual QVariant get(ScriptableExtension *callerPrincipal, quint64 objId, const QString &propName)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Feb 7 2023 03:56:21 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.