i3
debug.c
Go to the documentation of this file.
1 #undef I3__FILE__
2 #define I3__FILE__ "debug.c"
3 /*
4  * vim:ts=4:sw=4:expandtab
5  *
6  * i3 - an improved dynamic tiling window manager
7  * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
8  *
9  * debug.c: Debugging functions, especially FormatEvent, which prints unhandled
10  * events. This code is from xcb-util.
11  *
12  */
13 #include <stdio.h>
14 #include <xcb/xcb.h>
15 
16 #include "log.h"
17 
18 static const char *labelError[] = {
19  "Success",
20  "BadRequest",
21  "BadValue",
22  "BadWindow",
23  "BadPixmap",
24  "BadAtom",
25  "BadCursor",
26  "BadFont",
27  "BadMatch",
28  "BadDrawable",
29  "BadAccess",
30  "BadAlloc",
31  "BadColor",
32  "BadGC",
33  "BadIDChoice",
34  "BadName",
35  "BadLength",
36  "BadImplementation",
37 };
38 
39 static const char *labelRequest[] = {
40  "no request",
41  "CreateWindow",
42  "ChangeWindowAttributes",
43  "GetWindowAttributes",
44  "DestroyWindow",
45  "DestroySubwindows",
46  "ChangeSaveSet",
47  "ReparentWindow",
48  "MapWindow",
49  "MapSubwindows",
50  "UnmapWindow",
51  "UnmapSubwindows",
52  "ConfigureWindow",
53  "CirculateWindow",
54  "GetGeometry",
55  "QueryTree",
56  "InternAtom",
57  "GetAtomName",
58  "ChangeProperty",
59  "DeleteProperty",
60  "GetProperty",
61  "ListProperties",
62  "SetSelectionOwner",
63  "GetSelectionOwner",
64  "ConvertSelection",
65  "SendEvent",
66  "GrabPointer",
67  "UngrabPointer",
68  "GrabButton",
69  "UngrabButton",
70  "ChangeActivePointerGrab",
71  "GrabKeyboard",
72  "UngrabKeyboard",
73  "GrabKey",
74  "UngrabKey",
75  "AllowEvents",
76  "GrabServer",
77  "UngrabServer",
78  "QueryPointer",
79  "GetMotionEvents",
80  "TranslateCoords",
81  "WarpPointer",
82  "SetInputFocus",
83  "GetInputFocus",
84  "QueryKeymap",
85  "OpenFont",
86  "CloseFont",
87  "QueryFont",
88  "QueryTextExtents",
89  "ListFonts",
90  "ListFontsWithInfo",
91  "SetFontPath",
92  "GetFontPath",
93  "CreatePixmap",
94  "FreePixmap",
95  "CreateGC",
96  "ChangeGC",
97  "CopyGC",
98  "SetDashes",
99  "SetClipRectangles",
100  "FreeGC",
101  "ClearArea",
102  "CopyArea",
103  "CopyPlane",
104  "PolyPoint",
105  "PolyLine",
106  "PolySegment",
107  "PolyRectangle",
108  "PolyArc",
109  "FillPoly",
110  "PolyFillRectangle",
111  "PolyFillArc",
112  "PutImage",
113  "GetImage",
114  "PolyText",
115  "PolyText",
116  "ImageText",
117  "ImageText",
118  "CreateColormap",
119  "FreeColormap",
120  "CopyColormapAndFree",
121  "InstallColormap",
122  "UninstallColormap",
123  "ListInstalledColormaps",
124  "AllocColor",
125  "AllocNamedColor",
126  "AllocColorCells",
127  "AllocColorPlanes",
128  "FreeColors",
129  "StoreColors",
130  "StoreNamedColor",
131  "QueryColors",
132  "LookupColor",
133  "CreateCursor",
134  "CreateGlyphCursor",
135  "FreeCursor",
136  "RecolorCursor",
137  "QueryBestSize",
138  "QueryExtension",
139  "ListExtensions",
140  "ChangeKeyboardMapping",
141  "GetKeyboardMapping",
142  "ChangeKeyboardControl",
143  "GetKeyboardControl",
144  "Bell",
145  "ChangePointerControl",
146  "GetPointerControl",
147  "SetScreenSaver",
148  "GetScreenSaver",
149  "ChangeHosts",
150  "ListHosts",
151  "SetAccessControl",
152  "SetCloseDownMode",
153  "KillClient",
154  "RotateProperties",
155  "ForceScreenSaver",
156  "SetPointerMapping",
157  "GetPointerMapping",
158  "SetModifierMapping",
159  "GetModifierMapping",
160  "major 120",
161  "major 121",
162  "major 122",
163  "major 123",
164  "major 124",
165  "major 125",
166  "major 126",
167  "NoOperation",
168 };
169 
170 static const char *labelEvent[] = {
171  "error",
172  "reply",
173  "KeyPress",
174  "KeyRelease",
175  "ButtonPress",
176  "ButtonRelease",
177  "MotionNotify",
178  "EnterNotify",
179  "LeaveNotify",
180  "FocusIn",
181  "FocusOut",
182  "KeymapNotify",
183  "Expose",
184  "GraphicsExpose",
185  "NoExpose",
186  "VisibilityNotify",
187  "CreateNotify",
188  "DestroyNotify",
189  "UnmapNotify",
190  "MapNotify",
191  "MapRequest",
192  "ReparentNotify",
193  "ConfigureNotify",
194  "ConfigureRequest",
195  "GravityNotify",
196  "ResizeRequest",
197  "CirculateNotify",
198  "CirculateRequest",
199  "PropertyNotify",
200  "SelectionClear",
201  "SelectionRequest",
202  "SelectionNotify",
203  "ColormapNotify",
204  "ClientMessage",
205  "MappingNotify",
206 };
207 
208 static const char *labelSendEvent[] = {
209  "",
210  " (from SendEvent)",
211 };
212 
213 int format_event(xcb_generic_event_t *e) {
214  uint8_t sendEvent;
215  uint16_t seqnum;
216 
217  sendEvent = (e->response_type & 0x80) ? 1 : 0;
218  e->response_type &= ~0x80;
219  seqnum = *((uint16_t *) e + 1);
220 
221  switch(e->response_type) {
222  case 0:
223  DLOG("Error %s on seqnum %d (%s).\n",
224  labelError[*((uint8_t *) e + 1)],
225  seqnum,
226  labelRequest[*((uint8_t *) e + 10)]);
227  break;
228  default:
229  if (e->response_type > sizeof(labelEvent) / sizeof(char*))
230  break;
231  DLOG("Event %s following seqnum %d%s.\n",
232  labelEvent[e->response_type],
233  seqnum,
234  labelSendEvent[sendEvent]);
235  break;
236  case XCB_KEYMAP_NOTIFY:
237  DLOG("Event %s%s.\n",
238  labelEvent[e->response_type],
239  labelSendEvent[sendEvent]);
240  break;
241  }
242 
243  fflush(stdout);
244  return 1;
245 }
#define DLOG(fmt,...)
Definition: log.h:28
static const char * labelError[]
Definition: debug.c:18
static const char * labelRequest[]
Definition: debug.c:39
int format_event(xcb_generic_event_t *e)
Definition: debug.c:213
static const char * labelSendEvent[]
Definition: debug.c:208
static const char * labelEvent[]
Definition: debug.c:170