1
/* $Xorg: xkbtext.c,v 1.3 2000/08/17 19:46:44 cpqbld Exp $ */
2
/************************************************************
3
Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
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.
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.
26
********************************************************/
27
/* $XFree86: xc/lib/xkbfile/xkbtext.c,v 3.11 2002/12/21 18:49:02 paulo Exp $ */
29
#ifdef HAVE_DIX_CONFIG_H
30
#include <dix-config.h>
31
#elif defined(HAVE_CONFIG_H)
44
#include <X11/XKBlib.h>
45
#include <X11/extensions/XKBgeom.h>
47
#include "XKMformat.h"
48
#include "XKBfileInt.h"
54
#include <X11/Xproto.h>
58
#include <X11/extensions/XKBstr.h>
59
#define XKBSRV_NEED_FILE_FUNCS 1
60
#include <X11/extensions/XKBsrv.h>
61
#include <X11/extensions/XKBgeom.h>
65
/***====================================================================***/
67
#define BUFFER_SIZE 512
69
static char textBuffer[BUFFER_SIZE];
73
tbGetBuffer(unsigned size)
77
if (size>=BUFFER_SIZE)
79
if ((BUFFER_SIZE-tbNext)<=size)
81
rtrn= &textBuffer[tbNext];
86
/***====================================================================***/
89
XkbAtomText(Display *dpy,Atom atm,unsigned format)
93
tmp= XkbAtomGetString(dpy,atm);
99
rtrn= tbGetBuffer(len);
100
strncpy(rtrn,tmp,len);
104
rtrn= tbGetBuffer(1);
107
if (format==XkbCFile) {
108
for (tmp=rtrn;*tmp!='\0';tmp++) {
109
if ((tmp==rtrn)&&(!isalpha(*tmp)))
111
else if (!isalnum(*tmp))
115
return XkbStringText(rtrn,format);
118
/***====================================================================***/
121
XkbVModIndexText(Display *dpy,XkbDescPtr xkb,unsigned ndx,unsigned format)
124
register Atom *vmodNames;
128
if (xkb && xkb->names)
129
vmodNames= xkb->names->vmods;
130
else vmodNames= NULL;
133
if (ndx>=XkbNumVirtualMods)
135
else if (vmodNames&&(vmodNames[ndx]!=None))
136
tmp= XkbAtomGetString(dpy,vmodNames[ndx]);
138
sprintf(tmp=numBuf,"%d",ndx);
141
if (format==XkbCFile)
143
if (len>=BUFFER_SIZE)
145
rtrn= tbGetBuffer(len);
146
if (format==XkbCFile) {
147
strcpy(rtrn,"vmod_");
148
strncpy(&rtrn[5],tmp,len-4);
150
else strncpy(rtrn,tmp,len);
155
XkbVModMaskText( Display * dpy,
164
char *str,buf[BUFFER_SIZE];
166
if ((modMask==0)&&(mask==0)) {
167
rtrn= tbGetBuffer(5);
168
if (format==XkbCFile)
170
else sprintf(rtrn,"none");
174
mm= XkbModMaskText(modMask,format);
181
for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
183
tmp= XkbVModIndexText(dpy,xkb,i,format);
184
len= strlen(tmp)+1+(str==buf?0:1);
185
if (format==XkbCFile)
187
if ((str-(buf+len))<=BUFFER_SIZE) {
189
if (format==XkbCFile) *str++= '|';
194
if (format==XkbCFile)
195
sprintf(str,"%sMask",tmp);
196
else strcpy(str,tmp);
207
len+= strlen(str)+(mm==NULL?0:1);
208
if (len>=BUFFER_SIZE)
210
rtrn= tbGetBuffer(len+1);
224
if (format==XkbCFile) strcat(rtrn,"|");
225
else strcat(rtrn,"+");
227
strncat(rtrn,str,len-i);
233
static char *modNames[XkbNumModifiers] = {
234
"Shift", "Lock", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5"
238
XkbModIndexText(unsigned ndx,unsigned format)
243
if (format==XkbCFile) {
244
if (ndx<XkbNumModifiers)
245
sprintf(buf,"%sMapIndex",modNames[ndx]);
246
else if (ndx==XkbNoModifier)
247
sprintf(buf,"XkbNoModifier");
248
else sprintf(buf,"0x%02x",ndx);
251
if (ndx<XkbNumModifiers)
252
strcpy(buf,modNames[ndx]);
253
else if (ndx==XkbNoModifier)
255
else sprintf(buf,"ILLEGAL_%02x",ndx);
257
rtrn= tbGetBuffer(strlen(buf)+1);
263
XkbModMaskText(unsigned mask,unsigned format)
268
if ((mask&0xff)==0xff) {
269
if (format==XkbCFile) strcpy(buf,"0xff");
270
else strcpy(buf,"all");
272
else if ((mask&0xff)==0) {
273
if (format==XkbCFile) strcpy(buf,"0");
274
else strcpy(buf,"none");
279
for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
282
if (format==XkbCFile) *str++= '|';
285
strcpy(str,modNames[i]);
286
str= &str[strlen(str)];
287
if (format==XkbCFile) {
294
rtrn= tbGetBuffer(strlen(buf)+1);
299
/***====================================================================***/
303
XkbConfigText(unsigned config,unsigned format)
307
buf= tbGetBuffer(32);
309
case XkmSemanticsFile:
310
strcpy(buf,"Semantics");
313
strcpy(buf,"Layout");
316
strcpy(buf,"Keymap");
318
case XkmGeometryFile:
319
case XkmGeometryIndex:
320
strcpy(buf,"Geometry");
325
case XkmCompatMapIndex:
326
strcpy(buf,"CompatMap");
328
case XkmSymbolsIndex:
329
strcpy(buf,"Symbols");
331
case XkmIndicatorsIndex:
332
strcpy(buf,"Indicators");
334
case XkmKeyNamesIndex:
335
strcpy(buf,"KeyNames");
337
case XkmVirtualModsIndex:
338
strcpy(buf,"VirtualMods");
341
sprintf(buf,"unknown(%d)",config);
347
/***====================================================================***/
350
XkbKeysymText(KeySym sym,unsigned format)
352
static char buf[32],*rtrn;
354
#ifndef XKB_IN_SERVER
356
strcpy(rtrn=buf,"NoSymbol");
357
else if ((rtrn=XKeysymToString(sym))==NULL)
358
sprintf(rtrn=buf, "0x%lx", (long)sym);
359
else if (format==XkbCFile) {
360
sprintf(buf,"XK_%s",rtrn);
364
#else /* def XKB_IN_SERVER */
366
strcpy(rtrn=buf,"NoSymbol");
367
else sprintf(rtrn=buf, "0x%lx", (long)sym);
369
#endif /* XKB_IN_SERVER */
373
XkbKeyNameText(char *name,unsigned format)
377
if (format==XkbCFile) {
386
memcpy(&buf[1],name,4);
395
/***====================================================================***/
397
static char *siMatchText[5] = {
398
"NoneOf", "AnyOfOrNone", "AnyOf", "AllOf", "Exactly"
402
XkbSIMatchText(unsigned type,unsigned format)
407
switch (type&XkbSI_OpMask) {
408
case XkbSI_NoneOf: rtrn= siMatchText[0]; break;
409
case XkbSI_AnyOfOrNone: rtrn= siMatchText[1]; break;
410
case XkbSI_AnyOf: rtrn= siMatchText[2]; break;
411
case XkbSI_AllOf: rtrn= siMatchText[3]; break;
412
case XkbSI_Exactly: rtrn= siMatchText[4]; break;
413
default: sprintf(buf,"0x%x",type&XkbSI_OpMask);
416
if (format==XkbCFile) {
417
if (type&XkbSI_LevelOneOnly)
418
sprintf(buf,"XkbSI_LevelOneOnly|XkbSI_%s",rtrn);
419
else sprintf(buf,"XkbSI_%s",rtrn);
425
/***====================================================================***/
427
static char *imWhichNames[]= {
436
XkbIMWhichStateMaskText(unsigned use_which,unsigned format)
447
tmp= use_which&XkbIM_UseAnyMods;
448
for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) {
451
len+= strlen(imWhichNames[i])+1;
452
if (format==XkbCFile)
456
buf= tbGetBuffer(len+1);
457
tmp= use_which&XkbIM_UseAnyMods;
458
for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) {
461
if (format==XkbCFile) {
464
sprintf(&buf[len],"XkbIM_Use%s",imWhichNames[i]);
465
buf[len+9]= toupper(buf[len+9]);
470
sprintf(&buf[len],"%s",imWhichNames[i]);
472
len+= strlen(&buf[len]);
479
XkbAccessXDetailText(unsigned state,unsigned format)
483
buf= tbGetBuffer(32);
484
if (format==XkbMessage) prefix= "";
485
else prefix= "XkbAXN_";
487
case XkbAXN_SKPress: sprintf(buf,"%sSKPress",prefix); break;
488
case XkbAXN_SKAccept: sprintf(buf,"%sSKAccept",prefix); break;
489
case XkbAXN_SKRelease: sprintf(buf,"%sSKRelease",prefix); break;
490
case XkbAXN_SKReject: sprintf(buf,"%sSKReject",prefix); break;
491
case XkbAXN_BKAccept: sprintf(buf,"%sBKAccept",prefix); break;
492
case XkbAXN_BKReject: sprintf(buf,"%sBKReject",prefix); break;
493
case XkbAXN_AXKWarning: sprintf(buf,"%sAXKWarning",prefix); break;
494
default: sprintf(buf,"ILLEGAL"); break;
499
static char *nknNames[] = {
500
"keycodes", "geometry", "deviceID"
502
#define NUM_NKN (sizeof(nknNames)/sizeof(char *))
505
XkbNKNDetailMaskText(unsigned detail,unsigned format)
507
char *buf,*prefix,*suffix;
509
register unsigned bit;
513
if ((detail&XkbAllNewKeyboardEventsMask)==0) {
515
if (format==XkbCFile) tmp= "0";
516
else if (format==XkbMessage) tmp= "none";
517
buf= tbGetBuffer(strlen(tmp)+1);
521
else if ((detail&XkbAllNewKeyboardEventsMask)==XkbAllNewKeyboardEventsMask){
523
if (format==XkbCFile) tmp= "XkbAllNewKeyboardEventsMask";
525
buf= tbGetBuffer(strlen(tmp)+1);
529
if (format==XkbMessage) {
537
if (format==XkbCFile)
540
slen= strlen(suffix);
542
for (len=0,i=0,bit=1;i<NUM_NKN;i++,bit<<=1) {
544
if (len!=0) len+= 1; /* room for '+' or '|' */
545
len+= plen+slen+strlen(nknNames[i]);
548
buf= tbGetBuffer(len+1);
550
for (len=0,i=0,bit=1;i<NUM_NKN;i++,bit<<=1) {
553
if (format==XkbCFile) buf[len++]= '|';
554
else buf[len++]= '+';
557
strcpy(&buf[len],prefix);
560
strcpy(&buf[len],nknNames[i]);
561
len+= strlen(nknNames[i]);
563
strcpy(&buf[len],suffix);
572
static char *ctrlNames[] = {
589
XkbControlsMaskText(unsigned ctrls,unsigned format)
597
if (format==XkbCFile)
599
else strcpy(buf,"none");
602
tmp= ctrls&XkbAllBooleanCtrlsMask;
603
for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) {
606
len+= strlen(ctrlNames[i])+1;
607
if (format==XkbCFile)
611
buf= tbGetBuffer(len+1);
612
tmp= ctrls&XkbAllBooleanCtrlsMask;
613
for (len=i=0,bit=1;tmp!=0;i++,bit<<=1) {
616
if (format==XkbCFile) {
619
sprintf(&buf[len],"Xkb%sMask",ctrlNames[i]);
620
buf[len+3]= toupper(buf[len+3]);
625
sprintf(&buf[len],"%s",ctrlNames[i]);
627
len+= strlen(&buf[len]);
633
/***====================================================================***/
636
XkbStringText(char *str,unsigned format)
639
register char *in,*out;
648
else if (format==XkbXKMFile)
650
for (ok= True,len=0,in=str;*in!='\0';in++,len++) {
654
case '\n': case '\t': case '\v':
655
case '\b': case '\r': case '\f':
666
buf= tbGetBuffer(len+1);
667
for (in=str,out=buf;*in!='\0';in++) {
672
if (*in=='\n') *out++= 'n';
673
else if (*in=='\t') *out++= 't';
674
else if (*in=='\v') *out++= 'v';
675
else if (*in=='\b') *out++= 'b';
676
else if (*in=='\r') *out++= 'r';
677
else if (*in=='\f') *out++= 'f';
678
else if ((*in=='\033')&&(format==XkbXKMFile)) {
683
sprintf(out,"%o",*in);
693
/***====================================================================***/
696
XkbGeomFPText(int val,unsigned format)
701
buf= tbGetBuffer(12);
702
if (format==XkbCFile) {
703
sprintf(buf,"%d",val);
706
whole= val/XkbGeomPtsPerMM;
707
frac= val%XkbGeomPtsPerMM;
709
sprintf(buf,"%d.%d",whole,frac);
710
else sprintf(buf,"%d",whole);
716
XkbDoodadTypeText(unsigned type,unsigned format)
719
if (format==XkbCFile) {
720
buf= tbGetBuffer(24);
721
if (type==XkbOutlineDoodad) strcpy(buf,"XkbOutlineDoodad");
722
else if (type==XkbSolidDoodad) strcpy(buf,"XkbSolidDoodad");
723
else if (type==XkbTextDoodad) strcpy(buf,"XkbTextDoodad");
724
else if (type==XkbIndicatorDoodad) strcpy(buf,"XkbIndicatorDoodad");
725
else if (type==XkbLogoDoodad) strcpy(buf,"XkbLogoDoodad");
726
else sprintf(buf,"UnknownDoodad%d",type);
729
buf= tbGetBuffer(12);
730
if (type==XkbOutlineDoodad) strcpy(buf,"outline");
731
else if (type==XkbSolidDoodad) strcpy(buf,"solid");
732
else if (type==XkbTextDoodad) strcpy(buf,"text");
733
else if (type==XkbIndicatorDoodad) strcpy(buf,"indicator");
734
else if (type==XkbLogoDoodad) strcpy(buf,"logo");
735
else sprintf(buf,"unknown%d",type);
740
static char *actionTypeNames[XkbSA_NumActions]= {
742
"SetMods", "LatchMods", "LockMods",
743
"SetGroup", "LatchGroup", "LockGroup",
745
"PtrBtn", "LockPtrBtn",
748
"Terminate", "SwitchScreen",
749
"SetControls", "LockControls",
752
"DeviceBtn", "LockDeviceBtn"
756
XkbActionTypeText(unsigned type,unsigned format)
761
if (type<=XkbSA_LastAction) {
762
rtrn= actionTypeNames[type];
763
if (format==XkbCFile) {
764
sprintf(buf,"XkbSA_%s",rtrn);
769
sprintf(buf,"Private");
773
/***====================================================================***/
776
TryCopyStr(char *to,char *from,int *pLeft)
781
if (len<((*pLeft)-3)) {
793
CopyNoActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int*sz)
799
CopyModActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
806
tmp= XkbModActionVMods(act);
807
TryCopyStr(buf,"modifiers=",sz);
808
if (act->flags&XkbSA_UseModMapMods)
809
TryCopyStr(buf,"modMapMods",sz);
810
else if (act->real_mods || tmp) {
812
XkbVModMaskText(dpy,xkb,act->real_mods,tmp,XkbXKBFile),
815
else TryCopyStr(buf,"none",sz);
816
if (act->type==XkbSA_LockMods)
818
if (act->flags&XkbSA_ClearLocks)
819
TryCopyStr(buf,",clearLocks",sz);
820
if (act->flags&XkbSA_LatchToLock)
821
TryCopyStr(buf,",latchToLock",sz);
827
CopyGroupActionArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
830
XkbGroupAction * act;
834
TryCopyStr(buf,"group=",sz);
835
if (act->flags&XkbSA_GroupAbsolute)
836
sprintf(tbuf,"%d",XkbSAGroup(act)+1);
837
else if (XkbSAGroup(act)<0)
838
sprintf(tbuf,"%d",XkbSAGroup(act));
839
else sprintf(tbuf,"+%d",XkbSAGroup(act));
840
TryCopyStr(buf,tbuf,sz);
841
if (act->type==XkbSA_LockGroup)
843
if (act->flags&XkbSA_ClearLocks)
844
TryCopyStr(buf,",clearLocks",sz);
845
if (act->flags&XkbSA_LatchToLock)
846
TryCopyStr(buf,",latchToLock",sz);
852
CopyMovePtrArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz)
859
x= XkbPtrActionX(act);
860
y= XkbPtrActionY(act);
861
if ((act->flags&XkbSA_MoveAbsoluteX)||(x<0))
862
sprintf(tbuf,"x=%d",x);
863
else sprintf(tbuf,"x=+%d",x);
864
TryCopyStr(buf,tbuf,sz);
866
if ((act->flags&XkbSA_MoveAbsoluteY)||(y<0))
867
sprintf(tbuf,",y=%d",y);
868
else sprintf(tbuf,",y=+%d",y);
869
TryCopyStr(buf,tbuf,sz);
870
if (act->flags&XkbSA_NoAcceleration)
871
TryCopyStr(buf,",!accel",sz);
877
CopyPtrBtnArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz)
879
XkbPtrBtnAction * act;
883
TryCopyStr(buf,"button=",sz);
884
if ((act->button>0)&&(act->button<6)) {
885
sprintf(tbuf,"%d",act->button);
886
TryCopyStr(buf,tbuf,sz);
888
else TryCopyStr(buf,"default",sz);
890
sprintf(tbuf,",count=%d",act->count);
891
TryCopyStr(buf,tbuf,sz);
893
if (action->type==XkbSA_LockPtrBtn) {
894
switch (act->flags&(XkbSA_LockNoUnlock|XkbSA_LockNoLock)) {
895
case XkbSA_LockNoLock:
896
sprintf(tbuf,",affect=unlock"); break;
897
case XkbSA_LockNoUnlock:
898
sprintf(tbuf,",affect=lock"); break;
899
case XkbSA_LockNoUnlock|XkbSA_LockNoLock:
900
sprintf(tbuf,",affect=neither"); break;
902
sprintf(tbuf,",affect=both"); break;
904
TryCopyStr(buf,tbuf,sz);
911
CopySetPtrDfltArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
914
XkbPtrDfltAction * act;
918
if (act->affect==XkbSA_AffectDfltBtn) {
919
TryCopyStr(buf,"affect=button,button=",sz);
920
if ((act->flags&XkbSA_DfltBtnAbsolute)||(XkbSAPtrDfltValue(act)<0))
921
sprintf(tbuf,"%d",XkbSAPtrDfltValue(act));
922
else sprintf(tbuf,"+%d",XkbSAPtrDfltValue(act));
923
TryCopyStr(buf,tbuf,sz);
929
CopyISOLockArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz)
935
if (act->flags&XkbSA_ISODfltIsGroup) {
936
TryCopyStr(tbuf,"group=",sz);
937
if (act->flags&XkbSA_GroupAbsolute)
938
sprintf(tbuf,"%d",XkbSAGroup(act)+1);
939
else if (XkbSAGroup(act)<0)
940
sprintf(tbuf,"%d",XkbSAGroup(act));
941
else sprintf(tbuf,"+%d",XkbSAGroup(act));
942
TryCopyStr(buf,tbuf,sz);
946
tmp= XkbModActionVMods(act);
947
TryCopyStr(buf,"modifiers=",sz);
948
if (act->flags&XkbSA_UseModMapMods)
949
TryCopyStr(buf,"modMapMods",sz);
950
else if (act->real_mods || tmp) {
951
if (act->real_mods) {
952
TryCopyStr(buf,XkbModMaskText(act->real_mods,XkbXKBFile),sz);
954
TryCopyStr(buf,"+",sz);
957
TryCopyStr(buf,XkbVModMaskText(dpy,xkb,0,tmp,XkbXKBFile),sz);
959
else TryCopyStr(buf,"none",sz);
961
TryCopyStr(buf,",affect=",sz);
962
if ((act->affect&XkbSA_ISOAffectMask)==0)
963
TryCopyStr(buf,"all",sz);
966
if ((act->affect&XkbSA_ISONoAffectMods)==0) {
967
TryCopyStr(buf,"mods",sz);
970
if ((act->affect&XkbSA_ISONoAffectGroup)==0) {
971
sprintf(tbuf,"%sgroups",(nOut>0?"+":""));
972
TryCopyStr(buf,tbuf,sz);
975
if ((act->affect&XkbSA_ISONoAffectPtr)==0) {
976
sprintf(tbuf,"%spointer",(nOut>0?"+":""));
977
TryCopyStr(buf,tbuf,sz);
980
if ((act->affect&XkbSA_ISONoAffectCtrls)==0) {
981
sprintf(tbuf,"%scontrols",(nOut>0?"+":""));
982
TryCopyStr(buf,tbuf,sz);
991
CopySwitchScreenArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
994
XkbSwitchScreenAction * act;
997
act= &action->screen;
998
if ((act->flags&XkbSA_SwitchAbsolute)||(XkbSAScreen(act)<0))
999
sprintf(tbuf,"screen=%d",XkbSAScreen(act));
1000
else sprintf(tbuf,"screen=+%d",XkbSAScreen(act));
1001
TryCopyStr(buf,tbuf,sz);
1002
if (act->flags&XkbSA_SwitchApplication)
1003
TryCopyStr(buf,",!same",sz);
1004
else TryCopyStr(buf,",same",sz);
1010
CopySetLockControlsArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,
1013
XkbCtrlsAction * act;
1017
act= &action->ctrls;
1018
tmp= XkbActionCtrls(act);
1019
TryCopyStr(buf,"controls=",sz);
1021
TryCopyStr(buf,"none",sz);
1022
else if ((tmp&XkbAllBooleanCtrlsMask)==XkbAllBooleanCtrlsMask)
1023
TryCopyStr(buf,"all",sz);
1026
if (tmp&XkbRepeatKeysMask) {
1027
sprintf(tbuf,"%sRepeatKeys",(nOut>0?"+":""));
1028
TryCopyStr(buf,tbuf,sz);
1031
if (tmp&XkbSlowKeysMask) {
1032
sprintf(tbuf,"%sSlowKeys",(nOut>0?"+":""));
1033
TryCopyStr(buf,tbuf,sz);
1036
if (tmp&XkbBounceKeysMask) {
1037
sprintf(tbuf,"%sBounceKeys",(nOut>0?"+":""));
1038
TryCopyStr(buf,tbuf,sz);
1041
if (tmp&XkbStickyKeysMask) {
1042
sprintf(tbuf,"%sStickyKeys",(nOut>0?"+":""));
1043
TryCopyStr(buf,tbuf,sz);
1046
if (tmp&XkbMouseKeysMask) {
1047
sprintf(tbuf,"%sMouseKeys",(nOut>0?"+":""));
1048
TryCopyStr(buf,tbuf,sz);
1051
if (tmp&XkbMouseKeysAccelMask) {
1052
sprintf(tbuf,"%sMouseKeysAccel",(nOut>0?"+":""));
1053
TryCopyStr(buf,tbuf,sz);
1056
if (tmp&XkbAccessXKeysMask) {
1057
sprintf(tbuf,"%sAccessXKeys",(nOut>0?"+":""));
1058
TryCopyStr(buf,tbuf,sz);
1061
if (tmp&XkbAccessXTimeoutMask) {
1062
sprintf(tbuf,"%sAccessXTimeout",(nOut>0?"+":""));
1063
TryCopyStr(buf,tbuf,sz);
1066
if (tmp&XkbAccessXFeedbackMask) {
1067
sprintf(tbuf,"%sAccessXFeedback",(nOut>0?"+":""));
1068
TryCopyStr(buf,tbuf,sz);
1071
if (tmp&XkbAudibleBellMask) {
1072
sprintf(tbuf,"%sAudibleBell",(nOut>0?"+":""));
1073
TryCopyStr(buf,tbuf,sz);
1076
if (tmp&XkbOverlay1Mask) {
1077
sprintf(tbuf,"%sOverlay1",(nOut>0?"+":""));
1078
TryCopyStr(buf,tbuf,sz);
1081
if (tmp&XkbOverlay2Mask) {
1082
sprintf(tbuf,"%sOverlay2",(nOut>0?"+":""));
1083
TryCopyStr(buf,tbuf,sz);
1086
if (tmp&XkbIgnoreGroupLockMask) {
1087
sprintf(tbuf,"%sIgnoreGroupLock",(nOut>0?"+":""));
1088
TryCopyStr(buf,tbuf,sz);
1097
CopyActionMessageArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
1100
XkbMessageAction * act;
1105
all= XkbSA_MessageOnPress|XkbSA_MessageOnRelease;
1106
TryCopyStr(buf,"report=",sz);
1107
if ((act->flags&all)==0)
1108
TryCopyStr(buf,"none",sz);
1109
else if ((act->flags&all)==all)
1110
TryCopyStr(buf,"all",sz);
1111
else if (act->flags&XkbSA_MessageOnPress)
1112
TryCopyStr(buf,"KeyPress",sz);
1113
else TryCopyStr(buf,"KeyRelease",sz);
1114
sprintf(tbuf,",data[0]=0x%02x",act->message[0]); TryCopyStr(buf,tbuf,sz);
1115
sprintf(tbuf,",data[1]=0x%02x",act->message[1]); TryCopyStr(buf,tbuf,sz);
1116
sprintf(tbuf,",data[2]=0x%02x",act->message[2]); TryCopyStr(buf,tbuf,sz);
1117
sprintf(tbuf,",data[3]=0x%02x",act->message[3]); TryCopyStr(buf,tbuf,sz);
1118
sprintf(tbuf,",data[4]=0x%02x",act->message[4]); TryCopyStr(buf,tbuf,sz);
1119
sprintf(tbuf,",data[5]=0x%02x",act->message[5]); TryCopyStr(buf,tbuf,sz);
1124
CopyRedirectKeyArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
1127
XkbRedirectKeyAction * act;
1130
unsigned vmods,vmods_mask;
1132
act= &action->redirect;
1134
vmods= XkbSARedirectVMods(act);
1135
vmods_mask= XkbSARedirectVModsMask(act);
1136
if (xkb && xkb->names && xkb->names->keys && (kc<=xkb->max_key_code) &&
1137
(xkb->names->keys[kc].name[0]!='\0')) {
1139
kn= XkbKeyNameText(xkb->names->keys[kc].name,XkbXKBFile);
1140
sprintf(tbuf,"key=%s",kn);
1142
else sprintf(tbuf,"key=%d",kc);
1143
TryCopyStr(buf,tbuf,sz);
1144
if ((act->mods_mask==0)&&(vmods_mask==0))
1146
if ((act->mods_mask==XkbAllModifiersMask)&&
1147
(vmods_mask==XkbAllVirtualModsMask)) {
1148
tmp= XkbVModMaskText(dpy,xkb,act->mods,vmods,XkbXKBFile);
1149
TryCopyStr(buf,",mods=",sz);
1150
TryCopyStr(buf,tmp,sz);
1153
if ((act->mods_mask&act->mods)||(vmods_mask&vmods)) {
1154
tmp= XkbVModMaskText(dpy,xkb,act->mods_mask&act->mods,
1155
vmods_mask&vmods,XkbXKBFile);
1156
TryCopyStr(buf,",mods= ",sz);
1157
TryCopyStr(buf,tmp,sz);
1159
if ((act->mods_mask&(~act->mods))||(vmods_mask&(~vmods))) {
1160
tmp= XkbVModMaskText(dpy,xkb,act->mods_mask&(~act->mods),
1161
vmods_mask&(~vmods),XkbXKBFile);
1162
TryCopyStr(buf,",clearMods= ",sz);
1163
TryCopyStr(buf,tmp,sz);
1171
CopyDeviceBtnArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,
1174
XkbDeviceBtnAction * act;
1177
act= &action->devbtn;
1178
sprintf(tbuf,"device= %d",act->device); TryCopyStr(buf,tbuf,sz);
1179
TryCopyStr(buf,",button=",sz);
1180
sprintf(tbuf,"%d",act->button);
1181
TryCopyStr(buf,tbuf,sz);
1183
sprintf(tbuf,",count=%d",act->count);
1184
TryCopyStr(buf,tbuf,sz);
1186
if (action->type==XkbSA_LockDeviceBtn) {
1187
switch (act->flags&(XkbSA_LockNoUnlock|XkbSA_LockNoLock)) {
1188
case XkbSA_LockNoLock:
1189
sprintf(tbuf,",affect=unlock"); break;
1190
case XkbSA_LockNoUnlock:
1191
sprintf(tbuf,",affect=lock"); break;
1192
case XkbSA_LockNoUnlock|XkbSA_LockNoLock:
1193
sprintf(tbuf,",affect=neither"); break;
1195
sprintf(tbuf,",affect=both"); break;
1197
TryCopyStr(buf,tbuf,sz);
1204
CopyOtherArgs(Display *dpy,XkbDescPtr xkb,XkbAction *action,char *buf,int *sz)
1210
sprintf(tbuf,"type=0x%02x",act->type); TryCopyStr(buf,tbuf,sz);
1211
sprintf(tbuf,",data[0]=0x%02x",act->data[0]); TryCopyStr(buf,tbuf,sz);
1212
sprintf(tbuf,",data[1]=0x%02x",act->data[1]); TryCopyStr(buf,tbuf,sz);
1213
sprintf(tbuf,",data[2]=0x%02x",act->data[2]); TryCopyStr(buf,tbuf,sz);
1214
sprintf(tbuf,",data[3]=0x%02x",act->data[3]); TryCopyStr(buf,tbuf,sz);
1215
sprintf(tbuf,",data[4]=0x%02x",act->data[4]); TryCopyStr(buf,tbuf,sz);
1216
sprintf(tbuf,",data[5]=0x%02x",act->data[5]); TryCopyStr(buf,tbuf,sz);
1217
sprintf(tbuf,",data[6]=0x%02x",act->data[6]); TryCopyStr(buf,tbuf,sz);
1221
typedef Bool (*actionCopy)(
1222
Display * /* dpy */,
1223
XkbDescPtr /* xkb */,
1224
XkbAction * /* action */,
1228
static actionCopy copyActionArgs[XkbSA_NumActions] = {
1229
CopyNoActionArgs /* NoAction */,
1230
CopyModActionArgs /* SetMods */,
1231
CopyModActionArgs /* LatchMods */,
1232
CopyModActionArgs /* LockMods */,
1233
CopyGroupActionArgs /* SetGroup */,
1234
CopyGroupActionArgs /* LatchGroup */,
1235
CopyGroupActionArgs /* LockGroup */,
1236
CopyMovePtrArgs /* MovePtr */,
1237
CopyPtrBtnArgs /* PtrBtn */,
1238
CopyPtrBtnArgs /* LockPtrBtn */,
1239
CopySetPtrDfltArgs /* SetPtrDflt */,
1240
CopyISOLockArgs /* ISOLock */,
1241
CopyNoActionArgs /* Terminate */,
1242
CopySwitchScreenArgs /* SwitchScreen */,
1243
CopySetLockControlsArgs /* SetControls */,
1244
CopySetLockControlsArgs /* LockControls */,
1245
CopyActionMessageArgs /* ActionMessage*/,
1246
CopyRedirectKeyArgs /* RedirectKey */,
1247
CopyDeviceBtnArgs /* DeviceBtn */,
1248
CopyDeviceBtnArgs /* LockDeviceBtn*/
1251
#define ACTION_SZ 256
1254
XkbActionText(Display *dpy,XkbDescPtr xkb,XkbAction *action,unsigned format)
1256
char buf[ACTION_SZ],*tmp;
1259
if (format==XkbCFile) {
1261
"{ %20s, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x } }",
1262
XkbActionTypeText(action->type,XkbCFile),
1263
action->any.data[0],action->any.data[1],action->any.data[2],
1264
action->any.data[3],action->any.data[4],action->any.data[5],
1265
action->any.data[6]);
1268
sprintf(buf,"%s(",XkbActionTypeText(action->type,XkbXKBFile));
1269
sz= ACTION_SZ-strlen(buf)+2; /* room for close paren and NULL */
1270
if (action->type<(unsigned)XkbSA_NumActions)
1271
(*copyActionArgs[action->type])(dpy,xkb,action,buf,&sz);
1272
else CopyOtherArgs(dpy,xkb,action,buf,&sz);
1273
TryCopyStr(buf,")",&sz);
1275
tmp= tbGetBuffer(strlen(buf)+1);
1282
XkbBehaviorText(XkbDescPtr xkb,XkbBehavior *behavior,unsigned format)
1286
if (format==XkbCFile) {
1287
if (behavior->type==XkbKB_Default)
1288
sprintf(buf,"{ 0, 0 }");
1289
else sprintf(buf,"{ %3d, 0x%02x }",behavior->type,behavior->data);
1292
unsigned type,permanent;
1293
type= behavior->type&XkbKB_OpMask;
1294
permanent=((behavior->type&XkbKB_Permanent)!=0);
1296
if (type==XkbKB_Lock) {
1297
sprintf(buf,"lock= %s",(permanent?"Permanent":"True"));
1299
else if (type==XkbKB_RadioGroup) {
1302
g= ((behavior->data)&(~XkbKB_RGAllowNone))+1;
1303
if (XkbKB_RGAllowNone&behavior->data) {
1304
sprintf(buf,"allowNone,");
1305
tmp= &buf[strlen(buf)];
1309
sprintf(tmp,"permanentRadioGroup= %d",g);
1310
else sprintf(tmp,"radioGroup= %d",g);
1312
else if ((type==XkbKB_Overlay1)||(type==XkbKB_Overlay2)) {
1316
ndx= ((type==XkbKB_Overlay1)?1:2);
1318
if ((xkb)&&(xkb->names)&&(xkb->names->keys))
1319
kn= XkbKeyNameText(xkb->names->keys[kc].name,XkbXKBFile);
1321
static char tbuf[8];
1322
sprintf(tbuf,"%d",kc);
1326
sprintf(buf,"permanentOverlay%d= %s",ndx,kn);
1327
else sprintf(buf,"overlay%d= %s",ndx,kn);
1330
tmp= tbGetBuffer(strlen(buf)+1);
1336
/***====================================================================***/
1339
XkbIndentText(unsigned size)
1341
static char buf[32];
1347
for (i=0;i<size;i++) {
1354
#ifndef XKB_IN_SERVER
1356
/***====================================================================***/
1358
#define PIXEL_MAX 65535
1361
XkbLookupCanonicalRGBColor(char *def,XColor *color)
1365
if (_XkbStrCaseEqual(def,"black")) {
1366
color->red= color->green= color->blue= 0;
1369
else if (_XkbStrCaseEqual(def,"white")) {
1370
color->red= color->green= color->blue= PIXEL_MAX;
1373
else if ((sscanf(def,"grey%d",&tmp)==1)||
1374
(sscanf(def,"gray%d",&tmp)==1)||
1375
(sscanf(def,"Grey%d",&tmp)==1)||
1376
(sscanf(def,"Gray%d",&tmp)==1)) {
1377
if ((tmp>0)&&(tmp<=100)) {
1378
tmp= (PIXEL_MAX*tmp)/100;
1379
color->red= color->green= color->blue= tmp;
1383
else if ((tmp=(_XkbStrCaseEqual(def,"red")*100))||
1384
(sscanf(def,"red%d",&tmp)==1)) {
1385
if ((tmp>0)&&(tmp<=100)) {
1386
tmp= (PIXEL_MAX*tmp)/100;
1388
color->green= color->blue= 0;
1392
else if ((tmp=(_XkbStrCaseEqual(def,"green")*100))||
1393
(sscanf(def,"green%d",&tmp)==1)) {
1394
if ((tmp>0)&&(tmp<=100)) {
1395
tmp= (PIXEL_MAX*tmp)/100;
1397
color->red= color->blue= 0;
1401
else if ((tmp=(_XkbStrCaseEqual(def,"blue")*100))||
1402
(sscanf(def,"blue%d",&tmp)==1)) {
1403
if ((tmp>0)&&(tmp<=100)) {
1404
tmp= (PIXEL_MAX*tmp)/100;
1406
color->red= color->green= 0;
1410
else if ((tmp=(_XkbStrCaseEqual(def,"magenta")*100))||
1411
(sscanf(def,"magenta%d",&tmp)==1)) {
1412
if ((tmp>0)&&(tmp<=100)) {
1413
tmp= (PIXEL_MAX*tmp)/100;
1415
color->red= color->blue= tmp;
1419
else if ((tmp=(_XkbStrCaseEqual(def,"cyan")*100))||
1420
(sscanf(def,"cyan%d",&tmp)==1)) {
1421
if ((tmp>0)&&(tmp<=100)) {
1422
tmp= (PIXEL_MAX*tmp)/100;
1424
color->green= color->blue= tmp;
1428
else if ((tmp=(_XkbStrCaseEqual(def,"yellow")*100))||
1429
(sscanf(def,"yellow%d",&tmp)==1)) {
1430
if ((tmp>0)&&(tmp<=100)) {
1431
tmp= (PIXEL_MAX*tmp)/100;
1433
color->red= color->green= tmp;