xref: /OK3568_Linux_fs/external/xserver/hw/dmx/dmxlog.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2001 Red Hat Inc., Durham, North Carolina.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * All Rights Reserved.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining
7*4882a593Smuzhiyun  * a copy of this software and associated documentation files (the
8*4882a593Smuzhiyun  * "Software"), to deal in the Software without restriction, including
9*4882a593Smuzhiyun  * without limitation on the rights to use, copy, modify, merge,
10*4882a593Smuzhiyun  * publish, distribute, sublicense, and/or sell copies of the Software,
11*4882a593Smuzhiyun  * and to permit persons to whom the Software is furnished to do so,
12*4882a593Smuzhiyun  * subject to the following conditions:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the
15*4882a593Smuzhiyun  * next paragraph) shall be included in all copies or substantial
16*4882a593Smuzhiyun  * portions of the Software.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21*4882a593Smuzhiyun  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
22*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25*4882a593Smuzhiyun  * SOFTWARE.
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Authors:
30*4882a593Smuzhiyun  *   Rickard E. (Rik) Faith <faith@redhat.com>
31*4882a593Smuzhiyun  *
32*4882a593Smuzhiyun  */
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /** \file
35*4882a593Smuzhiyun  * This file encapsulated all of the logging functions that are used by
36*4882a593Smuzhiyun  * DMX for informational, warning, and error messages. */
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #ifdef HAVE_DMX_CONFIG_H
39*4882a593Smuzhiyun #include <dmx-config.h>
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #include "dmx.h"
43*4882a593Smuzhiyun #include "dmxlog.h"
44*4882a593Smuzhiyun #include "dmxinput.h"
45*4882a593Smuzhiyun #include <X11/extensions/XI.h>
46*4882a593Smuzhiyun #include <X11/extensions/XIproto.h>
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun static dmxLogLevel dmxCurrentLogLevel = dmxDebug;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /** Set the default level for logging to #dmxLogLevel.  Returns the
51*4882a593Smuzhiyun  * previous log level. */
52*4882a593Smuzhiyun dmxLogLevel
dmxSetLogLevel(dmxLogLevel newLevel)53*4882a593Smuzhiyun dmxSetLogLevel(dmxLogLevel newLevel)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun     dmxLogLevel oldLevel = dmxCurrentLogLevel;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun     if (newLevel > dmxFatal)
58*4882a593Smuzhiyun         newLevel = dmxFatal;
59*4882a593Smuzhiyun     dmxCurrentLogLevel = newLevel;
60*4882a593Smuzhiyun     return oldLevel;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /** Returns the log level set by #dmxLogLevel. */
64*4882a593Smuzhiyun dmxLogLevel
dmxGetLogLevel(void)65*4882a593Smuzhiyun dmxGetLogLevel(void)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun     return dmxCurrentLogLevel;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #ifdef DMX_LOG_STANDALONE
71*4882a593Smuzhiyun /* When using this file as part of a stand-alone (i.e., non-X-Server
72*4882a593Smuzhiyun  * program, then the ultimate output routines have to be defined.  */
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /** Provide an ErrorF function when used stand-alone. */
75*4882a593Smuzhiyun void
ErrorF(const char * format,...)76*4882a593Smuzhiyun ErrorF(const char *format, ...)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun     va_list args;
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun     va_start(args, format);
81*4882a593Smuzhiyun     vfprintf(stderr, format, args);     /* RATS: We assume the format string
82*4882a593Smuzhiyun                                          * is trusted, since it is always
83*4882a593Smuzhiyun                                          * from a log message in our code. */
84*4882a593Smuzhiyun     va_end(args);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /** Provide an VFatalError function when used stand-alone. */
88*4882a593Smuzhiyun static void
89*4882a593Smuzhiyun VFatalError(const char *format, va_list args) _X_ATTRIBUTE_PRINTF(1, 0) _X_NORETURN;
90*4882a593Smuzhiyun static void
VFatalError(const char * format,va_list args)91*4882a593Smuzhiyun VFatalError(const char *format, va_list args)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun     vfprintf(stderr, format, args);     /* RATS: We assume the format string
94*4882a593Smuzhiyun                                          * is trusted, since it is always
95*4882a593Smuzhiyun                                          * from a log message in our code. */
96*4882a593Smuzhiyun     exit(1);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /** Provide an VErrorF function when used stand-alone. */
100*4882a593Smuzhiyun void
VErrorF(const char * format,va_list args)101*4882a593Smuzhiyun VErrorF(const char *format, va_list args)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun     vfprintf(stderr, format, args);     /* RATS: We assume the format string
104*4882a593Smuzhiyun                                          * is trusted, since it is always
105*4882a593Smuzhiyun                                          * from a log message in our code. */
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun #else
108*4882a593Smuzhiyun /** This function was removed between XFree86 4.3.0 and XFree86 4.4.0. */
109*4882a593Smuzhiyun extern void AbortServer(void) _X_NORETURN;
110*4882a593Smuzhiyun static void
111*4882a593Smuzhiyun VFatalError(const char *format, va_list args) _X_ATTRIBUTE_PRINTF(1, 0) _X_NORETURN;
112*4882a593Smuzhiyun static void
VFatalError(const char * format,va_list args)113*4882a593Smuzhiyun VFatalError(const char *format, va_list args)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun     VErrorF(format, args);
116*4882a593Smuzhiyun     ErrorF("\n");
117*4882a593Smuzhiyun     AbortServer();
118*4882a593Smuzhiyun  /*NOTREACHED*/}
119*4882a593Smuzhiyun #endif
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /* Prints a consistent header for each line. */
122*4882a593Smuzhiyun static void
dmxHeader(dmxLogLevel logLevel,DMXInputInfo * dmxInput,DMXScreenInfo * dmxScreen)123*4882a593Smuzhiyun dmxHeader(dmxLogLevel logLevel, DMXInputInfo * dmxInput,
124*4882a593Smuzhiyun           DMXScreenInfo * dmxScreen)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun     const char *type = "??";
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun     switch (logLevel) {
129*4882a593Smuzhiyun     case dmxDebug:
130*4882a593Smuzhiyun         type = "..";
131*4882a593Smuzhiyun         break;
132*4882a593Smuzhiyun     case dmxInfo:
133*4882a593Smuzhiyun         type = "II";
134*4882a593Smuzhiyun         break;
135*4882a593Smuzhiyun     case dmxWarning:
136*4882a593Smuzhiyun         type = "**";
137*4882a593Smuzhiyun         break;
138*4882a593Smuzhiyun     case dmxError:
139*4882a593Smuzhiyun         type = "!!";
140*4882a593Smuzhiyun         break;
141*4882a593Smuzhiyun     case dmxFatal:
142*4882a593Smuzhiyun         type = "Fatal Error";
143*4882a593Smuzhiyun         break;
144*4882a593Smuzhiyun     }
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun     if (dmxInput && dmxScreen) {
147*4882a593Smuzhiyun         ErrorF("(%s) dmx[i%d/%s;o%d/%s]: ", type,
148*4882a593Smuzhiyun                dmxInput->inputIdx, dmxInput->name,
149*4882a593Smuzhiyun                dmxScreen->index, dmxScreen->name);
150*4882a593Smuzhiyun     }
151*4882a593Smuzhiyun     else if (dmxScreen) {
152*4882a593Smuzhiyun         ErrorF("(%s) dmx[o%d/%s]: ", type, dmxScreen->index, dmxScreen->name);
153*4882a593Smuzhiyun     }
154*4882a593Smuzhiyun     else if (dmxInput) {
155*4882a593Smuzhiyun         const char *pt = strchr(dmxInput->name, ',');
156*4882a593Smuzhiyun         int len = (pt ? (size_t) (pt - dmxInput->name)
157*4882a593Smuzhiyun                    : strlen(dmxInput->name));
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun         ErrorF("(%s) dmx[i%d/%*.*s]: ", type,
160*4882a593Smuzhiyun                dmxInput->inputIdx, len, len, dmxInput->name);
161*4882a593Smuzhiyun     }
162*4882a593Smuzhiyun     else {
163*4882a593Smuzhiyun         ErrorF("(%s) dmx: ", type);
164*4882a593Smuzhiyun     }
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* Prints the error message with the appropriate low-level X output
168*4882a593Smuzhiyun  * routine. */
169*4882a593Smuzhiyun static void
170*4882a593Smuzhiyun dmxMessage(dmxLogLevel logLevel, const char *format, va_list args) _X_ATTRIBUTE_PRINTF(2, 0);
171*4882a593Smuzhiyun static void
dmxMessage(dmxLogLevel logLevel,const char * format,va_list args)172*4882a593Smuzhiyun dmxMessage(dmxLogLevel logLevel, const char *format, va_list args)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun     if (logLevel == dmxFatal || logLevel >= dmxCurrentLogLevel) {
175*4882a593Smuzhiyun         if (logLevel == dmxFatal)
176*4882a593Smuzhiyun             VFatalError(format, args);
177*4882a593Smuzhiyun         else
178*4882a593Smuzhiyun             VErrorF(format, args);
179*4882a593Smuzhiyun     }
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun /** Log the specified message at the specified \a logLevel.  \a format
183*4882a593Smuzhiyun  * can be a printf-like format expression. */
184*4882a593Smuzhiyun void
dmxLog(dmxLogLevel logLevel,const char * format,...)185*4882a593Smuzhiyun dmxLog(dmxLogLevel logLevel, const char *format, ...)
186*4882a593Smuzhiyun {
187*4882a593Smuzhiyun     va_list args;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     dmxHeader(logLevel, NULL, NULL);
190*4882a593Smuzhiyun     va_start(args, format);
191*4882a593Smuzhiyun     dmxMessage(logLevel, format, args);
192*4882a593Smuzhiyun     va_end(args);
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /** Continue a log message without printing the message prefix. */
196*4882a593Smuzhiyun void
dmxLogCont(dmxLogLevel logLevel,const char * format,...)197*4882a593Smuzhiyun dmxLogCont(dmxLogLevel logLevel, const char *format, ...)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun     va_list args;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun     va_start(args, format);
202*4882a593Smuzhiyun     dmxMessage(logLevel, format, args);
203*4882a593Smuzhiyun     va_end(args);
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun #ifndef DMX_LOG_STANDALONE
207*4882a593Smuzhiyun /** Log an informational message (at level #dmxInfo) related to ouput.
208*4882a593Smuzhiyun  * The message prefix will contain backend information from \a
209*4882a593Smuzhiyun  * dmxScreen. */
210*4882a593Smuzhiyun void
dmxLogOutput(DMXScreenInfo * dmxScreen,const char * format,...)211*4882a593Smuzhiyun dmxLogOutput(DMXScreenInfo * dmxScreen, const char *format, ...)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun     va_list args;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     dmxHeader(dmxInfo, NULL, dmxScreen);
216*4882a593Smuzhiyun     va_start(args, format);
217*4882a593Smuzhiyun     dmxMessage(dmxInfo, format, args);
218*4882a593Smuzhiyun     va_end(args);
219*4882a593Smuzhiyun }
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /** Continue a message related to output without printing the message
222*4882a593Smuzhiyun  * prefix. */
223*4882a593Smuzhiyun void
dmxLogOutputCont(DMXScreenInfo * dmxScreen,const char * format,...)224*4882a593Smuzhiyun dmxLogOutputCont(DMXScreenInfo * dmxScreen, const char *format, ...)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun     va_list args;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun     va_start(args, format);
229*4882a593Smuzhiyun     dmxMessage(dmxInfo, format, args);
230*4882a593Smuzhiyun     va_end(args);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /** Log a warning message (at level #dmxWarning) related to output.
234*4882a593Smuzhiyun  * The message prefix will contain backend information from \a
235*4882a593Smuzhiyun  * dmxScreen. */
236*4882a593Smuzhiyun void
dmxLogOutputWarning(DMXScreenInfo * dmxScreen,const char * format,...)237*4882a593Smuzhiyun dmxLogOutputWarning(DMXScreenInfo * dmxScreen, const char *format, ...)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun     va_list args;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun     dmxHeader(dmxWarning, NULL, dmxScreen);
242*4882a593Smuzhiyun     va_start(args, format);
243*4882a593Smuzhiyun     dmxMessage(dmxWarning, format, args);
244*4882a593Smuzhiyun     va_end(args);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun /** Log an informational message (at level #dmxInfo) related to input.
248*4882a593Smuzhiyun  * The message prefix will contain information from \a dmxInput. */
249*4882a593Smuzhiyun void
dmxLogInput(DMXInputInfo * dmxInput,const char * format,...)250*4882a593Smuzhiyun dmxLogInput(DMXInputInfo * dmxInput, const char *format, ...)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun     va_list args;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     dmxHeader(dmxInfo, dmxInput, NULL);
255*4882a593Smuzhiyun     va_start(args, format);
256*4882a593Smuzhiyun     dmxMessage(dmxInfo, format, args);
257*4882a593Smuzhiyun     va_end(args);
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /** Continue a message related to input without printing the message
261*4882a593Smuzhiyun  * prefix. */
262*4882a593Smuzhiyun void
dmxLogInputCont(DMXInputInfo * dmxInput,const char * format,...)263*4882a593Smuzhiyun dmxLogInputCont(DMXInputInfo * dmxInput, const char *format, ...)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun     va_list args;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun     va_start(args, format);
268*4882a593Smuzhiyun     dmxMessage(dmxInfo, format, args);
269*4882a593Smuzhiyun     va_end(args);
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun /** Print \a argc messages, each describing an element in \a argv.  This
273*4882a593Smuzhiyun  * is maingly for debugging purposes. */
274*4882a593Smuzhiyun void
dmxLogArgs(dmxLogLevel logLevel,int argc,char ** argv)275*4882a593Smuzhiyun dmxLogArgs(dmxLogLevel logLevel, int argc, char **argv)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun     int i;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun     for (i = 0; i < argc; i++)
280*4882a593Smuzhiyun         dmxLog(logLevel, "   Arg[%d] = \"%s\"\n", i, argv[i]);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /** Print messages at level #dmxInfo describing the visuals in \a vi. */
284*4882a593Smuzhiyun void
dmxLogVisual(DMXScreenInfo * dmxScreen,XVisualInfo * vi,int defaultVisual)285*4882a593Smuzhiyun dmxLogVisual(DMXScreenInfo * dmxScreen, XVisualInfo * vi, int defaultVisual)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun     const char *class = "Unknown";
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun     switch (vi->class) {
290*4882a593Smuzhiyun     case StaticGray:
291*4882a593Smuzhiyun         class = "StaticGray ";
292*4882a593Smuzhiyun         break;
293*4882a593Smuzhiyun     case GrayScale:
294*4882a593Smuzhiyun         class = "GrayScale  ";
295*4882a593Smuzhiyun         break;
296*4882a593Smuzhiyun     case StaticColor:
297*4882a593Smuzhiyun         class = "StaticColor";
298*4882a593Smuzhiyun         break;
299*4882a593Smuzhiyun     case PseudoColor:
300*4882a593Smuzhiyun         class = "PseudoColor";
301*4882a593Smuzhiyun         break;
302*4882a593Smuzhiyun     case TrueColor:
303*4882a593Smuzhiyun         class = "TrueColor  ";
304*4882a593Smuzhiyun         break;
305*4882a593Smuzhiyun     case DirectColor:
306*4882a593Smuzhiyun         class = "DirectColor";
307*4882a593Smuzhiyun         break;
308*4882a593Smuzhiyun     }
309*4882a593Smuzhiyun #define VisualLogFormat "0x%02lx %s %2db %db/rgb %3d 0x%04lx 0x%04lx 0x%04lx%s\n"
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun     if (dmxScreen) {
312*4882a593Smuzhiyun         dmxLogOutput(dmxScreen,
313*4882a593Smuzhiyun                      VisualLogFormat,
314*4882a593Smuzhiyun                      vi->visualid, class, vi->depth, vi->bits_per_rgb,
315*4882a593Smuzhiyun                      vi->colormap_size,
316*4882a593Smuzhiyun                      vi->red_mask, vi->green_mask, vi->blue_mask,
317*4882a593Smuzhiyun                      defaultVisual ? " *" : "");
318*4882a593Smuzhiyun     }
319*4882a593Smuzhiyun     else {
320*4882a593Smuzhiyun         dmxLog(dmxInfo,
321*4882a593Smuzhiyun                "  " VisualLogFormat,
322*4882a593Smuzhiyun                vi->visualid, class, vi->depth, vi->bits_per_rgb,
323*4882a593Smuzhiyun                vi->colormap_size,
324*4882a593Smuzhiyun                vi->red_mask, vi->green_mask, vi->blue_mask,
325*4882a593Smuzhiyun                defaultVisual ? " *" : "");
326*4882a593Smuzhiyun     }
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun /** Translate a (normalized) XInput event \a type into a human-readable
330*4882a593Smuzhiyun  * string. */
331*4882a593Smuzhiyun const char *
dmxXInputEventName(int type)332*4882a593Smuzhiyun dmxXInputEventName(int type)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun     switch (type) {
335*4882a593Smuzhiyun     case XI_DeviceValuator:
336*4882a593Smuzhiyun         return "XI_DeviceValuator";
337*4882a593Smuzhiyun     case XI_DeviceKeyPress:
338*4882a593Smuzhiyun         return "XI_DeviceKeyPress";
339*4882a593Smuzhiyun     case XI_DeviceKeyRelease:
340*4882a593Smuzhiyun         return "XI_DeviceKeyRelease";
341*4882a593Smuzhiyun     case XI_DeviceButtonPress:
342*4882a593Smuzhiyun         return "XI_DeviceButtonPress";
343*4882a593Smuzhiyun     case XI_DeviceButtonRelease:
344*4882a593Smuzhiyun         return "XI_DeviceButtonRelease";
345*4882a593Smuzhiyun     case XI_DeviceMotionNotify:
346*4882a593Smuzhiyun         return "XI_DeviceMotionNotify";
347*4882a593Smuzhiyun     case XI_DeviceFocusIn:
348*4882a593Smuzhiyun         return "XI_DeviceFocusIn";
349*4882a593Smuzhiyun     case XI_DeviceFocusOut:
350*4882a593Smuzhiyun         return "XI_DeviceFocusOut";
351*4882a593Smuzhiyun     case XI_ProximityIn:
352*4882a593Smuzhiyun         return "XI_ProximityIn";
353*4882a593Smuzhiyun     case XI_ProximityOut:
354*4882a593Smuzhiyun         return "XI_ProximityOut";
355*4882a593Smuzhiyun     case XI_DeviceStateNotify:
356*4882a593Smuzhiyun         return "XI_DeviceStateNotify";
357*4882a593Smuzhiyun     case XI_DeviceMappingNotify:
358*4882a593Smuzhiyun         return "XI_DeviceMappingNotify";
359*4882a593Smuzhiyun     case XI_ChangeDeviceNotify:
360*4882a593Smuzhiyun         return "XI_ChangeDeviceNotify";
361*4882a593Smuzhiyun     case XI_DeviceKeystateNotify:
362*4882a593Smuzhiyun         return "XI_DeviceKeystateNotify";
363*4882a593Smuzhiyun     case XI_DeviceButtonstateNotify:
364*4882a593Smuzhiyun         return "XI_DeviceButtonstateNotify";
365*4882a593Smuzhiyun     default:
366*4882a593Smuzhiyun         return "unknown";
367*4882a593Smuzhiyun     }
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun #endif
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /** Translate an event \a type into a human-readable string. */
373*4882a593Smuzhiyun const char *
dmxEventName(int type)374*4882a593Smuzhiyun dmxEventName(int type)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun     switch (type) {
377*4882a593Smuzhiyun     case KeyPress:
378*4882a593Smuzhiyun         return "KeyPress";
379*4882a593Smuzhiyun     case KeyRelease:
380*4882a593Smuzhiyun         return "KeyRelease";
381*4882a593Smuzhiyun     case ButtonPress:
382*4882a593Smuzhiyun         return "ButtonPress";
383*4882a593Smuzhiyun     case ButtonRelease:
384*4882a593Smuzhiyun         return "ButtonRelease";
385*4882a593Smuzhiyun     case MotionNotify:
386*4882a593Smuzhiyun         return "MotionNotify";
387*4882a593Smuzhiyun     case EnterNotify:
388*4882a593Smuzhiyun         return "EnterNotify";
389*4882a593Smuzhiyun     case LeaveNotify:
390*4882a593Smuzhiyun         return "LeaveNotify";
391*4882a593Smuzhiyun     case FocusIn:
392*4882a593Smuzhiyun         return "FocusIn";
393*4882a593Smuzhiyun     case FocusOut:
394*4882a593Smuzhiyun         return "FocusOut";
395*4882a593Smuzhiyun     case KeymapNotify:
396*4882a593Smuzhiyun         return "KeymapNotify";
397*4882a593Smuzhiyun     case Expose:
398*4882a593Smuzhiyun         return "Expose";
399*4882a593Smuzhiyun     case GraphicsExpose:
400*4882a593Smuzhiyun         return "GraphicsExpose";
401*4882a593Smuzhiyun     case NoExpose:
402*4882a593Smuzhiyun         return "NoExpose";
403*4882a593Smuzhiyun     case VisibilityNotify:
404*4882a593Smuzhiyun         return "VisibilityNotify";
405*4882a593Smuzhiyun     case CreateNotify:
406*4882a593Smuzhiyun         return "CreateNotify";
407*4882a593Smuzhiyun     case DestroyNotify:
408*4882a593Smuzhiyun         return "DestroyNotify";
409*4882a593Smuzhiyun     case UnmapNotify:
410*4882a593Smuzhiyun         return "UnmapNotify";
411*4882a593Smuzhiyun     case MapNotify:
412*4882a593Smuzhiyun         return "MapNotify";
413*4882a593Smuzhiyun     case MapRequest:
414*4882a593Smuzhiyun         return "MapRequest";
415*4882a593Smuzhiyun     case ReparentNotify:
416*4882a593Smuzhiyun         return "ReparentNotify";
417*4882a593Smuzhiyun     case ConfigureNotify:
418*4882a593Smuzhiyun         return "ConfigureNotify";
419*4882a593Smuzhiyun     case ConfigureRequest:
420*4882a593Smuzhiyun         return "ConfigureRequest";
421*4882a593Smuzhiyun     case GravityNotify:
422*4882a593Smuzhiyun         return "GravityNotify";
423*4882a593Smuzhiyun     case ResizeRequest:
424*4882a593Smuzhiyun         return "ResizeRequest";
425*4882a593Smuzhiyun     case CirculateNotify:
426*4882a593Smuzhiyun         return "CirculateNotify";
427*4882a593Smuzhiyun     case CirculateRequest:
428*4882a593Smuzhiyun         return "CirculateRequest";
429*4882a593Smuzhiyun     case PropertyNotify:
430*4882a593Smuzhiyun         return "PropertyNotify";
431*4882a593Smuzhiyun     case SelectionClear:
432*4882a593Smuzhiyun         return "SelectionClear";
433*4882a593Smuzhiyun     case SelectionRequest:
434*4882a593Smuzhiyun         return "SelectionRequest";
435*4882a593Smuzhiyun     case SelectionNotify:
436*4882a593Smuzhiyun         return "SelectionNotify";
437*4882a593Smuzhiyun     case ColormapNotify:
438*4882a593Smuzhiyun         return "ColormapNotify";
439*4882a593Smuzhiyun     case ClientMessage:
440*4882a593Smuzhiyun         return "ClientMessage";
441*4882a593Smuzhiyun     case MappingNotify:
442*4882a593Smuzhiyun         return "MappingNotify";
443*4882a593Smuzhiyun     default:
444*4882a593Smuzhiyun         return "<unknown>";
445*4882a593Smuzhiyun     }
446*4882a593Smuzhiyun }
447