Git init
[framework/uifw/xorg/util/x11-xkb-utils.git] / xkbutils / xkbwatch.c
1 /* $Xorg: xkbwatch.c,v 1.4 2000/08/17 19:54:51 cpqbld Exp $ */
2 /************************************************************
3  Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
4
5  Permission to use, copy, modify, and distribute this
6  software and its documentation for any purpose and without
7  fee is hereby granted, provided that the above copyright
8  notice appear in all copies and that both that copyright
9  notice and this permission notice appear in supporting
10  documentation, and that the name of Silicon Graphics not be 
11  used in advertising or publicity pertaining to distribution 
12  of the software without specific prior written permission.
13  Silicon Graphics makes no representation about the suitability 
14  of this software for any purpose. It is provided "as is"
15  without any express or implied warranty.
16  
17  SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
18  SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
19  AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
20  GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
21  DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
22  DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
23  OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
24  THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
26  ********************************************************/
27 /* $XFree86: xc/programs/xkbutils/xkbwatch.c,v 3.4 2001/01/17 23:46:14 dawes Exp $ */
28
29 #include <stdlib.h>
30 #include <X11/X.h>
31 #include <X11/Xlib.h>
32 #include <X11/XKBlib.h>
33 #include <X11/Intrinsic.h>
34 #include <X11/StringDefs.h>
35 #include <X11/Shell.h>
36 #include <X11/Xaw/Cardinals.h>
37 #include <X11/Xaw/Box.h>
38
39 #define OPAQUE_DEFINED
40 #define BOOLEAN_DEFINED
41 #define DEBUG_VAR_NOT_LOCAL
42 #define DEBUG_VAR debugFlags
43 #include "utils.h"
44 #include "LED.h"
45
46 /***====================================================================***/
47
48 static  Display *       inDpy,*outDpy;
49 static  int             evBase,errBase;
50
51 /***====================================================================***/
52
53
54 static XrmOptionDescRec options[] = {
55 {"-off",        "*on.on",               XrmoptionNoArg,         "FALSE"},
56 {"-on",         "*on.on",               XrmoptionNoArg,         "TRUE"}
57 };
58
59 /***====================================================================***/
60
61 int
62 main(int argc, char *argv[])
63 {
64 Widget          toplevel;
65 XtAppContext    app_con;
66 Widget          panel;
67 Widget          base[XkbNumModifiers];
68 Widget          latched[XkbNumModifiers];
69 Widget          locked[XkbNumModifiers];
70 Widget          effective[XkbNumModifiers];
71 Widget          compat[XkbNumModifiers];
72 Widget          baseBox,latchBox,lockBox,effBox,compatBox;
73 register int    i;
74 unsigned        bit;
75 XkbEvent        ev;
76 XkbStateRec     state;
77 static Arg      hArgs[]= {{ XtNorientation, (XtArgVal)XtorientHorizontal }};
78 static Arg      vArgs[]= {{ XtNorientation, (XtArgVal)XtorientVertical }};
79 static Arg      onArgs[]=  {{ XtNon, (XtArgVal)True }};
80 static Arg      offArgs[]=  {{ XtNon, (XtArgVal)False }};
81 static char *   fallback_resources[] = {
82     "*Box*background: grey50",
83     "*Box*borderWidth: 0",
84     "*Box*vSpace: 1",
85     NULL
86 };
87
88     uSetEntryFile(NullString);
89     uSetDebugFile(NullString);
90     uSetErrorFile(NullString);
91     toplevel = XtOpenApplication(&app_con, "XkbWatch",
92                                  options, XtNumber(options), &argc, argv, 
93                                  fallback_resources,
94                                  sessionShellWidgetClass, NULL, ZERO);
95     if (toplevel==NULL) {
96         uFatalError("Couldn't create application top level\n");
97         exit(1);
98     }
99     inDpy= outDpy= XtDisplay(toplevel);
100     if (inDpy) {
101         int i1,mn,mj;
102         mj= XkbMajorVersion;
103         mn= XkbMinorVersion;
104         if (!XkbQueryExtension(inDpy,&i1,&evBase,&errBase,&mj,&mn)) {
105             uFatalError("Server doesn't support a compatible XKB\n");
106             exit(1);
107         }
108     }
109     panel= XtCreateManagedWidget("xkbwatch",boxWidgetClass,toplevel,vArgs,1);
110     if (panel==NULL) {
111         uFatalError("Couldn't create top level box\n");
112         exit(1);
113     }
114     baseBox= XtCreateManagedWidget("base",boxWidgetClass,panel,hArgs,1);
115     if (baseBox==NULL)
116         uFatalError("Couldn't create base modifiers box\n");
117     latchBox= XtCreateManagedWidget("latched",boxWidgetClass,panel,hArgs,1);
118     if (latchBox==NULL)
119         uFatalError("Couldn't create latched modifiers box\n");
120     lockBox= XtCreateManagedWidget("locked",boxWidgetClass,panel,hArgs,1);
121     if (lockBox==NULL)
122         uFatalError("Couldn't create locked modifiers box\n");
123     effBox= XtCreateManagedWidget("effective",boxWidgetClass,panel,hArgs,1);
124     if (effBox==NULL)
125         uFatalError("Couldn't create effective modifiers box\n");
126     compatBox= XtCreateManagedWidget("compat",boxWidgetClass,panel,hArgs,1);
127     if (compatBox==NULL)
128         uFatalError("Couldn't create compatibility state box\n");
129     XkbSelectEvents(inDpy,XkbUseCoreKbd,XkbStateNotifyMask,XkbStateNotifyMask);
130     XkbGetState(inDpy,XkbUseCoreKbd,&state);
131     for (i=XkbNumModifiers-1,bit=0x80;i>=0;i--,bit>>=1) {
132         ArgList list;
133         char    buf[30];
134         sprintf(buf,"base%d",i);
135         if (state.base_mods&bit)        list= onArgs;
136         else                            list= offArgs;
137         base[i]= XtCreateManagedWidget(buf,ledWidgetClass,baseBox,list,1);
138         sprintf(buf,"latched%d",i);
139         if (state.latched_mods&bit)     list= onArgs;
140         else                            list= offArgs;
141         latched[i]= XtCreateManagedWidget(buf,ledWidgetClass,latchBox,list,1);
142         sprintf(buf,"locked%d",i);
143         if (state.locked_mods&bit)      list= onArgs;
144         else                            list= offArgs;
145         locked[i]= XtCreateManagedWidget(buf,ledWidgetClass,lockBox,list,1);
146         sprintf(buf,"effective%d",i);
147         if (state.mods&bit)             list= onArgs;
148         else                            list= offArgs;
149         effective[i]= XtCreateManagedWidget(buf,ledWidgetClass,effBox,list,1);
150         sprintf(buf,"compat%d",i);
151         if (state.compat_state&bit)     list= onArgs;
152         else                            list= offArgs;
153         compat[i]= XtCreateManagedWidget(buf,ledWidgetClass,compatBox,list,1);
154     }
155     XtRealizeWidget(toplevel);
156     while (1) {
157         XtAppNextEvent(app_con,&ev.core);
158         if (ev.core.type==evBase+XkbEventCode) {
159             if (ev.any.xkb_type==XkbStateNotify) {
160                 unsigned changed;
161                 if (ev.state.changed&XkbModifierBaseMask) {
162                     changed= ev.state.base_mods^state.base_mods;
163                     state.base_mods= ev.state.base_mods;
164                     for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
165                         if (changed&bit) {
166                             ArgList     list;
167                             if (state.base_mods&bit)    list= onArgs;
168                             else                        list= offArgs;
169                             XtSetValues(base[i],list,1);
170                         }
171                     }
172                 }
173                 if (ev.state.changed&XkbModifierLatchMask) {
174                     changed= ev.state.latched_mods^state.latched_mods;
175                     state.latched_mods= ev.state.latched_mods;
176                     for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
177                         if (changed&bit) {
178                             ArgList     list;
179                             if (state.latched_mods&bit) list= onArgs;
180                             else                        list= offArgs;
181                             XtSetValues(latched[i],list,1);
182                         }
183                     }
184                 }
185                 if (ev.state.changed&XkbModifierLockMask) {
186                     changed= ev.state.locked_mods^state.locked_mods;
187                     state.locked_mods= ev.state.locked_mods;
188                     for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
189                         if (changed&bit) {
190                             ArgList     list;
191                             if (state.locked_mods&bit)  list= onArgs;
192                             else                        list= offArgs;
193                             XtSetValues(locked[i],list,1);
194                         }
195                     }
196                 }
197                 if (ev.state.changed&XkbModifierStateMask) {
198                     changed= ev.state.mods^state.mods;
199                     state.mods= ev.state.mods;
200                     for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
201                         if (changed&bit) {
202                             ArgList     list;
203                             if (state.mods&bit) list= onArgs;
204                             else                list= offArgs;
205                             XtSetValues(effective[i],list,1);
206                         }
207                     }
208                 }
209                 if (ev.state.changed&XkbCompatStateMask) {
210                     changed= ev.state.compat_state^state.compat_state;
211                     state.compat_state= ev.state.compat_state;
212                     for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
213                         if (changed&bit) {
214                             ArgList     list;
215                             if (state.compat_state&bit) list= onArgs;
216                             else                        list= offArgs;
217                             XtSetValues(compat[i],list,1);
218                         }
219                     }
220                 }
221             }
222         }
223         else XtDispatchEvent(&ev.core);
224     }
225 /* BAIL: */
226     if (inDpy) 
227         XCloseDisplay(inDpy);
228     if (outDpy!=inDpy)
229         XCloseDisplay(outDpy);
230     inDpy= outDpy= NULL;
231     return 0;
232 }