1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3#include "qxcbatom.h"
4
5#include <QtCore/qglobal.h>
6
7#include <string.h>
8
9#include <algorithm>
10
11static const char *xcb_atomnames = {
12 // window-manager <-> client protocols
13 "WM_PROTOCOLS\0"
14 "WM_DELETE_WINDOW\0"
15 "WM_TAKE_FOCUS\0"
16 "_NET_WM_PING\0"
17 "_NET_WM_CONTEXT_HELP\0"
18 "_NET_WM_SYNC_REQUEST\0"
19 "_NET_WM_SYNC_REQUEST_COUNTER\0"
20 "MANAGER\0"
21 "_NET_SYSTEM_TRAY_OPCODE\0"
22
23 // ICCCM window state
24 "WM_STATE\0"
25 "WM_CHANGE_STATE\0"
26 "WM_CLASS\0"
27 "WM_NAME\0"
28
29 // Session management
30 "WM_CLIENT_LEADER\0"
31 "WM_WINDOW_ROLE\0"
32 "SM_CLIENT_ID\0"
33 "WM_CLIENT_MACHINE\0"
34
35 // Clipboard
36 "CLIPBOARD\0"
37 "INCR\0"
38 "TARGETS\0"
39 "MULTIPLE\0"
40 "TIMESTAMP\0"
41 "SAVE_TARGETS\0"
42 "CLIP_TEMPORARY\0"
43 "_QT_SELECTION\0"
44 "_QT_CLIPBOARD_SENTINEL\0"
45 "_QT_SELECTION_SENTINEL\0"
46 "CLIPBOARD_MANAGER\0"
47
48 "RESOURCE_MANAGER\0"
49
50 "_XSETROOT_ID\0"
51
52 "_QT_SCROLL_DONE\0"
53 "_QT_INPUT_ENCODING\0"
54
55 "_QT_CLOSE_CONNECTION\0"
56
57 "_QT_GET_TIMESTAMP\0"
58
59 "_MOTIF_WM_HINTS\0"
60
61 "DTWM_IS_RUNNING\0"
62 "ENLIGHTENMENT_DESKTOP\0"
63 "_DT_SAVE_MODE\0"
64 "_SGI_DESKS_MANAGER\0"
65
66 // EWMH (aka NETWM)
67 "_NET_SUPPORTED\0"
68 "_NET_VIRTUAL_ROOTS\0"
69 "_NET_WORKAREA\0"
70
71 "_NET_MOVERESIZE_WINDOW\0"
72 "_NET_WM_MOVERESIZE\0"
73
74 "_NET_WM_NAME\0"
75 "_NET_WM_ICON_NAME\0"
76 "_NET_WM_ICON\0"
77
78 "_NET_WM_PID\0"
79
80 "_NET_WM_WINDOW_OPACITY\0"
81
82 "_NET_WM_STATE\0"
83 "_NET_WM_STATE_ABOVE\0"
84 "_NET_WM_STATE_BELOW\0"
85 "_NET_WM_STATE_FULLSCREEN\0"
86 "_NET_WM_STATE_MAXIMIZED_HORZ\0"
87 "_NET_WM_STATE_MAXIMIZED_VERT\0"
88 "_NET_WM_STATE_MODAL\0"
89 "_NET_WM_STATE_STAYS_ON_TOP\0"
90 "_NET_WM_STATE_DEMANDS_ATTENTION\0"
91 "_NET_WM_STATE_HIDDEN\0"
92
93 "_NET_WM_USER_TIME\0"
94 "_NET_WM_USER_TIME_WINDOW\0"
95 "_NET_WM_FULL_PLACEMENT\0"
96
97 "_NET_WM_WINDOW_TYPE\0"
98 "_NET_WM_WINDOW_TYPE_DESKTOP\0"
99 "_NET_WM_WINDOW_TYPE_DOCK\0"
100 "_NET_WM_WINDOW_TYPE_TOOLBAR\0"
101 "_NET_WM_WINDOW_TYPE_MENU\0"
102 "_NET_WM_WINDOW_TYPE_UTILITY\0"
103 "_NET_WM_WINDOW_TYPE_SPLASH\0"
104 "_NET_WM_WINDOW_TYPE_DIALOG\0"
105 "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\0"
106 "_NET_WM_WINDOW_TYPE_POPUP_MENU\0"
107 "_NET_WM_WINDOW_TYPE_TOOLTIP\0"
108 "_NET_WM_WINDOW_TYPE_NOTIFICATION\0"
109 "_NET_WM_WINDOW_TYPE_COMBO\0"
110 "_NET_WM_WINDOW_TYPE_DND\0"
111 "_NET_WM_WINDOW_TYPE_NORMAL\0"
112 "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0"
113
114 "_KDE_NET_WM_DESKTOP_FILE\0"
115 "_KDE_NET_WM_FRAME_STRUT\0"
116 "_NET_FRAME_EXTENTS\0"
117
118 "_NET_STARTUP_INFO\0"
119 "_NET_STARTUP_INFO_BEGIN\0"
120 "_NET_STARTUP_ID\0"
121
122 "_NET_SUPPORTING_WM_CHECK\0"
123
124 "_NET_WM_CM_S0\0"
125
126 "_NET_SYSTEM_TRAY_VISUAL\0"
127
128 "_NET_ACTIVE_WINDOW\0"
129
130 // Property formats
131 "TEXT\0"
132 "UTF8_STRING\0"
133 "CARDINAL\0"
134
135 // xdnd
136 "XdndEnter\0"
137 "XdndPosition\0"
138 "XdndStatus\0"
139 "XdndLeave\0"
140 "XdndDrop\0"
141 "XdndFinished\0"
142 "XdndTypeList\0"
143 "XdndActionList\0"
144
145 "XdndSelection\0"
146
147 "XdndAware\0"
148 "XdndProxy\0"
149
150 "XdndActionCopy\0"
151 "XdndActionLink\0"
152 "XdndActionMove\0"
153 "XdndActionAsk\0"
154 "XdndActionPrivate\0"
155
156 // Xkb
157 "_XKB_RULES_NAMES\0"
158
159 // XEMBED
160 "_XEMBED\0"
161 "_XEMBED_INFO\0"
162
163 // XInput2
164 "Button Left\0"
165 "Button Middle\0"
166 "Button Right\0"
167 "Button Wheel Up\0"
168 "Button Wheel Down\0"
169 "Button Horiz Wheel Left\0"
170 "Button Horiz Wheel Right\0"
171 "Abs MT Position X\0"
172 "Abs MT Position Y\0"
173 "Abs MT Touch Major\0"
174 "Abs MT Touch Minor\0"
175 "Abs MT Orientation\0"
176 "Abs MT Pressure\0"
177 "Abs MT Tracking ID\0"
178 "Max Contacts\0"
179 "Rel X\0"
180 "Rel Y\0"
181 // XInput2 tablet
182 "Abs X\0"
183 "Abs Y\0"
184 "Abs Pressure\0"
185 "Abs Tilt X\0"
186 "Abs Tilt Y\0"
187 "Abs Wheel\0"
188 "Abs Distance\0"
189 "Wacom Serial IDs\0"
190 "INTEGER\0"
191 "Rel Horiz Wheel\0"
192 "Rel Vert Wheel\0"
193 "Rel Horiz Scroll\0"
194 "Rel Vert Scroll\0"
195 "_XSETTINGS_SETTINGS\0"
196 "_COMPIZ_DECOR_PENDING\0"
197 "_COMPIZ_DECOR_REQUEST\0"
198 "_COMPIZ_DECOR_DELETE_PIXMAP\0"
199 "_COMPIZ_TOOLKIT_ACTION\0"
200 "_GTK_APPLICATION_ID\0"
201 "_GTK_LOAD_ICONTHEMES\0"
202 "AT_SPI_BUS\0"
203 "EDID\0"
204 "EDID_DATA\0"
205 "XFree86_DDC_EDID1_RAWDATA\0"
206 "_ICC_PROFILE\0"
207 // \0\0 terminates loop.
208};
209
210QXcbAtom::QXcbAtom()
211{
212}
213
214void QXcbAtom::initialize(xcb_connection_t *connection)
215{
216 initializeAllAtoms(connection);
217}
218
219void QXcbAtom::initializeAllAtoms(xcb_connection_t *connection) {
220 const char *name = xcb_atomnames;
221 size_t name_len;
222 int i = 0;
223 xcb_intern_atom_cookie_t cookies[QXcbAtom::NAtoms];
224
225 while ((name_len = strlen(s: name)) != 0) {
226 cookies[i] = xcb_intern_atom(c: connection, only_if_exists: false, name_len, name);
227 ++i;
228 name += name_len + 1; // jump over the \0
229 }
230
231 Q_ASSERT(i == QXcbAtom::NAtoms);
232
233 for (i = 0; i < QXcbAtom::NAtoms; ++i) {
234 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(c: connection, cookie: cookies[i], e: nullptr);
235 if (reply) {
236 m_allAtoms[i] = reply->atom;
237 free(ptr: reply);
238 }
239 }
240}
241
242QXcbAtom::Atom QXcbAtom::qatom(xcb_atom_t xatom) const
243{
244 return static_cast<QXcbAtom::Atom>(std::find(first: m_allAtoms, last: m_allAtoms + QXcbAtom::NAtoms, val: xatom) - m_allAtoms);
245}
246

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qtbase/src/plugins/platforms/xcb/qxcbatom.cpp