1 // -*- c++ -*-
2 /* This file is part of the KDE project
3 *
4 * Copyright (C) 2002 Till Krech <till@snafu.de>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 */
21
22 #include "kxeventutil.h"
23
24 #include <X11/Xutil.h>
25 #include <X11/Xatom.h>
26 #include <QStringList>
27
getXAnyEventInfo(XEvent * xevent)28 QString KXEventUtil::getXAnyEventInfo(XEvent *xevent)
29 {
30 XAnyEvent *e = &xevent->xany;
31 QString winname("window");
32 switch (e->type) {
33 case GraphicsExpose:
34 case NoExpose:
35 winname = "drawable";
36 break;
37 case CreateNotify:
38 case ConfigureRequest:
39 winname = "parent";
40 break;
41 case DestroyNotify:
42 case ConfigureNotify:
43 case MapNotify:
44 case ReparentNotify:
45 case UnmapNotify:
46 winname = "event";
47 default:
48 break;
49 }
50 QString s("serial=%1 send_event=%2 display=0x%3 %4=%5");
51 return
52 s.arg(e->serial)
53 .arg(e->send_event)
54 .arg((long)e->display, 0, 16)
55 .arg(winname)
56 .arg(e->window);
57 }
getXButtonEventInfo(XEvent * xevent)58 QString KXEventUtil::getXButtonEventInfo(XEvent *xevent)
59 {
60 XButtonEvent *e = &xevent->xbutton;
61 QString s("root=%1 subwindow=%2 time=%3 x=%4 y=%5 x_root=%6 y_root=%7 state=%8 button=%9");
62 QString t(" same_screen=%1");
63 return
64 s.arg(e->root)
65 .arg(e->subwindow)
66 .arg(e->time)
67 .arg(e->x)
68 .arg(e->y)
69 .arg(e->x_root)
70 .arg(e->y_root)
71 .arg(e->state)
72 .arg(e->button)
73 + t.arg(e->same_screen);
74 }
75
getXKeyEventInfo(XEvent * xevent)76 QString KXEventUtil::getXKeyEventInfo(XEvent *xevent)
77 {
78 XKeyEvent *e = &xevent->xkey;
79 QString s("root=%1 subwindow=%2 time=%3 x=%4 y=%5 x_root=%6 y_root=%7 state=%8 keycode=%9");
80 QString t(" same_screen=%1");
81 return
82 s.arg(e->root)
83 .arg(e->subwindow)
84 .arg(e->time)
85 .arg(e->x)
86 .arg(e->y)
87 .arg(e->x_root)
88 .arg(e->y_root)
89 .arg(e->state)
90 .arg(e->keycode)
91 + t.arg(e->same_screen);
92 }
93
getXMotionEventInfo(XEvent * xevent)94 QString KXEventUtil::getXMotionEventInfo(XEvent *xevent)
95 {
96 XMotionEvent *e = &xevent->xmotion;
97 QString s("root=%1 subwindow=%2 time=%3 x=%4 y=%5 x_root=%6 y_root=%7 state=%8 is_hint=%9");
98 QString t(" same_screen=%1");
99 return
100 s.arg(e->root)
101 .arg(e->subwindow)
102 .arg(e->time)
103 .arg(e->x)
104 .arg(e->y)
105 .arg(e->x_root)
106 .arg(e->y_root)
107 .arg(e->state)
108 .arg(e->is_hint)
109 + t.arg(e->same_screen);
110 }
getXCrossingEventInfo(XEvent * xevent)111 QString KXEventUtil::getXCrossingEventInfo(XEvent *xevent)
112 {
113 XCrossingEvent *e = &xevent->xcrossing;
114 QString ms, ds;
115 switch (e->mode) {
116 case NotifyNormal: ms = "NotifyNormal"; break;
117 case NotifyGrab: ms = "NotifyGrab"; break;
118 case NotifyUngrab: ms = "NotifyUngrab"; break;
119 default: ms = "?";
120 }
121 switch (e->detail) {
122 case NotifyAncestor: ds = "NotifyAncestor"; break;
123 case NotifyVirtual: ds = "NotifyVirtual"; break;
124 case NotifyInferior: ds = "NotifyInferior"; break;
125 case NotifyNonlinear: ds = "NotifyNonlinear"; break;
126 case NotifyNonlinearVirtual: ds = "NotifyNonlinearVirtual"; break;
127 default: ds = "?";
128 }
129
130 QString s("root=%1 subwindow=%2 time=%3 x=%4 y=%5 x_root=%6 y_root=%7 mode=%8=%9 ");
131 QString t("detail=%1=%2 same_screen=%3 focus=%4 state=%5");
132 return
133 s.arg(e->root)
134 .arg(e->subwindow)
135 .arg(e->time)
136 .arg(e->x)
137 .arg(e->y)
138 .arg(e->x_root)
139 .arg(e->y_root)
140 .arg(e->mode).arg(ms)
141 +
142 t.arg(e->detail).arg(ds)
143 .arg(e->same_screen)
144 .arg(e->focus)
145 .arg(e->state);
146 }
getXFocusChangeEventInfo(XEvent * xevent)147 QString KXEventUtil::getXFocusChangeEventInfo(XEvent *xevent)
148 {
149 XFocusChangeEvent *e = &xevent->xfocus;
150 QString s("mode=%1 detail=%2");
151 return
152 s.arg(e->mode)
153 .arg(e->detail);
154 }
getXExposeEventInfo(XEvent * xevent)155 QString KXEventUtil::getXExposeEventInfo(XEvent *xevent)
156 {
157 XExposeEvent *e = &xevent->xexpose;
158 QString s("x=%1 y=%2 width=%3 height=%4 count=%5");
159 return
160 s.arg(e->x)
161 .arg(e->y)
162 .arg(e->width)
163 .arg(e->height)
164 .arg(e->count);
165 }
166
getXGraphicsExposeEventInfo(XEvent * xevent)167 QString KXEventUtil::getXGraphicsExposeEventInfo(XEvent *xevent)
168 {
169 XGraphicsExposeEvent *e = &xevent->xgraphicsexpose;
170 QString s("x=%1 y=%2 width=%3 height=%4 count=%5 major_code=%6 minor_code=%7");
171 return
172 s.arg(e->x)
173 .arg(e->y)
174 .arg(e->width)
175 .arg(e->height)
176 .arg(e->count)
177 .arg(e->major_code)
178 .arg(e->minor_code);
179 }
getXNoExposeEventInfo(XEvent * xevent)180 QString KXEventUtil::getXNoExposeEventInfo(XEvent *xevent)
181 {
182 XNoExposeEvent *e = &xevent->xnoexpose;
183 QString s("major_code=%1 minor_code=%2");
184 return
185 s.arg(e->major_code)
186 .arg(e->minor_code);
187 }
188
getXCreateWindowEventInfo(XEvent * xevent)189 QString KXEventUtil::getXCreateWindowEventInfo(XEvent *xevent)
190 {
191 XCreateWindowEvent *e = &xevent->xcreatewindow;
192 QString s("window=%1 x=%2 y=%3 width=%4 height=%5 border_width=%6 override_redirect=%7");
193 return
194 s.arg(e->window)
195 .arg(e->x)
196 .arg(e->y)
197 .arg(e->width)
198 .arg(e->height)
199 .arg(e->border_width)
200 .arg(e->override_redirect);
201 }
202
getXDestroyWindowEventInfo(XEvent * xevent)203 QString KXEventUtil::getXDestroyWindowEventInfo(XEvent *xevent)
204 {
205 XDestroyWindowEvent *e = &xevent->xdestroywindow;
206 QString s("window=%1");
207 return
208 s.arg(e->window);
209 }
getXMapEventInfo(XEvent * xevent)210 QString KXEventUtil::getXMapEventInfo(XEvent *xevent)
211 {
212 XMapEvent *e = &xevent->xmap;
213 QString s("window=%1 override_redirect=%2");
214 return
215 s.arg(e->window)
216 .arg(e->override_redirect);
217 }
getXMappingEventInfo(XEvent * xevent)218 QString KXEventUtil::getXMappingEventInfo(XEvent *xevent)
219 {
220 XMappingEvent *e = &xevent->xmapping;
221 QString s("request=%1 first_keycode=%2 count=%3");
222 return
223 s.arg(e->request)
224 .arg(e->first_keycode)
225 .arg(e->count);
226 }
getXReparentEventInfo(XEvent * xevent)227 QString KXEventUtil::getXReparentEventInfo(XEvent *xevent)
228 {
229 XReparentEvent *e = &xevent->xreparent;
230 QString s("window=%1 parent=%2 x=%3 y=%4");
231 return
232 s.arg(e->window)
233 .arg(e->parent)
234 .arg(e->x)
235 .arg(e->y);
236 }
getXUnmapEventInfo(XEvent * xevent)237 QString KXEventUtil::getXUnmapEventInfo(XEvent *xevent)
238 {
239 XUnmapEvent *e = &xevent->xunmap;
240 QString s("window=%1 from_configure=%2");
241 return
242 s.arg(e->window)
243 .arg(e->from_configure);
244 }
245
getXConfigureEventInfo(XEvent * xevent)246 QString KXEventUtil::getXConfigureEventInfo(XEvent *xevent)
247 {
248 XConfigureEvent *e = &xevent->xconfigure;
249 QString s("window=%1 x=%2 y=%2 width=%3 height=%4 border_width=%5 above=%6 override_redirect=%7");
250 return
251 s.arg(e->window)
252 .arg(e->x).arg(e->y)
253 .arg(e->width).arg(e->height)
254 .arg(e->border_width)
255 .arg(e->above)
256 .arg(e->override_redirect);
257 }
258
getXConfigureRequestEventInfo(XEvent * xevent)259 QString KXEventUtil::getXConfigureRequestEventInfo(XEvent *xevent)
260 {
261 XConfigureRequestEvent *e = &xevent->xconfigurerequest;
262 unsigned vm = e->value_mask;
263 QStringList vml;
264 if (vm & CWX) {
265 vml.append("CWX");
266 }
267 if (vm & CWY) {
268 vml.append("CWY");
269 }
270 if (vm & CWWidth) {
271 vml.append("CWWidth");
272 }
273 if (vm & CWHeight) {
274 vml.append("CWHeight");
275 }
276 if (vm & CWBorderWidth) {
277 vml.append("CWBorderWidth");
278 }
279 if (vm & CWSibling) {
280 vml.append("CWSibling");
281 }
282 if (vm & CWStackMode) {
283 vml.append("CWStackMode");
284 }
285 QString vms = vml.join("|");
286 QString s("window=%1 x=%2 y=%2 width=%3 height=%4 border_width=%5 above=%6 detail=%7 value_mask=0x%8=%9");
287 return
288 s.arg(e->window)
289 .arg(e->x).arg(e->y)
290 .arg(e->width).arg(e->height)
291 .arg(e->border_width)
292 .arg(e->above)
293 .arg(e->detail)
294 .arg(e->value_mask, 0, 16)
295 .arg(vms);
296 }
getX11EventInfo(XEvent * e)297 QString KXEventUtil::getX11EventInfo(XEvent *e)
298 {
299 QString anyInfo = getXAnyEventInfo(e);
300 QString info = "";
301 QString s;
302 switch (e->type) {
303 case KeyPress:
304 s = "KeyPress";
305 info = getXKeyEventInfo(e);
306 break;
307 case KeyRelease:
308 s = "KeyRelease";
309 info = getXKeyEventInfo(e);
310 break;
311 case ButtonPress:
312 s = "ButtonPress";
313 info = getXButtonEventInfo(e);
314 break;
315 case ButtonRelease:
316 s = "ButtonRelease";
317 info = getXButtonEventInfo(e);
318 break;
319 case MotionNotify:
320 s = "MotionNotify";
321 info = getXMotionEventInfo(e);
322 break;
323 case EnterNotify:
324 s = "EnterNotify";
325 info = getXCrossingEventInfo(e);
326 break;
327 case LeaveNotify:
328 s = "LeaveNotify";
329 info = getXCrossingEventInfo(e);
330 break;
331 case FocusIn:
332 s = "FocusIn";
333 info = getXFocusChangeEventInfo(e);
334 break;
335 case FocusOut:
336 s = "FocusOut";
337 info = getXFocusChangeEventInfo(e);
338 break;
339 case KeymapNotify:
340 s = "KeymapNotify";
341 break;
342 case Expose:
343 s = "Expose";
344 info = getXExposeEventInfo(e);
345 break;
346 case GraphicsExpose:
347 s = "GraphicsExpose";
348 info = getXGraphicsExposeEventInfo(e);
349 break;
350 case NoExpose:
351 info = getXNoExposeEventInfo(e);
352 s = "NoExpose";
353 break;
354 case VisibilityNotify:
355 s = "VisibilityNotify";
356 break;
357 case CreateNotify:
358 s = "CreateNotify";
359 info = getXCreateWindowEventInfo(e);
360 break;
361 case DestroyNotify:
362 s = "DestroyNotify";
363 info = getXDestroyWindowEventInfo(e);
364 break;
365 case UnmapNotify:
366 s = "UnmapNotify";
367 info = getXUnmapEventInfo(e);
368 break;
369 case MapNotify:
370 s = "MapNotify";
371 info = getXMapEventInfo(e);
372 break;
373 case MapRequest:
374 s = "MapRequest";
375 break;
376 case ReparentNotify:
377 s = "ReparentNotify";
378 info = getXReparentEventInfo(e);
379 break;
380 case ConfigureNotify:
381 s = "ConfigureNotify";
382 info = getXConfigureEventInfo(e);
383 break;
384 case ConfigureRequest:
385 s = "ConfigureRequest";
386 info = getXConfigureRequestEventInfo(e);
387 break;
388 case GravityNotify:
389 s = "GravityNotify";
390 break;
391 case ResizeRequest:
392 s = "ResizeRequest";
393 break;
394 case CirculateNotify:
395 s = "CirculateNofify";
396 break;
397 case CirculateRequest:
398 s = "CirculateRequest";
399 break;
400 case PropertyNotify:
401 s = "PropertyNotify";
402 break;
403 case SelectionClear:
404 s = "SelectionClear";
405 break;
406 case SelectionRequest:
407 s = "SelectionRequest";
408 break;
409 case SelectionNotify:
410 s = "SelectionNotify";
411 break;
412 case ColormapNotify:
413 s = "ColormapNotify";
414 break;
415 case ClientMessage:
416 s = "ClientMessage";
417 break;
418 case MappingNotify:
419 s = "MappingNotify";
420 info = getXMappingEventInfo(e);
421 break;
422 case LASTEvent:
423 s = "LASTEvent";
424 break;
425
426 default:
427 s = "Undefined";
428 break;
429 }
430
431 return s + ' ' + anyInfo + ' ' + info;
432 }
433