Changeset View
Changeset View
Standalone View
Standalone View
src/server/keystate_interface.cpp
Show All 19 Lines | |||||
20 | 20 | | |||
21 | #include "keystate_interface.h" | 21 | #include "keystate_interface.h" | ||
22 | #include "global_p.h" | 22 | #include "global_p.h" | ||
23 | #include "display.h" | 23 | #include "display.h" | ||
24 | 24 | | |||
25 | #include <QDebug> | 25 | #include <QDebug> | ||
26 | #include <QVector> | 26 | #include <QVector> | ||
27 | #include <wayland-server.h> | 27 | #include <wayland-server.h> | ||
28 | #include <wayland-keystate-server-protocol.h> | 28 | #include <qwayland-server-keystate.h> | ||
29 | 29 | | |||
30 | namespace KWayland | 30 | namespace KWayland | ||
31 | { | 31 | { | ||
32 | namespace Server | 32 | namespace Server | ||
33 | { | 33 | { | ||
34 | 34 | | |||
35 | class KeyStateInterface::Private : public Global::Private | 35 | class KeyStateInterface::Private : public Global::Private, public QtWaylandServer::org_kde_kwin_keystate | ||
36 | { | 36 | { | ||
37 | public: | 37 | public: | ||
38 | Private(Display *d) | 38 | Private(Display *d) | ||
39 | : Global::Private(d, &org_kde_kwin_keystate_interface, s_version) | 39 | : Global::Private(d, &org_kde_kwin_keystate_interface, s_version) | ||
40 | {} | 40 | {} | ||
41 | 41 | | |||
42 | void bind(wl_client * client, uint32_t version, uint32_t id) override { | 42 | void bind(wl_client * client, uint32_t version, uint32_t id) override { | ||
43 | auto c = display->getConnection(client); | 43 | add(client, id, version); | ||
44 | wl_resource *resource = c->createResource(&org_kde_kwin_keystate_interface, qMin(version, s_version), id); | | |||
45 | if (!resource) { | | |||
46 | wl_client_post_no_memory(client); | | |||
47 | return; | | |||
48 | } | 44 | } | ||
49 | wl_resource_set_implementation(resource, &s_interface, this, unbind); | | |||
50 | m_resources << resource; | | |||
51 | } | | |||
52 | | ||||
53 | static void unbind(wl_resource *resource) { | | |||
54 | auto *d = reinterpret_cast<Private*>(wl_resource_get_user_data(resource)); | | |||
55 | d->m_resources.removeAll(resource); | | |||
56 | } | | |||
57 | | ||||
58 | 45 | | |||
59 | static void fetchStatesCallback(struct wl_client */*client*/, struct wl_resource *resource) { | 46 | void org_kde_kwin_keystate_fetchStates(QtWaylandServer::org_kde_kwin_keystate::Resource * resource) override { | ||
60 | auto s = reinterpret_cast<KeyStateInterface::Private*>(wl_resource_get_user_data(resource)); | 47 | for (int i=0; i<m_keyStates.count(); ++i) | ||
61 | 48 | send_stateChanged(resource->handle, i, m_keyStates[i]); | |||
62 | for (int i=0; i<s->m_keyStates.count(); ++i) | | |||
63 | org_kde_kwin_keystate_send_stateChanged(resource, i, s->m_keyStates[i]); | | |||
64 | } | 49 | } | ||
65 | 50 | | |||
66 | static const quint32 s_version; | 51 | static const quint32 s_version; | ||
67 | QVector<wl_resource*> m_resources; | | |||
68 | QVector<State> m_keyStates = QVector<State>(3, Unlocked); | 52 | QVector<State> m_keyStates = QVector<State>(3, Unlocked); | ||
69 | static const struct org_kde_kwin_keystate_interface s_interface; | 53 | static const struct org_kde_kwin_keystate_interface s_interface; | ||
70 | }; | 54 | }; | ||
71 | 55 | | |||
72 | const quint32 KeyStateInterface::Private::s_version = 1; | 56 | const quint32 KeyStateInterface::Private::s_version = 1; | ||
73 | 57 | | |||
74 | KeyStateInterface::KeyStateInterface(Display* d, QObject* parent) | 58 | KeyStateInterface::KeyStateInterface(Display* d, QObject* parent) | ||
75 | : Global(new Private(d), parent) | 59 | : Global(new Private(d), parent) | ||
76 | {} | 60 | {} | ||
77 | 61 | | |||
78 | KeyStateInterface::~KeyStateInterface() = default; | 62 | KeyStateInterface::~KeyStateInterface() = default; | ||
79 | 63 | | |||
80 | const struct org_kde_kwin_keystate_interface KeyStateInterface::Private::s_interface = { | | |||
81 | fetchStatesCallback | | |||
82 | }; | | |||
83 | | ||||
84 | void KeyStateInterface::setState(KeyStateInterface::Key key, KeyStateInterface::State state) | 64 | void KeyStateInterface::setState(KeyStateInterface::Key key, KeyStateInterface::State state) | ||
85 | { | 65 | { | ||
86 | auto dptr = static_cast<KeyStateInterface::Private*>(d.data()); | 66 | auto dptr = static_cast<KeyStateInterface::Private*>(d.data()); | ||
87 | dptr->m_keyStates[int(key)] = state; | 67 | dptr->m_keyStates[int(key)] = state; | ||
88 | 68 | | |||
89 | for(auto r : qAsConst(dptr->m_resources)) { | 69 | for (auto r : dptr->resourceMap()) | ||
90 | org_kde_kwin_keystate_send_stateChanged(r, int(key), int(state)); | 70 | dptr->send_stateChanged(r->handle, int(key), int(state)); | ||
91 | } | | |||
92 | } | 71 | } | ||
93 | 72 | | |||
94 | } | 73 | } | ||
95 | 74 | | |||
96 | } | 75 | } |