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