Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
1918bcb9
Unverified
Commit
1918bcb9
authored
Feb 28, 2018
by
Mihai Moldovan
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'uli42-pr/update_xkb' into 3.6.x
Attributes GH PR #648:
https://github.com/ArcticaProject/nx-libs/pull/648
parents
a6cb8583
00e3e95e
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
160 additions
and
3214 deletions
+160
-3214
nxagent.1
nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
+2
-8
Imakefile
nx-X11/programs/Xserver/xkb/Imakefile
+4
-16
XKBAlloc.c
nx-X11/programs/Xserver/xkb/XKBAlloc.c
+0
-4
XKBGAlloc.c
nx-X11/programs/Xserver/xkb/XKBGAlloc.c
+0
-3
XKBMAlloc.c
nx-X11/programs/Xserver/xkb/XKBMAlloc.c
+1
-3
XKBMisc.c
nx-X11/programs/Xserver/xkb/XKBMisc.c
+0
-2
ddxConfig.c
nx-X11/programs/Xserver/xkb/ddxConfig.c
+0
-208
ddxKillSrv.c
nx-X11/programs/Xserver/xkb/ddxKillSrv.c
+2
-16
ddxPrivate.c
nx-X11/programs/Xserver/xkb/ddxPrivate.c
+0
-24
ddxVT.c
nx-X11/programs/Xserver/xkb/ddxVT.c
+0
-20
maprules.c
nx-X11/programs/Xserver/xkb/maprules.c
+10
-9
xkb.c
nx-X11/programs/Xserver/xkb/xkb.c
+1
-1
xkbInit.c
nx-X11/programs/Xserver/xkb/xkbInit.c
+8
-59
xkbUtils.c
nx-X11/programs/Xserver/xkb/xkbUtils.c
+6
-0
xkbconfig.c
nx-X11/programs/Xserver/xkb/xkbconfig.c
+6
-0
xkberrs.c
nx-X11/programs/Xserver/xkb/xkberrs.c
+0
-2
xkbfmisc.c
nx-X11/programs/Xserver/xkb/xkbfmisc.c
+36
-448
xkbout.c
nx-X11/programs/Xserver/xkb/xkbout.c
+0
-1051
xkbtext.c
nx-X11/programs/Xserver/xkb/xkbtext.c
+0
-1326
xkmread.c
nx-X11/programs/Xserver/xkb/xkmread.c
+84
-14
No files found.
nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
View file @
1918bcb9
...
...
@@ -724,20 +724,14 @@ base directory for keyboard layout files. This option is not available
for setuid X servers (i.e., when the X server's real and effective uids
are different).
.TP 8
.B \-ar
1
\fImilliseconds\fP
.B \-ar
delay
\fImilliseconds\fP
sets the autorepeat delay (length of time in milliseconds that a key must
be depressed before autorepeat starts).
.TP 8
.B \-ar
2
\fImilliseconds\fP
.B \-ar
interval
\fImilliseconds\fP
sets the autorepeat interval (length of time in milliseconds that should
elapse between autorepeat-generated keystrokes).
.TP 8
.B \-noloadxkb
disables loading of an XKB keymap description on server startup.
.TP 8
.B \-xkbdb \fIfilename\fP
uses \fIfilename\fP for default keyboard keymaps.
.TP 8
.B \-xkbmap \fIfilename\fP
loads keyboard description in \fIfilename\fP on server startup.
...
...
nx-X11/programs/Xserver/xkb/Imakefile
View file @
1918bcb9
...
...
@@ -18,25 +18,20 @@ XKB_DDXDEFS = XkbServerDefines
NX_DEFINES = -DNXAGENT_SERVER
#endif
#if (defined(XorgServer) && XorgServer)
XF86INCLUDES = -I$(XF86COMSRC) -I$(XF86OSSRC)
XF86_OBJS = xf86KillSrv.o xf86VT.o xf86Private.o
#endif
DDX_SRCS = ddxBeep.c ddxCtrls.c ddxFakeBtn.c ddxFakeMtn.c ddxInit.c \
ddxKeyClick.c ddxKillSrv.c ddxLEDs.c ddxVT.c ddxLoad.c \
ddxList.c ddx
Config.c ddx
DevBtn.c ddxPrivate.c xkbconfig.c
ddxList.c ddxDevBtn.c ddxPrivate.c xkbconfig.c
DDX_OBJS = ddxBeep.o ddxCtrls.o ddxFakeBtn.o ddxFakeMtn.o ddxInit.o \
ddxKeyClick.o ddxKillSrv.o ddxLEDs.o ddxVT.o ddxLoad.o \
ddxList.o ddx
Config.o ddx
DevBtn.o ddxPrivate.o xkbconfig.o
ddxList.o ddxDevBtn.o ddxPrivate.o xkbconfig.o
SRCS = xkb.c xkbUtils.c xkbEvents.c xkbAccessX.c xkbSwap.c \
xkbLEDs.c xkbInit.c xkbActions.c xkbPrKeyEv.c \
xkmread.c xkb
text.c xkbfmisc.c xkberrs.c xkbout
.c maprules.c \
xkmread.c xkb
fmisc.c xkberrs
.c maprules.c \
XKBMisc.c XKBMAlloc.c XKBAlloc.c XKBGAlloc.c \
$(XKBXI_SRCS) $(DDX_SRCS)
OBJS = xkb.o xkbUtils.o xkbEvents.o xkbAccessX.o xkbSwap.o \
xkbLEDs.o xkbInit.o xkbActions.o xkbPrKeyEv.o \
xkmread.o xkb
text.o xkbfmisc.o xkberrs.o xkbout
.o maprules.o \
xkmread.o xkb
fmisc.o xkberrs
.o maprules.o \
XKBMisc.o XKBMAlloc.o XKBAlloc.o XKBGAlloc.o \
$(XKBXI_OBJS) $(DDX_OBJS)
INCLUDES = -I../include -I$(XINCLUDESRC) -I$(EXTINCSRC) -I$(SERVERSRC)/Xext \
...
...
@@ -52,13 +47,6 @@ NormalLibraryTarget(xkb,$(OBJS))
LintLibraryTarget(xkb,$(SRCS))
NormalLintTarget($(SRCS))
#if (defined(XorgServer) && XorgServer)
ObjectFromSpecialSource(xf86KillSrv,ddxKillSrv,-DXF86DDXACTIONS)
ObjectFromSpecialSource(xf86VT,ddxVT,-DXF86DDXACTIONS)
ObjectFromSpecialSource(xf86Private,ddxPrivate,-DXF86DDXACTIONS)
AllTarget($(XF86_OBJS))
#endif
SpecialCObjectRule(xkbInit,$(ICONFIGFILES),$(XKB_DEFINES))
#if BuildLibraries
...
...
nx-X11/programs/Xserver/xkb/XKBAlloc.c
View file @
1918bcb9
...
...
@@ -26,11 +26,8 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
...
...
@@ -39,7 +36,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <xkbsrv.h>
#include "xkbgeom.h"
/***===================================================================***/
/*ARGSUSED*/
...
...
nx-X11/programs/Xserver/xkb/XKBGAlloc.c
View file @
1918bcb9
...
...
@@ -26,8 +26,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
...
...
@@ -39,7 +37,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <xkbsrv.h>
#include "xkbgeom.h"
#ifdef X_NOT_POSIX
#define Size_t unsigned int
#else
...
...
nx-X11/programs/Xserver/xkb/XKBMAlloc.c
View file @
1918bcb9
...
...
@@ -30,7 +30,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <config.h>
#endif
#include <stdio.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
...
...
@@ -39,7 +38,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <nx-X11/keysym.h>
#include <xkbsrv.h>
/***====================================================================***/
Status
...
...
@@ -298,7 +296,7 @@ XkbClientMapPtr map;
}
}
}
if
((
!
map
)
||
(
!
map
->
types
)
||
(
!
map
->
num_types
<
XkbNumRequiredTypes
))
{
if
((
!
map
)
||
(
!
map
->
types
)
||
(
!
(
map
->
num_types
<
XkbNumRequiredTypes
)
))
{
tmp
=
XkbNumRequiredTypes
+
1
;
if
(
XkbAllocClientMap
(
xkb
,
XkbKeyTypesMask
,
tmp
)
!=
Success
)
return
NULL
;
...
...
nx-X11/programs/Xserver/xkb/XKBMisc.c
View file @
1918bcb9
...
...
@@ -30,7 +30,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <config.h>
#endif
#include <stdio.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
...
...
@@ -39,7 +38,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <nx-X11/keysym.h>
#include <xkbsrv.h>
/***====================================================================***/
#define mapSize(m) (sizeof(m)/sizeof(XkbKTMapEntryRec))
...
...
nx-X11/programs/Xserver/xkb/ddxConfig.c
deleted
100644 → 0
View file @
a6cb8583
/************************************************************
Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
********************************************************/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif
#include <stdio.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
#include <nx-X11/keysym.h>
#include "inputstr.h"
#include "scrnintstr.h"
#include "windowstr.h"
#include "os.h"
#include <xkbsrv.h>
#include <nx-X11/extensions/XKBconfig.h>
Bool
XkbDDXApplyConfig
(
XPointer
cfg_in
,
XkbSrvInfoPtr
info
)
{
XkbConfigRtrnPtr
rtrn
;
XkbDescPtr
xkb
;
Bool
ok
;
XkbEventCauseRec
cause
;
xkb
=
info
->
desc
;
rtrn
=
(
XkbConfigRtrnPtr
)
cfg_in
;
if
(
rtrn
==
NULL
)
return
True
;
ok
=
XkbCFApplyRtrnValues
(
rtrn
,
XkbCFDflts
,
xkb
);
if
(
rtrn
->
initial_mods
.
replace
)
{
info
->
state
.
locked_mods
=
rtrn
->
initial_mods
.
mods
;
}
else
{
info
->
state
.
locked_mods
|=
rtrn
->
initial_mods
.
mods
;
if
(
rtrn
->
initial_mods
.
mods_clear
)
info
->
state
.
locked_mods
&=
~
rtrn
->
initial_mods
.
mods_clear
;
}
XkbComputeDerivedState
(
info
);
XkbSetCauseUnknown
(
&
cause
);
XkbUpdateIndicators
(
info
->
device
,
XkbAllIndicatorsMask
,
False
,
NULL
,
&
cause
);
if
(
info
->
device
&&
info
->
device
->
kbdfeed
)
{
DeviceIntPtr
dev
;
KeybdCtrl
newCtrl
;
dev
=
info
->
device
;
newCtrl
=
dev
->
kbdfeed
->
ctrl
;
if
(
rtrn
->
click_volume
>=
0
)
newCtrl
.
click
=
rtrn
->
click_volume
;
if
(
rtrn
->
bell_volume
>=
0
)
newCtrl
.
bell
=
rtrn
->
bell_volume
;
if
(
rtrn
->
bell_pitch
>
0
)
newCtrl
.
bell_pitch
=
rtrn
->
bell_pitch
;
if
(
rtrn
->
bell_duration
>
0
)
newCtrl
.
bell_duration
=
rtrn
->
bell_duration
;
if
(
dev
->
kbdfeed
->
CtrlProc
)
(
*
dev
->
kbdfeed
->
CtrlProc
)(
dev
,
&
newCtrl
);
}
XkbCFFreeRtrn
(
rtrn
,
XkbCFDflts
,
xkb
);
return
ok
;
}
XPointer
XkbDDXPreloadConfig
(
char
**
rulesRtrn
,
XkbRF_VarDefsPtr
defs
,
XkbComponentNamesPtr
names
,
DeviceIntPtr
dev
)
{
char
buf
[
PATH_MAX
];
char
*
dName
;
FILE
*
file
;
XkbConfigRtrnPtr
rtrn
;
#if defined(MetroLink)
if
(
dev
&&
dev
->
name
)
dName
=
dev
->
name
;
else
dName
=
""
;
/* It doesn't appear that XkbBaseDirectory could ever get set to NULL */
sprintf
(
buf
,
"%s/X%s-config%s%s"
,
XkbBaseDirectory
,
display
,
(
dName
[
0
]
?
"."
:
""
),
dName
);
#else
if
(
dev
&&
dev
->
name
)
dName
=
dev
->
name
;
else
dName
=
""
;
if
(
XkbBaseDirectory
!=
NULL
)
{
if
(
strlen
(
XkbBaseDirectory
)
+
strlen
(
display
)
+
strlen
(
dName
)
+
10
+
(
dName
[
0
]
?
1
:
0
)
>
PATH_MAX
)
{
#ifdef DEBUG
ErrorF
(
"path exceeds max length
\n
"
);
#endif
return
NULL
;
}
sprintf
(
buf
,
"%s/X%s-config%s%s"
,
XkbBaseDirectory
,
display
,
(
dName
[
0
]
?
"."
:
""
),
dName
);
}
else
{
if
(
strlen
(
display
)
+
strlen
(
dName
)
+
10
+
(
dName
[
0
]
?
1
:
0
)
>
PATH_MAX
)
{
#ifdef DEBUG
ErrorF
(
"path exceeds max length
\n
"
);
#endif
return
NULL
;
}
sprintf
(
buf
,
"X%s-config%s%s"
,
display
,(
dName
[
0
]
?
"."
:
""
),
dName
);
}
#endif
#ifdef DEBUG
ErrorF
(
"Looking for keyboard configuration in %s..."
,
buf
);
#endif
file
=
fopen
(
buf
,
"r"
);
if
(
file
==
NULL
)
{
#ifdef DEBUG
ErrorF
(
"file not found
\n
"
);
#endif
return
NULL
;
}
rtrn
=
_XkbTypedCalloc
(
1
,
XkbConfigRtrnRec
);
if
(
rtrn
!=
NULL
)
{
if
(
!
XkbCFParse
(
file
,
XkbCFDflts
,
NULL
,
rtrn
))
{
#ifdef DEBUG
ErrorF
(
"error
\n
"
);
#endif
ErrorF
(
"Error parsing config file: "
);
XkbCFReportError
(
stderr
,
buf
,
rtrn
->
error
,
rtrn
->
line
);
_XkbFree
(
rtrn
);
fclose
(
file
);
return
NULL
;
}
#ifdef DEBUG
ErrorF
(
"found it
\n
"
);
#endif
if
(
rtrn
->
rules_file
)
{
*
rulesRtrn
=
rtrn
->
rules_file
;
rtrn
->
rules_file
=
NULL
;
}
if
(
rtrn
->
model
)
{
defs
->
model
=
rtrn
->
model
;
rtrn
->
model
=
NULL
;
}
if
(
rtrn
->
layout
)
{
defs
->
layout
=
rtrn
->
layout
;
rtrn
->
layout
=
NULL
;
}
if
(
rtrn
->
variant
)
{
defs
->
variant
=
rtrn
->
variant
;
rtrn
->
variant
=
NULL
;
}
if
(
rtrn
->
options
)
{
defs
->
options
=
rtrn
->
options
;
rtrn
->
options
=
NULL
;
}
XkbSetRulesUsed
(
defs
);
if
(
rtrn
->
keycodes
!=
NULL
)
{
if
(
names
->
keycodes
)
_XkbFree
(
names
->
keycodes
);
names
->
keycodes
=
rtrn
->
keycodes
;
rtrn
->
keycodes
=
NULL
;
}
if
(
rtrn
->
geometry
!=
NULL
)
{
if
(
names
->
geometry
)
_XkbFree
(
names
->
geometry
);
names
->
geometry
=
rtrn
->
geometry
;
rtrn
->
geometry
=
NULL
;
}
if
(
rtrn
->
symbols
!=
NULL
)
{
if
(
rtrn
->
phys_symbols
==
NULL
)
rtrn
->
phys_symbols
=
Xstrdup
(
names
->
symbols
);
if
(
names
->
symbols
)
_XkbFree
(
names
->
symbols
);
names
->
symbols
=
rtrn
->
symbols
;
rtrn
->
symbols
=
NULL
;
}
if
(
rtrn
->
types
!=
NULL
)
{
if
(
names
->
types
)
_XkbFree
(
names
->
types
);
names
->
types
=
rtrn
->
types
;
rtrn
->
types
=
NULL
;
}
if
(
rtrn
->
compat
!=
NULL
)
{
if
(
names
->
compat
)
_XkbFree
(
names
->
compat
);
names
->
compat
=
rtrn
->
compat
;
rtrn
->
compat
=
NULL
;
}
}
fclose
(
file
);
return
(
XPointer
)
rtrn
;
}
nx-X11/programs/Xserver/xkb/ddxKillSrv.c
View file @
1918bcb9
...
...
@@ -42,25 +42,11 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <xkbsrv.h>
#include <nx-X11/extensions/XI.h>
#ifdef XF86DDXACTIONS
#include "xf86.h"
#endif
int
XkbDDXTerminateServer
(
DeviceIntPtr
dev
,
KeyCode
key
,
XkbAction
*
act
)
{
#ifdef NXAGENT_SERVER
return
0
;
#else
#ifdef XF86DDXACTIONS
xf86ProcessActionEvent
(
ACTION_TERMINATE
,
NULL
);
#else
#ifndef NXAGENT_SERVER
GiveUp
(
1
);
#endif
return
0
;
#endif
/* NXAGENT_SERVER */
return
0
;
}
nx-X11/programs/Xserver/xkb/ddxPrivate.c
View file @
1918bcb9
...
...
@@ -12,32 +12,8 @@
#include "windowstr.h"
#include <xkbsrv.h>
#ifdef XF86DDXACTIONS
#include "xf86.h"
#endif
int
XkbDDXPrivate
(
DeviceIntPtr
dev
,
KeyCode
key
,
XkbAction
*
act
)
{
#ifdef XF86DDXACTIONS
XkbAnyAction
*
xf86act
=
&
(
act
->
any
);
char
msgbuf
[
XkbAnyActionDataSize
+
1
];
if
(
xf86act
->
type
==
XkbSA_XFree86Private
)
{
memcpy
(
msgbuf
,
xf86act
->
data
,
XkbAnyActionDataSize
);
msgbuf
[
XkbAnyActionDataSize
]
=
'\0'
;
if
(
_XkbStrCaseCmp
(
msgbuf
,
"-vmode"
)
==
0
)
xf86ProcessActionEvent
(
ACTION_PREV_MODE
,
NULL
);
else
if
(
_XkbStrCaseCmp
(
msgbuf
,
"+vmode"
)
==
0
)
xf86ProcessActionEvent
(
ACTION_NEXT_MODE
,
NULL
);
else
if
(
_XkbStrCaseCmp
(
msgbuf
,
"ungrab"
)
==
0
)
xf86ProcessActionEvent
(
ACTION_DISABLEGRAB
,
NULL
);
else
if
(
_XkbStrCaseCmp
(
msgbuf
,
"clsgrb"
)
==
0
)
xf86ProcessActionEvent
(
ACTION_CLOSECLIENT
,
NULL
);
else
xf86ProcessActionEvent
(
ACTION_MESSAGE
,
(
void
*
)
msgbuf
);
}
#endif
return
0
;
}
nx-X11/programs/Xserver/xkb/ddxVT.c
View file @
1918bcb9
...
...
@@ -42,28 +42,8 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <xkbsrv.h>
#include <nx-X11/extensions/XI.h>
#ifdef XF86DDXACTIONS
#include "xf86.h"
#endif
int
XkbDDXSwitchScreen
(
DeviceIntPtr
dev
,
KeyCode
key
,
XkbAction
*
act
)
{
#ifdef XF86DDXACTIONS
{
int
scrnnum
=
XkbSAScreen
(
&
act
->
screen
);
if
(
act
->
screen
.
flags
&
XkbSA_SwitchApplication
)
{
if
(
act
->
screen
.
flags
&
XkbSA_SwitchAbsolute
)
xf86ProcessActionEvent
(
ACTION_SWITCHSCREEN
,(
void
*
)
&
scrnnum
);
else
{
if
(
scrnnum
<
0
)
xf86ProcessActionEvent
(
ACTION_SWITCHSCREEN_PREV
,
NULL
);
else
xf86ProcessActionEvent
(
ACTION_SWITCHSCREEN_NEXT
,
NULL
);
}
}
}
#endif
return
1
;
}
nx-X11/programs/Xserver/xkb/maprules.c
View file @
1918bcb9
...
...
@@ -26,8 +26,6 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
...
...
@@ -38,7 +36,6 @@
#define XOS_USE_NO_LOCKING
#include <nx-X11/Xos_r.h>
#include <nx-X11/Xproto.h>
#include <nx-X11/X.h>
#include <nx-X11/Xos.h>
...
...
@@ -51,7 +48,6 @@
#include "xkbstr.h"
#include <xkbsrv.h>
#ifdef DEBUG
#define PR_DEBUG(s) fprintf(stderr,s)
#define PR_DEBUG1(s,a) fprintf(stderr,s,a)
...
...
@@ -62,6 +58,12 @@
#define PR_DEBUG2(s,a,b)
#endif
#ifdef NEED_STRCASECMP
extern
int
_XkbStrCaseCmp
(
char
*
s1
,
char
*
s2
);
#else
#define _XkbStrCaseCmp strcasecmp
#endif
/***====================================================================***/
#define DFLT_LINE_SIZE 128
...
...
@@ -1086,13 +1088,13 @@ int len,headingtype,extra_ndx = 0;
for
(
;
GetInputLine
(
file
,
&
line
,
False
);
line
.
num_line
=
0
)
{
if
(
line
.
line
[
0
]
==
'!'
)
{
tok
=
strtok
(
&
(
line
.
line
[
1
]),
"
\t
"
);
if
(
!
_XkbStrCaseCmp
(
tok
,
"model"
)
)
if
(
_XkbStrCaseCmp
(
tok
,
"model"
)
==
0
)
headingtype
=
HEAD_MODEL
;
else
if
(
!
_XkbStrCaseCmp
(
tok
,
"layout"
)
)
else
if
(
_XkbStrCaseCmp
(
tok
,
"layout"
)
==
0
)
headingtype
=
HEAD_LAYOUT
;
else
if
(
!
_XkbStrCaseCmp
(
tok
,
"variant"
)
)
else
if
(
_XkbStrCaseCmp
(
tok
,
"variant"
)
==
0
)
headingtype
=
HEAD_VARIANT
;
else
if
(
!
_XkbStrCaseCmp
(
tok
,
"option"
)
)
else
if
(
_XkbStrCaseCmp
(
tok
,
"option"
)
==
0
)
headingtype
=
HEAD_OPTION
;
else
{
int
i
;
...
...
@@ -1324,4 +1326,3 @@ XkbRF_GroupPtr group;
_XkbFree
(
rules
);
return
;
}
nx-X11/programs/Xserver/xkb/xkb.c
View file @
1918bcb9
...
...
@@ -1246,7 +1246,7 @@ XkbSizeVirtualModMap(XkbDescPtr xkb,xkbGetMapReply *rep)
rep
->
totalVModMapKeys
=
0
;
return
0
;
}
for
(
nRtrn
=
i
=
0
;
i
<
rep
->
nVModMapKeys
;
i
++
)
{
for
(
nRtrn
=
i
=
0
;
i
<
rep
->
nVModMapKeys
-
1
;
i
++
)
{
if
(
xkb
->
server
->
vmodmap
[
i
+
rep
->
firstVModMapKey
]
!=
0
)
nRtrn
++
;
}
...
...
nx-X11/programs/Xserver/xkb/xkbInit.c
View file @
1918bcb9
...
...
@@ -118,8 +118,6 @@ char * XkbBinDirectory= XKB_BIN_DIRECTORY;
char
*
XkbInitialMap
=
NULL
;
int
XkbWantAccessX
=
0
;
static
XkbFileInfo
*
_XkbInitFileInfo
=
NULL
;
char
*
XkbDB
=
NULL
;
int
XkbAutoLoad
=
1
;
static
Bool
rulesDefined
=
False
;
static
char
*
XkbRulesFile
=
NULL
;
...
...
@@ -136,7 +134,7 @@ char * XkbOptionsUsed= NULL;
int
_XkbClientMajor
=
XkbMajorVersion
;
int
_XkbClientMinor
=
XkbMinorVersion
;
Bool
noXkbExtension
=
XKB_DFLT_DISABLED
;
Bool
noXkbExtension
=
XKB_DFLT_DISABLED
;
Bool
XkbWantRulesProp
=
XKB_DFLT_RULES_PROP
;
/***====================================================================***/
...
...
@@ -505,7 +503,7 @@ XkbEventCauseRec cause;
file
.
file
=
NULL
;
bzero
(
&
file
.
xkbinfo
,
sizeof
(
XkbFileInfo
));
bzero
(
&
changes
,
sizeof
(
XkbChangesRec
));
if
(
Xkb
AutoLoad
&&
(
XkbInitialMap
!=
NULL
)
)
{
if
(
Xkb
InitialMap
!=
NULL
)
{
if
((
file
.
file
=
XkbDDXOpenConfigFile
(
XkbInitialMap
,
NULL
,
0
))
!=
NULL
)
{
XkmReadFile
(
file
.
file
,
0
,
XkmKeymapLegal
,
&
file
.
xkbinfo
);
if
(
file
.
xkbinfo
.
xkb
==
NULL
)
{
...
...
@@ -638,8 +636,6 @@ KeySymsRec tmpSyms,*pSyms;
CARD8
tmpMods
[
XkbMaxLegalKeyCode
+
1
],
*
pMods
;
char
name
[
PATH_MAX
],
*
rules
;
Bool
ok
=
False
;
XPointer
config
;
XkbComponentNamesRec
cfgNames
;
XkbRF_VarDefsRec
defs
;
if
((
dev
->
key
!=
NULL
)
||
(
dev
->
kbdfeed
!=
NULL
))
...
...
@@ -647,9 +643,7 @@ XkbRF_VarDefsRec defs;
pSyms
=
pSymsIn
;
pMods
=
pModsIn
;
bzero
(
&
defs
,
sizeof
(
XkbRF_VarDefsRec
));
bzero
(
&
cfgNames
,
sizeof
(
XkbComponentNamesRec
));
rules
=
XkbGetRulesDflts
(
&
defs
);
config
=
XkbDDXPreloadConfig
(
&
rules
,
&
defs
,
&
cfgNames
,
dev
);
/*
* The strings are duplicated because it is not guaranteed that
...
...
@@ -702,30 +696,6 @@ XkbRF_VarDefsRec defs;
XkbSetRulesUsed
(
&
defs
);
}
}
if
(
cfgNames
.
keymap
){
if
(
names
->
keymap
)
_XkbFree
(
names
->
keymap
);
names
->
keymap
=
cfgNames
.
keymap
;
}
if
(
cfgNames
.
keycodes
){
if
(
names
->
keycodes
)
_XkbFree
(
names
->
keycodes
);
names
->
keycodes
=
cfgNames
.
keycodes
;
}
if
(
cfgNames
.
types
)
{
if
(
names
->
types
)
_XkbFree
(
names
->
types
);
names
->
types
=
cfgNames
.
types
;
}
if
(
cfgNames
.
compat
)
{
if
(
names
->
compat
)
_XkbFree
(
names
->
compat
);
names
->
compat
=
cfgNames
.
compat
;
}
if
(
cfgNames
.
symbols
){
if
(
names
->
symbols
)
_XkbFree
(
names
->
symbols
);
names
->
symbols
=
cfgNames
.
symbols
;
}
if
(
cfgNames
.
geometry
)
{
if
(
names
->
geometry
)
_XkbFree
(
names
->
geometry
);
names
->
geometry
=
cfgNames
.
geometry
;
}
if
(
names
->
keymap
)
{
XkbComponentNamesRec
tmpNames
;
...
...
@@ -778,8 +748,6 @@ XkbRF_VarDefsRec defs;
LogMessage
(
X_WARNING
,
"Couldn't load XKB keymap, falling back to pre-XKB keymap
\n
"
);
}
ok
=
InitKeyboardDeviceStruct
((
DevicePtr
)
dev
,
pSyms
,
pMods
,
bellProc
,
ctrlProc
);
if
((
config
!=
NULL
)
&&
(
dev
&&
dev
->
key
&&
dev
->
key
->
xkbInfo
))
XkbDDXApplyConfig
(
config
,
dev
->
key
->
xkbInfo
);
_XkbInitFileInfo
=
NULL
;
if
((
pSyms
==&
tmpSyms
)
&&
(
pSyms
->
map
!=
NULL
))
{
_XkbFree
(
pSyms
->
map
);
...
...
@@ -960,24 +928,6 @@ XkbProcessArguments(int argc,char *argv[],int i)
return
-
1
;
}
}
else
if
(
strncmp
(
argv
[
i
],
"-xkbdb"
,
7
)
==
0
)
{
if
(
++
i
<
argc
)
{
if
(
strlen
(
argv
[
i
])
<
PATH_MAX
)
{
XkbDB
=
argv
[
i
];
return
2
;
}
else
{
LogMessage
(
X_ERROR
,
"-xkbdb pathname too long
\n
"
);
return
-
1
;
}
}
else
{
return
-
1
;
}
}
else
if
(
strncmp
(
argv
[
i
],
"-noloadxkb"
,
7
)
==
0
)
{
XkbAutoLoad
=
0
;
return
1
;
}
else
if
((
strncmp
(
argv
[
i
],
"-accessx"
,
8
)
==
0
)
||
(
strncmp
(
argv
[
i
],
"+accessx"
,
8
)
==
0
))
{
int
j
=
1
;
...
...
@@ -1016,12 +966,14 @@ XkbProcessArguments(int argc,char *argv[],int i)
}
return
j
;
}
if
(
strcmp
(
argv
[
i
],
"-ar1"
)
==
0
)
{
/* -ar1 int */
if
((
strcmp
(
argv
[
i
],
"-ardelay"
)
==
0
)
||
(
strcmp
(
argv
[
i
],
"-ar1"
)
==
0
))
{
/* -ardelay int */
if
(
++
i
>=
argc
)
UseMsg
();
XkbDfltRepeatDelay
=
(
long
)
atoi
(
argv
[
i
]);
return
2
;
}
if
(
strcmp
(
argv
[
i
],
"-ar2"
)
==
0
)
{
/* -ar2 int */
if
((
strcmp
(
argv
[
i
],
"-arinterval"
)
==
0
)
||
(
strcmp
(
argv
[
i
],
"-ar2"
)
==
0
))
{
/* -arinterval int */
if
(
++
i
>=
argc
)
UseMsg
();
XkbDfltRepeatInterval
=
(
long
)
atoi
(
argv
[
i
]);
return
2
;
...
...
@@ -1032,14 +984,11 @@ XkbProcessArguments(int argc,char *argv[],int i)
void
XkbUseMsg
(
void
)
{
ErrorF
(
"The X Keyboard Extension adds the following arguments:
\n
"
);
ErrorF
(
"-kb disable the X Keyboard Extension
\n
"
);
ErrorF
(
"+kb enable the X Keyboard Extension
\n
"
);
ErrorF
(
"[+-]accessx [ timeout [ timeout_mask [ feedback [ options_mask] ] ] ]
\n
"
);
ErrorF
(
" enable/disable accessx key sequences
\n
"
);
ErrorF
(
"-ar1 set XKB autorepeat delay
\n
"
);
ErrorF
(
"-ar2 set XKB autorepeat interval
\n
"
);
ErrorF
(
"-noloadxkb don't load XKB keymap description
\n
"
);
ErrorF
(
"-xkbdb file that contains default XKB keymaps
\n
"
);
ErrorF
(
"-ardelay set XKB autorepeat delay
\n
"
);
ErrorF
(
"-arinterval set XKB autorepeat interval
\n
"
);
ErrorF
(
"-xkbmap XKB keyboard description to load on startup
\n
"
);
}
nx-X11/programs/Xserver/xkb/xkbUtils.c
View file @
1918bcb9
...
...
@@ -674,6 +674,9 @@ CARD16 grp_mask;
XkbStatePtr
state
=
&
xkbi
->
state
;
XkbCompatMapPtr
map
;
if
(
!
state
||
!
xkbi
->
desc
||
!
xkbi
->
desc
->
ctrls
||
!
xkbi
->
desc
->
compat
)
return
;
map
=
xkbi
->
desc
->
compat
;
grp_mask
=
map
->
groups
[
state
->
group
].
mask
;
state
->
compat_state
=
state
->
mods
|
grp_mask
;
...
...
@@ -733,6 +736,9 @@ XkbStatePtr state= &xkbi->state;
XkbControlsPtr
ctrls
=
xkbi
->
desc
->
ctrls
;
unsigned
char
grp
;
if
(
!
state
||
!
ctrls
)
return
;
state
->
mods
=
(
state
->
base_mods
|
state
->
latched_mods
);
state
->
mods
|=
state
->
locked_mods
;
state
->
lookup_mods
=
state
->
mods
&
(
~
ctrls
->
internal
.
mask
);
...
...
nx-X11/programs/Xserver/xkb/xkbconfig.c
View file @
1918bcb9
...
...
@@ -49,6 +49,12 @@
#include <nx-X11/extensions/XKBconfig.h>
#ifdef NEED_STRCASECMP
extern
int
_XkbStrCaseCmp
(
char
*
s1
,
char
*
s2
);
#else
#define _XkbStrCaseCmp strcasecmp
#endif
/***====================================================================***/
#define XKBCF_MAX_STR_LEN 100
...
...
nx-X11/programs/Xserver/xkb/xkberrs.c
View file @
1918bcb9
...
...
@@ -26,8 +26,6 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
...
...
nx-X11/programs/Xserver/xkb/xkbfmisc.c
View file @
1918bcb9
...
...
@@ -26,8 +26,6 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
...
...
@@ -37,7 +35,6 @@
#include <nx-X11/Xos.h>
#include <nx-X11/Xfuncs.h>
#include <nx-X11/X.h>
#include <nx-X11/keysym.h>
#include <nx-X11/Xproto.h>
...
...
@@ -49,214 +46,18 @@
#include "xkbgeom.h"
#include "xkb.h"
unsigned
_XkbKSCheckCase
(
KeySym
ks
)
{
unsigned
set
,
rtrn
;
set
=
(
ks
&
(
~
0xff
))
>>
8
;
rtrn
=
0
;
switch
(
set
)
{
case
0
:
/* latin 1 */
if
(((
ks
>=
XK_A
)
&&
(
ks
<=
XK_Z
))
||
((
ks
>=
XK_Agrave
)
&&
(
ks
<=
XK_THORN
)
&&
(
ks
!=
XK_multiply
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_a
)
&&
(
ks
<=
XK_z
))
||
((
ks
>=
XK_agrave
)
&&
(
ks
<=
XK_ydiaeresis
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
1
:
/* latin 2 */
if
(((
ks
>=
XK_Aogonek
)
&&
(
ks
<=
XK_Zabovedot
)
&&
(
ks
!=
XK_breve
))
||
((
ks
>=
XK_Racute
)
&&
(
ks
<=
XK_Tcedilla
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_aogonek
)
&&
(
ks
<=
XK_zabovedot
)
&&
(
ks
!=
XK_caron
))
||
((
ks
>=
XK_racute
)
&&
(
ks
<=
XK_tcedilla
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
2
:
/* latin 3 */
if
(((
ks
>=
XK_Hstroke
)
&&
(
ks
<=
XK_Jcircumflex
))
||
((
ks
>=
XK_Cabovedot
)
&&
(
ks
<=
XK_Scircumflex
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_hstroke
)
&&
(
ks
<=
XK_jcircumflex
))
||
((
ks
>=
XK_cabovedot
)
&&
(
ks
<=
XK_scircumflex
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
3
:
/* latin 4 */
if
(((
ks
>=
XK_Rcedilla
)
&&
(
ks
<=
XK_Tslash
))
||
(
ks
==
XK_ENG
)
||
((
ks
>=
XK_Amacron
)
&&
(
ks
<=
XK_Umacron
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_rcedilla
)
&&
(
ks
<=
XK_tslash
))
||
(
ks
==
XK_eng
)
||
((
ks
>=
XK_amacron
)
&&
(
ks
<=
XK_umacron
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
18
:
/* latin 8 */
if
((
ks
==
XK_Babovedot
)
||
((
ks
>=
XK_Dabovedot
)
&&
(
ks
<=
XK_Wacute
))
||
((
ks
>=
XK_Ygrave
)
&&
(
ks
<=
XK_Fabovedot
))
||
(
ks
==
XK_Mabovedot
)
||
(
ks
==
XK_Pabovedot
)
||
(
ks
==
XK_Sabovedot
)
||
(
ks
==
XK_Wdiaeresis
)
||
((
ks
>=
XK_Wcircumflex
)
&&
(
ks
<=
XK_Ycircumflex
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
((
ks
==
XK_babovedot
)
||
(
ks
==
XK_dabovedot
)
||
(
ks
==
XK_fabovedot
)
||
(
ks
==
XK_mabovedot
)
||
((
ks
>=
XK_wgrave
)
&&
(
ks
<=
XK_wacute
))
||
(
ks
==
XK_ygrave
)
||
((
ks
>=
XK_wdiaeresis
)
&&
(
ks
<=
XK_ycircumflex
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
19
:
/* latin 9 */
if
((
ks
==
XK_OE
)
||
(
ks
==
XK_Ydiaeresis
))
{
rtrn
|=
_XkbKSUpper
;
}
if
(
ks
==
XK_oe
)
{
rtrn
|=
_XkbKSLower
;
}
break
;
}
return
rtrn
;
}
/***===================================================================***/
int
_XkbStrCaseCmp
(
char
*
str1
,
char
*
str2
)
{
char
buf1
[
512
],
buf2
[
512
];
char
c
,
*
s
;
register
int
n
;
for
(
n
=
0
,
s
=
buf1
;
(
c
=
*
str1
++
);
n
++
)
{
if
(
isupper
(
c
))
c
=
tolower
(
c
);
if
(
n
>
510
)
break
;
*
s
++
=
c
;
}
*
s
=
'\0'
;
for
(
n
=
0
,
s
=
buf2
;
(
c
=
*
str2
++
);
n
++
)
{
if
(
isupper
(
c
))
c
=
tolower
(
c
);
if
(
n
>
510
)
break
;
*
s
++
=
c
;
}
*
s
=
'\0'
;
return
(
strcmp
(
buf1
,
buf2
));
}
/***===================================================================***/
Bool
XkbLookupGroupAndLevel
(
XkbDescPtr
xkb
,
int
key
,
int
*
mods_inout
,
int
*
grp_inout
,
int
*
lvl_rtrn
)
{
int
nG
,
eG
;
if
((
!
xkb
)
||
(
!
XkbKeycodeInRange
(
xkb
,
key
))
||
(
!
grp_inout
))
return
False
;
nG
=
XkbKeyNumGroups
(
xkb
,
key
);
eG
=
*
grp_inout
;
if
(
nG
==
0
)
{
*
grp_inout
=
0
;
if
(
lvl_rtrn
!=
NULL
)
*
lvl_rtrn
=
0
;
return
False
;
}
else
if
(
nG
==
1
)
{
eG
=
0
;
}
else
if
(
eG
>=
nG
)
{
unsigned
gI
=
XkbKeyGroupInfo
(
xkb
,
key
);
switch
(
XkbOutOfRangeGroupAction
(
gI
))
{
default:
eG
%=
nG
;
break
;
case
XkbClampIntoRange
:
eG
=
nG
-
1
;
break
;
case
XkbRedirectIntoRange
:
eG
=
XkbOutOfRangeGroupNumber
(
gI
);
if
(
eG
>=
nG
)
eG
=
0
;
break
;
}
}
*
grp_inout
=
eG
;
if
(
mods_inout
!=
NULL
)
{
XkbKeyTypePtr
type
;
int
preserve
;
type
=
XkbKeyKeyType
(
xkb
,
key
,
eG
);
if
(
lvl_rtrn
!=
NULL
)
*
lvl_rtrn
=
0
;
preserve
=
0
;
if
(
type
->
map
)
{
/* find the shift level */
register
int
i
;
register
XkbKTMapEntryPtr
entry
;
for
(
i
=
0
,
entry
=
type
->
map
;
i
<
type
->
map_count
;
i
++
,
entry
++
)
{
if
((
entry
->
active
)
&&
(((
*
mods_inout
)
&
type
->
mods
.
mask
)
==
entry
->
mods
.
mask
)){
if
(
lvl_rtrn
!=
NULL
)
*
lvl_rtrn
=
entry
->
level
;
if
(
type
->
preserve
)
preserve
=
type
->
preserve
[
i
].
mask
;
break
;
}
}
}
(
*
mods_inout
)
&=
~
(
type
->
mods
.
mask
&
(
~
preserve
));
}
return
True
;
}
/***===================================================================***/
static
Bool
XkbWriteSectionFromName
(
FILE
*
file
,
char
*
sectionName
,
char
*
name
)
{
fprintf
(
file
,
" xkb_%-20s { include
\"
%s
\"
};
\n
"
,
sectionName
,
name
);
ErrorF
(
" xkb_%-20s { include
\"
%s
\"
};
\n
"
,
sectionName
,
name
);
return
True
;
}
#define NEED_DESC(n) ((!n)||((n)[0]=='+')||((n)[0]=='|')||(strchr((n),'%')))
#define COMPLETE(n) ((n)&&(!NEED_DESC(n)))
/* ARGSUSED */
static
void
_AddIncl
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
int
index
,
void
*
priv
)
{
if
((
priv
)
&&
(
strcmp
((
char
*
)
priv
,
"%"
)
!=
0
))
fprintf
(
file
,
" include
\"
%s
\"\n
"
,(
char
*
)
priv
);
return
;
}
Bool
XkbWriteXKBKeymapForNames
(
FILE
*
file
,
XkbComponentNamesPtr
names
,
...
...
@@ -265,230 +66,29 @@ XkbWriteXKBKeymapForNames( FILE * file,
unsigned
want
,
unsigned
need
)
{
char
*
name
;
const
char
*
tmp
;
unsigned
complete
;
XkbNamesPtr
old_names
;
int
multi_section
;
unsigned
wantNames
,
wantConfig
,
wantDflts
;
XkbFileInfo
finfo
;
bzero
(
&
finfo
,
sizeof
(
XkbFileInfo
));
if
(
!
names
||
(
!
names
->
keycodes
&&
!
names
->
types
&&
!
names
->
compat
&&
!
names
->
symbols
&&
!
names
->
geometry
))
return
False
;
fprintf
(
file
,
"xkb_keymap
\"
%s
\"
{
\n
"
,
names
->
keymap
?
names
->
keymap
:
"default"
);
if
(
names
->
keycodes
)
XkbWriteSectionFromName
(
file
,
"keycodes"
,
names
->
keycodes
);
if
(
names
->
types
)
XkbWriteSectionFromName
(
file
,
"types"
,
names
->
types
);
if
(
names
->
compat
)
XkbWriteSectionFromName
(
file
,
"compatibility"
,
names
->
compat
);
if
(
names
->
symbols
)
XkbWriteSectionFromName
(
file
,
"symbols"
,
names
->
symbols
);
if
(
names
->
geometry
)
XkbWriteSectionFromName
(
file
,
"geometry"
,
names
->
geometry
);
fprintf
(
file
,
"};
\n
"
);
complete
=
0
;
if
((
name
=
names
->
keymap
)
==
NULL
)
name
=
"default"
;
if
(
COMPLETE
(
names
->
keycodes
))
complete
|=
XkmKeyNamesMask
;
if
(
COMPLETE
(
names
->
types
))
complete
|=
XkmTypesMask
;
if
(
COMPLETE
(
names
->
compat
))
complete
|=
XkmCompatMapMask
;
if
(
COMPLETE
(
names
->
symbols
))
complete
|=
XkmSymbolsMask
;
if
(
COMPLETE
(
names
->
geometry
))
complete
|=
XkmGeometryMask
;
want
|=
(
complete
|
need
);
if
(
want
&
XkmSymbolsMask
)
want
|=
XkmKeyNamesMask
|
XkmTypesMask
;
if
(
want
==
0
)
return
False
;
if
(
xkb
!=
NULL
)
{
old_names
=
xkb
->
names
;
finfo
.
type
=
0
;
finfo
.
defined
=
0
;
finfo
.
xkb
=
xkb
;
if
(
!
XkbDetermineFileType
(
&
finfo
,
XkbXKBFile
,
NULL
))
return
False
;
}
else
old_names
=
NULL
;
wantConfig
=
want
&
(
~
complete
);
if
(
xkb
!=
NULL
)
{
if
(
wantConfig
&
XkmTypesMask
)
{
if
((
!
xkb
->
map
)
||
(
xkb
->
map
->
num_types
<
XkbNumRequiredTypes
))
wantConfig
&=
~
XkmTypesMask
;
}
if
(
wantConfig
&
XkmCompatMapMask
)
{
if
((
!
xkb
->
compat
)
||
(
xkb
->
compat
->
num_si
<
1
))
wantConfig
&=
~
XkmCompatMapMask
;
}
if
(
wantConfig
&
XkmSymbolsMask
)
{
if
((
!
xkb
->
map
)
||
(
!
xkb
->
map
->
key_sym_map
))
wantConfig
&=
~
XkmSymbolsMask
;
}
if
(
wantConfig
&
XkmIndicatorsMask
)
{
if
(
!
xkb
->
indicators
)
wantConfig
&=
~
XkmIndicatorsMask
;
}
if
(
wantConfig
&
XkmKeyNamesMask
)
{
if
((
!
xkb
->
names
)
||
(
!
xkb
->
names
->
keys
))
wantConfig
&=
~
XkmKeyNamesMask
;
}
if
((
wantConfig
&
XkmGeometryMask
)
&&
(
!
xkb
->
geom
))
wantConfig
&=
~
XkmGeometryMask
;
}
else
{
wantConfig
=
0
;
}
complete
|=
wantConfig
;
wantDflts
=
0
;
wantNames
=
want
&
(
~
complete
);
if
((
xkb
!=
NULL
)
&&
(
old_names
!=
NULL
))
{
if
(
wantNames
&
XkmTypesMask
)
{
if
(
old_names
->
types
!=
None
)
{
tmp
=
NameForAtom
(
old_names
->
types
);
names
->
types
=
Xstrdup
(
tmp
);
}
else
{
wantDflts
|=
XkmTypesMask
;
}
complete
|=
XkmTypesMask
;
}
if
(
wantNames
&
XkmCompatMapMask
)
{
if
(
old_names
->
compat
!=
None
)
{
tmp
=
NameForAtom
(
old_names
->
compat
);
names
->
compat
=
Xstrdup
(
tmp
);
}
else
wantDflts
|=
XkmCompatMapMask
;
complete
|=
XkmCompatMapMask
;
}
if
(
wantNames
&
XkmSymbolsMask
)
{
if
(
old_names
->
symbols
==
None
)
return
False
;
tmp
=
NameForAtom
(
old_names
->
symbols
);
names
->
symbols
=
Xstrdup
(
tmp
);
complete
|=
XkmSymbolsMask
;
}
if
(
wantNames
&
XkmKeyNamesMask
)
{
if
(
old_names
->
keycodes
!=
None
)
{
tmp
=
NameForAtom
(
old_names
->
keycodes
);
names
->
keycodes
=
Xstrdup
(
tmp
);
}
else
wantDflts
|=
XkmKeyNamesMask
;
complete
|=
XkmKeyNamesMask
;
}
if
(
wantNames
&
XkmGeometryMask
)
{
if
(
old_names
->
geometry
==
None
)
return
False
;
tmp
=
NameForAtom
(
old_names
->
geometry
);
names
->
geometry
=
Xstrdup
(
tmp
);
complete
|=
XkmGeometryMask
;
wantNames
&=
~
XkmGeometryMask
;
}
}
if
(
complete
&
XkmCompatMapMask
)
complete
|=
XkmIndicatorsMask
|
XkmVirtualModsMask
;
else
if
(
complete
&
(
XkmSymbolsMask
|
XkmTypesMask
))
complete
|=
XkmVirtualModsMask
;
if
(
need
&
(
~
complete
))
return
False
;
if
((
complete
&
XkmSymbolsMask
)
&&
((
XkmKeyNamesMask
|
XkmTypesMask
)
&
(
~
complete
)))
return
False
;
multi_section
=
1
;
if
(((
complete
&
XkmKeymapRequired
)
==
XkmKeymapRequired
)
&&
((
complete
&
(
~
XkmKeymapLegal
))
==
0
))
{
fprintf
(
file
,
"xkb_keymap
\"
%s
\"
{
\n
"
,
name
);
}
else
if
(((
complete
&
XkmSemanticsRequired
)
==
XkmSemanticsRequired
)
&&
((
complete
&
(
~
XkmSemanticsLegal
))
==
0
))
{
fprintf
(
file
,
"xkb_semantics
\"
%s
\"
{
\n
"
,
name
);
}
else
if
(((
complete
&
XkmLayoutRequired
)
==
XkmLayoutRequired
)
&&
((
complete
&
(
~
XkmLayoutLegal
))
==
0
))
{
fprintf
(
file
,
"xkb_layout
\"
%s
\"
{
\n
"
,
name
);
}
else
if
(
XkmSingleSection
(
complete
&
(
~
XkmVirtualModsMask
)))
{
multi_section
=
0
;
}
else
{
return
False
;
}
wantNames
=
complete
&
(
~
(
wantConfig
|
wantDflts
));
name
=
names
->
keycodes
;
if
(
wantConfig
&
XkmKeyNamesMask
)
XkbWriteXKBKeycodes
(
file
,
&
finfo
,
False
,
False
,
_AddIncl
,
name
);
else
if
(
wantDflts
&
XkmKeyNamesMask
)
fprintf
(
stderr
,
"Default symbols not implemented yet!
\n
"
);
else
if
(
wantNames
&
XkmKeyNamesMask
)
XkbWriteSectionFromName
(
file
,
"keycodes"
,
name
);
name
=
names
->
types
;
if
(
wantConfig
&
XkmTypesMask
)
XkbWriteXKBKeyTypes
(
file
,
&
finfo
,
False
,
False
,
_AddIncl
,
name
);
else
if
(
wantDflts
&
XkmTypesMask
)
fprintf
(
stderr
,
"Default types not implemented yet!
\n
"
);
else
if
(
wantNames
&
XkmTypesMask
)
XkbWriteSectionFromName
(
file
,
"types"
,
name
);
name
=
names
->
compat
;
if
(
wantConfig
&
XkmCompatMapMask
)
XkbWriteXKBCompatMap
(
file
,
&
finfo
,
False
,
False
,
_AddIncl
,
name
);
else
if
(
wantDflts
&
XkmCompatMapMask
)
fprintf
(
stderr
,
"Default interps not implemented yet!
\n
"
);
else
if
(
wantNames
&
XkmCompatMapMask
)
XkbWriteSectionFromName
(
file
,
"compatibility"
,
name
);
name
=
names
->
symbols
;
if
(
wantConfig
&
XkmSymbolsMask
)
XkbWriteXKBSymbols
(
file
,
&
finfo
,
False
,
False
,
_AddIncl
,
name
);
else
if
(
wantNames
&
XkmSymbolsMask
)
XkbWriteSectionFromName
(
file
,
"symbols"
,
name
);
name
=
names
->
geometry
;
if
(
wantConfig
&
XkmGeometryMask
)
XkbWriteXKBGeometry
(
file
,
&
finfo
,
False
,
False
,
_AddIncl
,
name
);
else
if
(
wantNames
&
XkmGeometryMask
)
XkbWriteSectionFromName
(
file
,
"geometry"
,
name
);
if
(
multi_section
)
fprintf
(
file
,
"};
\n
"
);
return
True
;
}
/***====================================================================***/
/*ARGSUSED*/
Status
XkbMergeFile
(
XkbDescPtr
xkb
,
XkbFileInfo
finfo
)
{
return
BadImplementation
;
}
/***====================================================================***/
int
XkbFindKeycodeByName
(
XkbDescPtr
xkb
,
char
*
name
,
Bool
use_aliases
)
{
register
int
i
;
if
((
!
xkb
)
||
(
!
xkb
->
names
)
||
(
!
xkb
->
names
->
keys
))
return
0
;
for
(
i
=
xkb
->
min_key_code
;
i
<=
xkb
->
max_key_code
;
i
++
)
{
if
(
strncmp
(
xkb
->
names
->
keys
[
i
].
name
,
name
,
XkbKeyNameLength
)
==
0
)
return
i
;
}
if
(
!
use_aliases
)
return
0
;
if
(
xkb
->
geom
&&
xkb
->
geom
->
key_aliases
)
{
XkbKeyAliasPtr
a
;
a
=
xkb
->
geom
->
key_aliases
;
for
(
i
=
0
;
i
<
xkb
->
geom
->
num_key_aliases
;
i
++
,
a
++
)
{
if
(
strncmp
(
name
,
a
->
alias
,
XkbKeyNameLength
)
==
0
)
return
XkbFindKeycodeByName
(
xkb
,
a
->
real
,
False
);
}
}
if
(
xkb
->
names
&&
xkb
->
names
->
key_aliases
)
{
XkbKeyAliasPtr
a
;
a
=
xkb
->
names
->
key_aliases
;
for
(
i
=
0
;
i
<
xkb
->
names
->
num_key_aliases
;
i
++
,
a
++
)
{
if
(
strncmp
(
name
,
a
->
alias
,
XkbKeyNameLength
)
==
0
)
return
XkbFindKeycodeByName
(
xkb
,
a
->
real
,
False
);
}
}
return
0
;
}
unsigned
XkbConvertGetByNameComponents
(
Bool
toXkm
,
unsigned
orig
)
{
...
...
@@ -515,34 +115,6 @@ unsigned rtrn;
return
rtrn
;
}
unsigned
XkbConvertXkbComponents
(
Bool
toXkm
,
unsigned
orig
)
{
unsigned
rtrn
;
rtrn
=
0
;
if
(
toXkm
)
{
if
(
orig
&
XkbClientMapMask
)
rtrn
|=
XkmTypesMask
|
XkmSymbolsMask
;
if
(
orig
&
XkbServerMapMask
)
rtrn
|=
XkmTypesMask
|
XkmSymbolsMask
;
if
(
orig
&
XkbCompatMapMask
)
rtrn
|=
XkmCompatMapMask
;
if
(
orig
&
XkbIndicatorMapMask
)
rtrn
|=
XkmIndicatorsMask
;
if
(
orig
&
XkbNamesMask
)
rtrn
|=
XkmKeyNamesMask
;
if
(
orig
&
XkbGeometryMask
)
rtrn
|=
XkmGeometryMask
;
}
else
{
if
(
orig
!=
0
)
rtrn
|=
XkbNamesMask
;
if
(
orig
&
XkmTypesMask
)
rtrn
|=
XkbClientMapMask
;
if
(
orig
&
XkmCompatMapMask
)
rtrn
|=
XkbCompatMapMask
|
XkbIndicatorMapMask
;
if
(
orig
&
XkmSymbolsMask
)
rtrn
|=
XkbClientMapMask
|
XkbServerMapMask
;
if
(
orig
&
XkmIndicatorsMask
)
rtrn
|=
XkbIndicatorMapMask
;
if
(
orig
&
XkmKeyNamesMask
)
rtrn
|=
XkbNamesMask
|
XkbIndicatorMapMask
;
if
(
orig
&
XkmGeometryMask
)
rtrn
|=
XkbGeometryMask
;
}
return
rtrn
;
}
Bool
XkbDetermineFileType
(
XkbFileInfoPtr
finfo
,
int
format
,
int
*
opts_missing
)
{
...
...
@@ -673,3 +245,19 @@ XkbNameMatchesPattern(char *name,char *ptrn)
/* if we get here, the pattern is exhausted (-:just like me:-) */
return
(
name
[
0
]
==
'\0'
);
}
#ifdef NEED_STRCASECMP
_X_HIDDEN
int
_XkbStrCaseCmp
(
char
*
str1
,
char
*
str2
)
{
const
u_char
*
us1
=
(
const
u_char
*
)
str1
,
*
us2
=
(
const
u_char
*
)
str2
;
while
(
tolower
(
*
us1
)
==
tolower
(
*
us2
))
{
if
(
*
us1
++
==
'\0'
)
return
(
0
);
us2
++
;
}
return
(
tolower
(
*
us1
)
-
tolower
(
*
us2
));
}
#endif
nx-X11/programs/Xserver/xkb/xkbout.c
deleted
100644 → 0
View file @
a6cb8583
/************************************************************
Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
********************************************************/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <nx-X11/Xfuncs.h>
#include <nx-X11/X.h>
#include <nx-X11/keysym.h>
#include <nx-X11/Xproto.h>
#include "misc.h"
#include "inputstr.h"
#include "dix.h"
#include "xkbstr.h"
#include <xkbsrv.h>
#include "xkbgeom.h"
#include "xkbfile.h"
#define VMOD_HIDE_VALUE 0
#define VMOD_SHOW_VALUE 1
#define VMOD_COMMENT_VALUE 2
static
Bool
WriteXKBVModDecl
(
FILE
*
file
,
Display
*
dpy
,
XkbDescPtr
xkb
,
int
showValue
)
{
register
int
i
,
nMods
;
Atom
*
vmodNames
;
if
(
xkb
==
NULL
)
return
False
;
if
(
xkb
->
names
!=
NULL
)
vmodNames
=
xkb
->
names
->
vmods
;
else
vmodNames
=
NULL
;
for
(
i
=
nMods
=
0
;
i
<
XkbNumVirtualMods
;
i
++
)
{
if
((
vmodNames
!=
NULL
)
&&
(
vmodNames
[
i
]
!=
None
))
{
if
(
nMods
==
0
)
fprintf
(
file
,
" virtual_modifiers "
);
else
fprintf
(
file
,
","
);
fprintf
(
file
,
"%s"
,
XkbAtomText
(
dpy
,
vmodNames
[
i
],
XkbXKBFile
));
if
((
showValue
!=
VMOD_HIDE_VALUE
)
&&
(
xkb
->
server
)
&&
(
xkb
->
server
->
vmods
[
i
]
!=
XkbNoModifierMask
))
{
if
(
showValue
==
VMOD_COMMENT_VALUE
)
{
fprintf
(
file
,
"/* = %s */"
,
XkbModMaskText
(
xkb
->
server
->
vmods
[
i
],
XkbXKBFile
));
}
else
{
fprintf
(
file
,
"= %s"
,
XkbModMaskText
(
xkb
->
server
->
vmods
[
i
],
XkbXKBFile
));
}
}
nMods
++
;
}
}
if
(
nMods
>
0
)
fprintf
(
file
,
";
\n\n
"
);
return
True
;
}
/***====================================================================***/
static
Bool
WriteXKBAction
(
FILE
*
file
,
XkbFileInfo
*
result
,
XkbAnyAction
*
action
)
{
XkbDescPtr
xkb
;
Display
*
dpy
;
xkb
=
result
->
xkb
;
dpy
=
xkb
->
dpy
;
fprintf
(
file
,
"%s"
,
XkbActionText
(
dpy
,
xkb
,(
XkbAction
*
)
action
,
XkbXKBFile
));
return
True
;
}
/***====================================================================***/
Bool
XkbWriteXKBKeycodes
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Atom
kcName
;
register
unsigned
i
;
XkbDescPtr
xkb
;
Display
*
dpy
;
char
*
alternate
;
xkb
=
result
->
xkb
;
dpy
=
xkb
->
dpy
;
if
((
!
xkb
)
||
(
!
xkb
->
names
)
||
(
!
xkb
->
names
->
keys
))
{
_XkbLibError
(
_XkbErrMissingNames
,
"XkbWriteXKBKeycodes"
,
0
);
return
False
;
}
kcName
=
xkb
->
names
->
keycodes
;
if
(
kcName
!=
None
)
fprintf
(
file
,
"xkb_keycodes
\"
%s
\"
{
\n
"
,
XkbAtomText
(
dpy
,
kcName
,
XkbXKBFile
));
else
fprintf
(
file
,
"xkb_keycodes {
\n
"
);
fprintf
(
file
,
" minimum = %d;
\n
"
,
xkb
->
min_key_code
);
fprintf
(
file
,
" maximum = %d;
\n
"
,
xkb
->
max_key_code
);
for
(
i
=
xkb
->
min_key_code
;
i
<=
xkb
->
max_key_code
;
i
++
)
{
if
(
xkb
->
names
->
keys
[
i
].
name
[
0
]
!=
'\0'
)
{
if
(
XkbFindKeycodeByName
(
xkb
,
xkb
->
names
->
keys
[
i
].
name
,
True
)
!=
i
)
alternate
=
"alternate "
;
else
alternate
=
""
;
fprintf
(
file
,
" %s%6s = %d;
\n
"
,
alternate
,
XkbKeyNameText
(
xkb
->
names
->
keys
[
i
].
name
,
XkbXKBFile
),
i
);
}
}
if
(
xkb
->
indicators
!=
NULL
)
{
for
(
i
=
0
;
i
<
XkbNumIndicators
;
i
++
)
{
char
*
type
;
if
(
xkb
->
indicators
->
phys_indicators
&
(
1
<<
i
))
type
=
" "
;
else
type
=
" virtual "
;
if
(
xkb
->
names
->
indicators
[
i
]
!=
None
)
{
fprintf
(
file
,
"%sindicator %d =
\"
%s
\"
;
\n
"
,
type
,
i
+
1
,
XkbAtomText
(
dpy
,
xkb
->
names
->
indicators
[
i
],
XkbXKBFile
));
}
}
}
if
(
xkb
->
names
->
key_aliases
!=
NULL
)
{
XkbKeyAliasPtr
pAl
;
pAl
=
xkb
->
names
->
key_aliases
;
for
(
i
=
0
;
i
<
xkb
->
names
->
num_key_aliases
;
i
++
,
pAl
++
)
{
fprintf
(
file
,
" alias %6s = %6s;
\n
"
,
XkbKeyNameText
(
pAl
->
alias
,
XkbXKBFile
),
XkbKeyNameText
(
pAl
->
real
,
XkbXKBFile
));
}
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
topLevel
,
showImplicit
,
XkmKeyNamesIndex
,
priv
);
fprintf
(
file
,
"};
\n\n
"
);
return
True
;
}
Bool
XkbWriteXKBKeyTypes
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Display
*
dpy
;
register
unsigned
i
,
n
;
XkbKeyTypePtr
type
;
XkbKTMapEntryPtr
entry
;
XkbDescPtr
xkb
;
xkb
=
result
->
xkb
;
dpy
=
xkb
->
dpy
;
if
((
!
xkb
)
||
(
!
xkb
->
map
)
||
(
!
xkb
->
map
->
types
))
{
_XkbLibError
(
_XkbErrMissingTypes
,
"XkbWriteXKBKeyTypes"
,
0
);
return
False
;
}
if
(
xkb
->
map
->
num_types
<
XkbNumRequiredTypes
)
{
_XkbLibError
(
_XkbErrMissingReqTypes
,
"XkbWriteXKBKeyTypes"
,
0
);
return
0
;
}
if
((
xkb
->
names
==
NULL
)
||
(
xkb
->
names
->
types
==
None
))
fprintf
(
file
,
"xkb_types {
\n\n
"
);
else
fprintf
(
file
,
"xkb_types
\"
%s
\"
{
\n\n
"
,
XkbAtomText
(
dpy
,
xkb
->
names
->
types
,
XkbXKBFile
));
WriteXKBVModDecl
(
file
,
dpy
,
xkb
,
(
showImplicit
?
VMOD_COMMENT_VALUE
:
VMOD_HIDE_VALUE
));
type
=
xkb
->
map
->
types
;
for
(
i
=
0
;
i
<
xkb
->
map
->
num_types
;
i
++
,
type
++
)
{
fprintf
(
file
,
" type
\"
%s
\"
{
\n
"
,
XkbAtomText
(
dpy
,
type
->
name
,
XkbXKBFile
));
fprintf
(
file
,
" modifiers= %s;
\n
"
,
XkbVModMaskText
(
dpy
,
xkb
,
type
->
mods
.
real_mods
,
type
->
mods
.
vmods
,
XkbXKBFile
));
entry
=
type
->
map
;
for
(
n
=
0
;
n
<
type
->
map_count
;
n
++
,
entry
++
)
{
char
*
str
;
str
=
XkbVModMaskText
(
dpy
,
xkb
,
entry
->
mods
.
real_mods
,
entry
->
mods
.
vmods
,
XkbXKBFile
);
fprintf
(
file
,
" map[%s]= Level%d;
\n
"
,
str
,
entry
->
level
+
1
);
if
((
type
->
preserve
)
&&
((
type
->
preserve
[
n
].
real_mods
)
||
(
type
->
preserve
[
n
].
vmods
)))
{
fprintf
(
file
,
" preserve[%s]= "
,
str
);
fprintf
(
file
,
"%s;
\n
"
,
XkbVModMaskText
(
dpy
,
xkb
,
type
->
preserve
[
n
].
real_mods
,
type
->
preserve
[
n
].
vmods
,
XkbXKBFile
));
}
}
if
(
type
->
level_names
!=
NULL
)
{
Atom
*
name
=
type
->
level_names
;
for
(
n
=
0
;
n
<
type
->
num_levels
;
n
++
,
name
++
)
{
if
((
*
name
)
==
None
)
continue
;
fprintf
(
file
,
" level_name[Level%d]=
\"
%s
\"
;
\n
"
,
n
+
1
,
XkbAtomText
(
dpy
,
*
name
,
XkbXKBFile
));
}
}
fprintf
(
file
,
" };
\n
"
);
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
topLevel
,
showImplicit
,
XkmTypesIndex
,
priv
);
fprintf
(
file
,
"};
\n\n
"
);
return
True
;
}
static
Bool
WriteXKBIndicatorMap
(
FILE
*
file
,
XkbFileInfo
*
result
,
Atom
name
,
XkbIndicatorMapPtr
led
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
XkbDescPtr
xkb
;
xkb
=
result
->
xkb
;
fprintf
(
file
,
" indicator
\"
%s
\"
{
\n
"
,
NameForAtom
(
name
));
if
(
led
->
flags
&
XkbIM_NoExplicit
)
fprintf
(
file
,
" !allowExplicit;
\n
"
);
if
(
led
->
flags
&
XkbIM_LEDDrivesKB
)
fprintf
(
file
,
" indicatorDrivesKeyboard;
\n
"
);
if
(
led
->
which_groups
!=
0
)
{
if
(
led
->
which_groups
!=
XkbIM_UseEffective
)
{
fprintf
(
file
,
" whichGroupState= %s;
\n
"
,
XkbIMWhichStateMaskText
(
led
->
which_groups
,
XkbXKBFile
));
}
fprintf
(
file
,
" groups= 0x%02x;
\n
"
,
led
->
groups
);
}
if
(
led
->
which_mods
!=
0
)
{
if
(
led
->
which_mods
!=
XkbIM_UseEffective
)
{
fprintf
(
file
,
" whichModState= %s;
\n
"
,
XkbIMWhichStateMaskText
(
led
->
which_mods
,
XkbXKBFile
));
}
fprintf
(
file
,
" modifiers= %s;
\n
"
,
XkbVModMaskText
(
xkb
->
dpy
,
xkb
,
led
->
mods
.
real_mods
,
led
->
mods
.
vmods
,
XkbXKBFile
));
}
if
(
led
->
ctrls
!=
0
)
{
fprintf
(
file
,
" controls= %s;
\n
"
,
XkbControlsMaskText
(
led
->
ctrls
,
XkbXKBFile
));
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
False
,
True
,
XkmIndicatorsIndex
,
priv
);
fprintf
(
file
,
" };
\n
"
);
return
True
;
}
Bool
XkbWriteXKBCompatMap
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Display
*
dpy
;
register
unsigned
i
;
XkbSymInterpretPtr
interp
;
XkbDescPtr
xkb
;
xkb
=
result
->
xkb
;
dpy
=
xkb
->
dpy
;
if
((
!
xkb
)
||
(
!
xkb
->
compat
)
||
(
!
xkb
->
compat
->
sym_interpret
))
{
_XkbLibError
(
_XkbErrMissingCompatMap
,
"XkbWriteXKBCompatMap"
,
0
);
return
False
;
}
if
((
xkb
->
names
==
NULL
)
||
(
xkb
->
names
->
compat
==
None
))
fprintf
(
file
,
"xkb_compatibility {
\n\n
"
);
else
fprintf
(
file
,
"xkb_compatibility
\"
%s
\"
{
\n\n
"
,
XkbAtomText
(
dpy
,
xkb
->
names
->
compat
,
XkbXKBFile
));
WriteXKBVModDecl
(
file
,
dpy
,
xkb
,
(
showImplicit
?
VMOD_COMMENT_VALUE
:
VMOD_HIDE_VALUE
));
fprintf
(
file
,
" interpret.useModMapMods= AnyLevel;
\n
"
);
fprintf
(
file
,
" interpret.repeat= False;
\n
"
);
fprintf
(
file
,
" interpret.locking= False;
\n
"
);
interp
=
xkb
->
compat
->
sym_interpret
;
for
(
i
=
0
;
i
<
xkb
->
compat
->
num_si
;
i
++
,
interp
++
)
{
fprintf
(
file
,
" interpret %s+%s(%s) {
\n
"
,
((
interp
->
sym
==
NoSymbol
)
?
"Any"
:
XkbKeysymText
(
interp
->
sym
,
XkbXKBFile
)),
XkbSIMatchText
(
interp
->
match
,
XkbXKBFile
),
XkbModMaskText
(
interp
->
mods
,
XkbXKBFile
));
if
(
interp
->
virtual_mod
!=
XkbNoModifier
)
{
fprintf
(
file
,
" virtualModifier= %s;
\n
"
,
XkbVModIndexText
(
dpy
,
xkb
,
interp
->
virtual_mod
,
XkbXKBFile
));
}
if
(
interp
->
match
&
XkbSI_LevelOneOnly
)
fprintf
(
file
,
" useModMapMods=level1;
\n
"
);
if
(
interp
->
flags
&
XkbSI_LockingKey
)
fprintf
(
file
,
" locking= True;
\n
"
);
if
(
interp
->
flags
&
XkbSI_AutoRepeat
)
fprintf
(
file
,
" repeat= True;
\n
"
);
fprintf
(
file
,
" action= "
);
WriteXKBAction
(
file
,
result
,
&
interp
->
act
);
fprintf
(
file
,
";
\n
"
);
fprintf
(
file
,
" };
\n
"
);
}
for
(
i
=
0
;
i
<
XkbNumKbdGroups
;
i
++
)
{
XkbModsPtr
gc
;
gc
=
&
xkb
->
compat
->
groups
[
i
];
if
((
gc
->
real_mods
==
0
)
&&
(
gc
->
vmods
==
0
))
continue
;
fprintf
(
file
,
" group %d = %s;
\n
"
,
i
+
1
,
XkbVModMaskText
(
xkb
->
dpy
,
xkb
,
gc
->
real_mods
,
gc
->
vmods
,
XkbXKBFile
));
}
if
(
xkb
->
indicators
)
{
for
(
i
=
0
;
i
<
XkbNumIndicators
;
i
++
)
{
XkbIndicatorMapPtr
map
=
&
xkb
->
indicators
->
maps
[
i
];
if
((
map
->
flags
!=
0
)
||
(
map
->
which_groups
!=
0
)
||
(
map
->
groups
!=
0
)
||
(
map
->
which_mods
!=
0
)
||
(
map
->
mods
.
real_mods
!=
0
)
||
(
map
->
mods
.
vmods
!=
0
)
||
(
map
->
ctrls
!=
0
))
{
WriteXKBIndicatorMap
(
file
,
result
,
xkb
->
names
->
indicators
[
i
],
map
,
addOn
,
priv
);
}
}
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
topLevel
,
showImplicit
,
XkmCompatMapIndex
,
priv
);
fprintf
(
file
,
"};
\n\n
"
);
return
True
;
}
Bool
XkbWriteXKBSymbols
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Display
*
dpy
;
register
unsigned
i
,
tmp
;
XkbDescPtr
xkb
;
XkbClientMapPtr
map
;
XkbServerMapPtr
srv
;
Bool
showActions
;
xkb
=
result
->
xkb
;
map
=
xkb
->
map
;
srv
=
xkb
->
server
;
dpy
=
xkb
->
dpy
;
if
((
!
xkb
)
||
(
!
map
)
||
(
!
map
->
syms
)
||
(
!
map
->
key_sym_map
))
{
_XkbLibError
(
_XkbErrMissingSymbols
,
"XkbWriteXKBSymbols"
,
0
);
return
False
;
}
if
((
!
xkb
->
names
)
||
(
!
xkb
->
names
->
keys
))
{
_XkbLibError
(
_XkbErrMissingNames
,
"XkbWriteXKBSymbols"
,
0
);
return
False
;
}
if
((
xkb
->
names
==
NULL
)
||
(
xkb
->
names
->
symbols
==
None
))
fprintf
(
file
,
"xkb_symbols {
\n\n
"
);
else
fprintf
(
file
,
"xkb_symbols
\"
%s
\"
{
\n\n
"
,
XkbAtomText
(
dpy
,
xkb
->
names
->
symbols
,
XkbXKBFile
));
for
(
tmp
=
i
=
0
;
i
<
XkbNumKbdGroups
;
i
++
)
{
if
(
xkb
->
names
->
groups
[
i
]
!=
None
)
{
fprintf
(
file
,
" name[group%d]=
\"
%s
\"
;
\n
"
,
i
+
1
,
XkbAtomText
(
dpy
,
xkb
->
names
->
groups
[
i
],
XkbXKBFile
));
tmp
++
;
}
}
if
(
tmp
>
0
)
fprintf
(
file
,
"
\n
"
);
for
(
i
=
xkb
->
min_key_code
;
i
<=
xkb
->
max_key_code
;
i
++
)
{
Bool
simple
;
if
((
int
)
XkbKeyNumSyms
(
xkb
,
i
)
<
1
)
continue
;
if
(
XkbFindKeycodeByName
(
xkb
,
xkb
->
names
->
keys
[
i
].
name
,
True
)
!=
i
)
continue
;
simple
=
True
;
fprintf
(
file
,
" key %6s {"
,
XkbKeyNameText
(
xkb
->
names
->
keys
[
i
].
name
,
XkbXKBFile
));
if
(
srv
->
explicit
)
{
if
(((
srv
->
explicit
[
i
]
&
XkbExplicitKeyTypesMask
)
!=
0
)
||
(
showImplicit
))
{
int
typeNdx
,
g
;
Bool
multi
;
char
*
comment
=
" "
;
if
((
srv
->
explicit
[
i
]
&
XkbExplicitKeyTypesMask
)
==
0
)
comment
=
"//"
;
multi
=
False
;
typeNdx
=
XkbKeyKeyTypeIndex
(
xkb
,
i
,
0
);
for
(
g
=
1
;(
g
<
XkbKeyNumGroups
(
xkb
,
i
))
&&
(
!
multi
);
g
++
)
{
if
(
XkbKeyKeyTypeIndex
(
xkb
,
i
,
g
)
!=
typeNdx
)
multi
=
True
;
}
if
(
multi
)
{
for
(
g
=
0
;
g
<
XkbKeyNumGroups
(
xkb
,
i
);
g
++
)
{
typeNdx
=
XkbKeyKeyTypeIndex
(
xkb
,
i
,
g
);
if
(
srv
->
explicit
[
i
]
&
(
1
<<
g
))
{
fprintf
(
file
,
"
\n
%s type[group%d]=
\"
%s
\"
,"
,
comment
,
g
+
1
,
XkbAtomText
(
dpy
,
map
->
types
[
typeNdx
].
name
,
XkbXKBFile
));
}
else
if
(
showImplicit
)
{
fprintf
(
file
,
"
\n
// type[group%d]=
\"
%s
\"
,"
,
g
+
1
,
XkbAtomText
(
dpy
,
map
->
types
[
typeNdx
].
name
,
XkbXKBFile
));
}
}
}
else
{
fprintf
(
file
,
"
\n
%s type=
\"
%s
\"
,"
,
comment
,
XkbAtomText
(
dpy
,
map
->
types
[
typeNdx
].
name
,
XkbXKBFile
));
}
simple
=
False
;
}
if
(((
srv
->
explicit
[
i
]
&
XkbExplicitAutoRepeatMask
)
!=
0
)
&&
(
xkb
->
ctrls
!=
NULL
))
{
if
(
xkb
->
ctrls
->
per_key_repeat
[
i
/
8
]
&
(
1
<<
(
i
%
8
)))
fprintf
(
file
,
"
\n
repeat= Yes,"
);
else
fprintf
(
file
,
"
\n
repeat= No,"
);
simple
=
False
;
}
if
((
xkb
->
server
!=
NULL
)
&&
(
xkb
->
server
->
vmodmap
!=
NULL
)
&&
(
xkb
->
server
->
vmodmap
[
i
]
!=
0
))
{
if
((
srv
->
explicit
[
i
]
&
XkbExplicitVModMapMask
)
!=
0
)
{
fprintf
(
file
,
"
\n
virtualMods= %s,"
,
XkbVModMaskText
(
dpy
,
xkb
,
0
,
xkb
->
server
->
vmodmap
[
i
],
XkbXKBFile
));
}
else
if
(
showImplicit
)
{
fprintf
(
file
,
"
\n
// virtualMods= %s,"
,
XkbVModMaskText
(
dpy
,
xkb
,
0
,
xkb
->
server
->
vmodmap
[
i
],
XkbXKBFile
));
}
}
}
switch
(
XkbOutOfRangeGroupAction
(
XkbKeyGroupInfo
(
xkb
,
i
)))
{
case
XkbClampIntoRange
:
fprintf
(
file
,
"
\n
groupsClamp,"
);
break
;
case
XkbRedirectIntoRange
:
fprintf
(
file
,
"
\n
groupsRedirect= Group%d,"
,
XkbOutOfRangeGroupNumber
(
XkbKeyGroupInfo
(
xkb
,
i
))
+
1
);
break
;
}
if
(
srv
->
behaviors
!=
NULL
)
{
unsigned
type
;
type
=
srv
->
behaviors
[
i
].
type
&
XkbKB_OpMask
;
if
(
type
!=
XkbKB_Default
)
{
simple
=
False
;
fprintf
(
file
,
"
\n
%s,"
,
XkbBehaviorText
(
xkb
,
&
srv
->
behaviors
[
i
],
XkbXKBFile
));
}
}
if
((
srv
->
explicit
==
NULL
)
||
showImplicit
||
((
srv
->
explicit
[
i
]
&
XkbExplicitInterpretMask
)
!=
0
))
showActions
=
XkbKeyHasActions
(
xkb
,
i
);
else
showActions
=
False
;
if
(((
unsigned
)
XkbKeyNumGroups
(
xkb
,
i
)
>
1
)
||
showActions
)
simple
=
False
;
if
(
simple
)
{
KeySym
*
syms
;
unsigned
s
;
syms
=
XkbKeySymsPtr
(
xkb
,
i
);
fprintf
(
file
,
" [ "
);
for
(
s
=
0
;
s
<
XkbKeyGroupWidth
(
xkb
,
i
,
XkbGroup1Index
);
s
++
)
{
if
(
s
!=
0
)
fprintf
(
file
,
", "
);
fprintf
(
file
,
"%15s"
,
XkbKeysymText
(
*
syms
++
,
XkbXKBFile
));
}
fprintf
(
file
,
" ] };
\n
"
);
}
else
{
unsigned
g
,
s
;
KeySym
*
syms
;
XkbAction
*
acts
;
syms
=
XkbKeySymsPtr
(
xkb
,
i
);
acts
=
XkbKeyActionsPtr
(
xkb
,
i
);
for
(
g
=
0
;
g
<
XkbKeyNumGroups
(
xkb
,
i
);
g
++
)
{
if
(
g
!=
0
)
fprintf
(
file
,
","
);
fprintf
(
file
,
"
\n
symbols[Group%d]= [ "
,
g
+
1
);
for
(
s
=
0
;
s
<
XkbKeyGroupWidth
(
xkb
,
i
,
g
);
s
++
)
{
if
(
s
!=
0
)
fprintf
(
file
,
", "
);
fprintf
(
file
,
"%15s"
,
XkbKeysymText
(
syms
[
s
],
XkbXKBFile
));
}
fprintf
(
file
,
" ]"
);
syms
+=
XkbKeyGroupsWidth
(
xkb
,
i
);
if
(
showActions
)
{
fprintf
(
file
,
",
\n
actions[Group%d]= [ "
,
g
+
1
);
for
(
s
=
0
;
s
<
XkbKeyGroupWidth
(
xkb
,
i
,
g
);
s
++
)
{
if
(
s
!=
0
)
fprintf
(
file
,
", "
);
WriteXKBAction
(
file
,
result
,(
XkbAnyAction
*
)
&
acts
[
s
]);
}
fprintf
(
file
,
" ]"
);
acts
+=
XkbKeyGroupsWidth
(
xkb
,
i
);
}
}
fprintf
(
file
,
"
\n
};
\n
"
);
}
}
if
(
map
&&
map
->
modmap
)
{
for
(
i
=
xkb
->
min_key_code
;
i
<=
xkb
->
max_key_code
;
i
++
)
{
if
(
map
->
modmap
[
i
]
!=
0
)
{
register
int
n
,
bit
;
for
(
bit
=
1
,
n
=
0
;
n
<
XkbNumModifiers
;
n
++
,
bit
<<=
1
)
{
if
(
map
->
modmap
[
i
]
&
bit
)
{
char
buf
[
5
];
memcpy
(
buf
,
xkb
->
names
->
keys
[
i
].
name
,
4
);
buf
[
4
]
=
'\0'
;
fprintf
(
file
,
" modifier_map %s { <%s> };
\n
"
,
XkbModIndexText
(
n
,
XkbXKBFile
),
buf
);
}
}
}
}
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
topLevel
,
showImplicit
,
XkmSymbolsIndex
,
priv
);
fprintf
(
file
,
"};
\n\n
"
);
return
True
;
}
static
Bool
WriteXKBOutline
(
FILE
*
file
,
XkbShapePtr
shape
,
XkbOutlinePtr
outline
,
int
lastRadius
,
int
first
,
int
indent
)
{
register
int
i
;
XkbPointPtr
pt
;
char
*
iStr
;
fprintf
(
file
,
"%s"
,
iStr
=
XkbIndentText
(
first
));
if
(
first
!=
indent
)
iStr
=
XkbIndentText
(
indent
);
if
(
outline
->
corner_radius
!=
lastRadius
)
{
fprintf
(
file
,
"corner= %s,"
,
XkbGeomFPText
(
outline
->
corner_radius
,
XkbMessage
));
if
(
shape
!=
NULL
)
{
fprintf
(
file
,
"
\n
%s"
,
iStr
);
}
}
if
(
shape
)
{
if
(
outline
==
shape
->
approx
)
fprintf
(
file
,
"approx= "
);
else
if
(
outline
==
shape
->
primary
)
fprintf
(
file
,
"primary= "
);
}
fprintf
(
file
,
"{"
);
for
(
pt
=
outline
->
points
,
i
=
0
;
i
<
outline
->
num_points
;
i
++
,
pt
++
)
{
if
(
i
==
0
)
fprintf
(
file
,
" "
);
else
if
((
i
%
4
)
==
0
)
fprintf
(
file
,
",
\n
%s "
,
iStr
);
else
fprintf
(
file
,
", "
);
fprintf
(
file
,
"[ %3s, %3s ]"
,
XkbGeomFPText
(
pt
->
x
,
XkbXKBFile
),
XkbGeomFPText
(
pt
->
y
,
XkbXKBFile
));
}
fprintf
(
file
,
" }"
);
return
True
;
}
static
Bool
WriteXKBDoodad
(
FILE
*
file
,
Display
*
dpy
,
unsigned
indent
,
XkbGeometryPtr
geom
,
XkbDoodadPtr
doodad
)
{
register
char
*
i_str
;
XkbShapePtr
shape
;
XkbColorPtr
color
;
i_str
=
XkbIndentText
(
indent
);
fprintf
(
file
,
"%s%s
\"
%s
\"
{
\n
"
,
i_str
,
XkbDoodadTypeText
(
doodad
->
any
.
type
,
XkbMessage
),
XkbAtomText
(
dpy
,
doodad
->
any
.
name
,
XkbMessage
));
fprintf
(
file
,
"%s top= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
any
.
top
,
XkbXKBFile
));
fprintf
(
file
,
"%s left= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
any
.
left
,
XkbXKBFile
));
fprintf
(
file
,
"%s priority= %d;
\n
"
,
i_str
,
doodad
->
any
.
priority
);
switch
(
doodad
->
any
.
type
)
{
case
XkbOutlineDoodad
:
case
XkbSolidDoodad
:
if
(
doodad
->
shape
.
angle
!=
0
)
{
fprintf
(
file
,
"%s angle= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
shape
.
angle
,
XkbXKBFile
));
}
if
(
doodad
->
shape
.
color_ndx
!=
0
)
{
fprintf
(
file
,
"%s color=
\"
%s
\"
;
\n
"
,
i_str
,
XkbShapeDoodadColor
(
geom
,
&
doodad
->
shape
)
->
spec
);
}
shape
=
XkbShapeDoodadShape
(
geom
,
&
doodad
->
shape
);
fprintf
(
file
,
"%s shape=
\"
%s
\"
;
\n
"
,
i_str
,
XkbAtomText
(
dpy
,
shape
->
name
,
XkbXKBFile
));
break
;
case
XkbTextDoodad
:
if
(
doodad
->
text
.
angle
!=
0
)
{
fprintf
(
file
,
"%s angle= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
text
.
angle
,
XkbXKBFile
));
}
if
(
doodad
->
text
.
width
!=
0
)
{
fprintf
(
file
,
"%s width= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
text
.
width
,
XkbXKBFile
));
}
if
(
doodad
->
text
.
height
!=
0
)
{
fprintf
(
file
,
"%s height= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
text
.
height
,
XkbXKBFile
));
}
if
(
doodad
->
text
.
color_ndx
!=
0
)
{
color
=
XkbTextDoodadColor
(
geom
,
&
doodad
->
text
);
fprintf
(
file
,
"%s color=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
color
->
spec
,
XkbXKBFile
));
}
fprintf
(
file
,
"%s XFont=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
doodad
->
text
.
font
,
XkbXKBFile
));
fprintf
(
file
,
"%s text=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
doodad
->
text
.
text
,
XkbXKBFile
));
break
;
case
XkbIndicatorDoodad
:
shape
=
XkbIndicatorDoodadShape
(
geom
,
&
doodad
->
indicator
);
color
=
XkbIndicatorDoodadOnColor
(
geom
,
&
doodad
->
indicator
);
fprintf
(
file
,
"%s onColor=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
color
->
spec
,
XkbXKBFile
));
color
=
XkbIndicatorDoodadOffColor
(
geom
,
&
doodad
->
indicator
);
fprintf
(
file
,
"%s offColor=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
color
->
spec
,
XkbXKBFile
));
fprintf
(
file
,
"%s shape=
\"
%s
\"
;
\n
"
,
i_str
,
XkbAtomText
(
dpy
,
shape
->
name
,
XkbXKBFile
));
break
;
case
XkbLogoDoodad
:
fprintf
(
file
,
"%s logoName=
\"
%s
\"
;
\n
"
,
i_str
,
XkbStringText
(
doodad
->
logo
.
logo_name
,
XkbXKBFile
));
if
(
doodad
->
shape
.
angle
!=
0
)
{
fprintf
(
file
,
"%s angle= %s;
\n
"
,
i_str
,
XkbGeomFPText
(
doodad
->
logo
.
angle
,
XkbXKBFile
));
}
if
(
doodad
->
shape
.
color_ndx
!=
0
)
{
fprintf
(
file
,
"%s color=
\"
%s
\"
;
\n
"
,
i_str
,
XkbLogoDoodadColor
(
geom
,
&
doodad
->
logo
)
->
spec
);
}
shape
=
XkbLogoDoodadShape
(
geom
,
&
doodad
->
logo
);
fprintf
(
file
,
"%s shape=
\"
%s
\"
;
\n
"
,
i_str
,
XkbAtomText
(
dpy
,
shape
->
name
,
XkbXKBFile
));
break
;
}
fprintf
(
file
,
"%s};
\n
"
,
i_str
);
return
True
;
}
/*ARGSUSED*/
static
Bool
WriteXKBOverlay
(
FILE
*
file
,
Display
*
dpy
,
unsigned
indent
,
XkbGeometryPtr
geom
,
XkbOverlayPtr
ol
)
{
register
char
*
i_str
;
int
r
,
k
,
nOut
;
XkbOverlayRowPtr
row
;
XkbOverlayKeyPtr
key
;
i_str
=
XkbIndentText
(
indent
);
if
(
ol
->
name
!=
None
)
{
fprintf
(
file
,
"%soverlay
\"
%s
\"
{
\n
"
,
i_str
,
XkbAtomText
(
dpy
,
ol
->
name
,
XkbMessage
));
}
else
fprintf
(
file
,
"%soverlay {
\n
"
,
i_str
);
for
(
nOut
=
r
=
0
,
row
=
ol
->
rows
;
r
<
ol
->
num_rows
;
r
++
,
row
++
)
{
for
(
k
=
0
,
key
=
row
->
keys
;
k
<
row
->
num_keys
;
k
++
,
key
++
)
{
char
*
over
,
*
under
;
over
=
XkbKeyNameText
(
key
->
over
.
name
,
XkbXKBFile
);
under
=
XkbKeyNameText
(
key
->
under
.
name
,
XkbXKBFile
);
if
(
nOut
==
0
)
fprintf
(
file
,
"%s %6s=%6s"
,
i_str
,
under
,
over
);
else
if
((
nOut
%
4
)
==
0
)
fprintf
(
file
,
",
\n
%s %6s=%6s"
,
i_str
,
under
,
over
);
else
fprintf
(
file
,
", %6s=%6s"
,
under
,
over
);
nOut
++
;
}
}
fprintf
(
file
,
"
\n
%s};
\n
"
,
i_str
);
return
True
;
}
static
Bool
WriteXKBSection
(
FILE
*
file
,
Display
*
dpy
,
XkbSectionPtr
s
,
XkbGeometryPtr
geom
)
{
register
int
i
;
XkbRowPtr
row
;
int
dfltKeyColor
=
0
;
fprintf
(
file
,
" section
\"
%s
\"
{
\n
"
,
XkbAtomText
(
dpy
,
s
->
name
,
XkbXKBFile
));
if
(
s
->
rows
&&
(
s
->
rows
->
num_keys
>
0
))
{
dfltKeyColor
=
s
->
rows
->
keys
[
0
].
color_ndx
;
fprintf
(
file
,
" key.color=
\"
%s
\"
;
\n
"
,
XkbStringText
(
geom
->
colors
[
dfltKeyColor
].
spec
,
XkbXKBFile
));
}
fprintf
(
file
,
" priority= %d;
\n
"
,
s
->
priority
);
fprintf
(
file
,
" top= %s;
\n
"
,
XkbGeomFPText
(
s
->
top
,
XkbXKBFile
));
fprintf
(
file
,
" left= %s;
\n
"
,
XkbGeomFPText
(
s
->
left
,
XkbXKBFile
));
fprintf
(
file
,
" width= %s;
\n
"
,
XkbGeomFPText
(
s
->
width
,
XkbXKBFile
));
fprintf
(
file
,
" height= %s;
\n
"
,
XkbGeomFPText
(
s
->
height
,
XkbXKBFile
));
if
(
s
->
angle
!=
0
)
{
fprintf
(
file
,
" angle= %s;
\n
"
,
XkbGeomFPText
(
s
->
angle
,
XkbXKBFile
));
}
for
(
i
=
0
,
row
=
s
->
rows
;
i
<
s
->
num_rows
;
i
++
,
row
++
)
{
fprintf
(
file
,
" row {
\n
"
);
fprintf
(
file
,
" top= %s;
\n
"
,
XkbGeomFPText
(
row
->
top
,
XkbXKBFile
));
fprintf
(
file
,
" left= %s;
\n
"
,
XkbGeomFPText
(
row
->
left
,
XkbXKBFile
));
if
(
row
->
vertical
)
fprintf
(
file
,
" vertical;
\n
"
);
if
(
row
->
num_keys
>
0
)
{
register
int
k
;
register
XkbKeyPtr
key
;
int
forceNL
=
0
;
int
nThisLine
=
0
;
fprintf
(
file
,
" keys {
\n
"
);
for
(
k
=
0
,
key
=
row
->
keys
;
k
<
row
->
num_keys
;
k
++
,
key
++
)
{
XkbShapePtr
shape
;
if
(
key
->
color_ndx
!=
dfltKeyColor
)
forceNL
=
1
;
if
(
k
==
0
)
{
fprintf
(
file
,
" "
);
nThisLine
=
0
;
}
else
if
(((
nThisLine
%
2
)
==
1
)
||
(
forceNL
))
{
fprintf
(
file
,
",
\n
"
);
forceNL
=
nThisLine
=
0
;
}
else
{
fprintf
(
file
,
", "
);
nThisLine
++
;
}
shape
=
XkbKeyShape
(
geom
,
key
);
fprintf
(
file
,
"{ %6s,
\"
%s
\"
, %3s"
,
XkbKeyNameText
(
key
->
name
.
name
,
XkbXKBFile
),
XkbAtomText
(
dpy
,
shape
->
name
,
XkbXKBFile
),
XkbGeomFPText
(
key
->
gap
,
XkbXKBFile
));
if
(
key
->
color_ndx
!=
dfltKeyColor
)
{
fprintf
(
file
,
", color=
\"
%s
\"
"
,
XkbKeyColor
(
geom
,
key
)
->
spec
);
forceNL
=
1
;
}
fprintf
(
file
,
" }"
);
}
fprintf
(
file
,
"
\n
};
\n
"
);
}
fprintf
(
file
,
" };
\n
"
);
}
if
(
s
->
doodads
!=
NULL
)
{
XkbDoodadPtr
doodad
;
for
(
i
=
0
,
doodad
=
s
->
doodads
;
i
<
s
->
num_doodads
;
i
++
,
doodad
++
)
{
WriteXKBDoodad
(
file
,
dpy
,
8
,
geom
,
doodad
);
}
}
if
(
s
->
overlays
!=
NULL
)
{
XkbOverlayPtr
ol
;
for
(
i
=
0
,
ol
=
s
->
overlays
;
i
<
s
->
num_overlays
;
i
++
,
ol
++
)
{
WriteXKBOverlay
(
file
,
dpy
,
8
,
geom
,
ol
);
}
}
fprintf
(
file
,
" }; // End of
\"
%s
\"
section
\n\n
"
,
XkbAtomText
(
dpy
,
s
->
name
,
XkbXKBFile
));
return
True
;
}
Bool
XkbWriteXKBGeometry
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Display
*
dpy
;
register
unsigned
i
,
n
;
XkbDescPtr
xkb
;
XkbGeometryPtr
geom
;
xkb
=
result
->
xkb
;
if
((
!
xkb
)
||
(
!
xkb
->
geom
))
{
_XkbLibError
(
_XkbErrMissingGeometry
,
"XkbWriteXKBGeometry"
,
0
);
return
False
;
}
dpy
=
xkb
->
dpy
;
geom
=
xkb
->
geom
;
if
(
geom
->
name
==
None
)
fprintf
(
file
,
"xkb_geometry {
\n\n
"
);
else
fprintf
(
file
,
"xkb_geometry
\"
%s
\"
{
\n\n
"
,
XkbAtomText
(
dpy
,
geom
->
name
,
XkbXKBFile
));
fprintf
(
file
,
" width= %s;
\n
"
,
XkbGeomFPText
(
geom
->
width_mm
,
XkbXKBFile
));
fprintf
(
file
,
" height= %s;
\n\n
"
,
XkbGeomFPText
(
geom
->
height_mm
,
XkbXKBFile
));
if
(
geom
->
key_aliases
!=
NULL
)
{
XkbKeyAliasPtr
pAl
;
pAl
=
geom
->
key_aliases
;
for
(
i
=
0
;
i
<
geom
->
num_key_aliases
;
i
++
,
pAl
++
)
{
fprintf
(
file
,
" alias %6s = %6s;
\n
"
,
XkbKeyNameText
(
pAl
->
alias
,
XkbXKBFile
),
XkbKeyNameText
(
pAl
->
real
,
XkbXKBFile
));
}
fprintf
(
file
,
"
\n
"
);
}
if
(
geom
->
base_color
!=
NULL
)
fprintf
(
file
,
" baseColor=
\"
%s
\"
;
\n
"
,
XkbStringText
(
geom
->
base_color
->
spec
,
XkbXKBFile
));
if
(
geom
->
label_color
!=
NULL
)
fprintf
(
file
,
" labelColor=
\"
%s
\"
;
\n
"
,
XkbStringText
(
geom
->
label_color
->
spec
,
XkbXKBFile
));
if
(
geom
->
label_font
!=
NULL
)
fprintf
(
file
,
" xfont=
\"
%s
\"
;
\n
"
,
XkbStringText
(
geom
->
label_font
,
XkbXKBFile
));
if
((
geom
->
num_colors
>
0
)
&&
(
showImplicit
))
{
XkbColorPtr
color
;
for
(
color
=
geom
->
colors
,
i
=
0
;
i
<
geom
->
num_colors
;
i
++
,
color
++
)
{
fprintf
(
file
,
"// color[%d]=
\"
%s
\"\n
"
,
i
,
XkbStringText
(
color
->
spec
,
XkbXKBFile
));
}
fprintf
(
file
,
"
\n
"
);
}
if
(
geom
->
num_properties
>
0
)
{
XkbPropertyPtr
prop
;
for
(
prop
=
geom
->
properties
,
i
=
0
;
i
<
geom
->
num_properties
;
i
++
,
prop
++
)
{
fprintf
(
file
,
" %s=
\"
%s
\"
;
\n
"
,
prop
->
name
,
XkbStringText
(
prop
->
value
,
XkbXKBFile
));
}
fprintf
(
file
,
"
\n
"
);
}
if
(
geom
->
num_shapes
>
0
)
{
XkbShapePtr
shape
;
XkbOutlinePtr
outline
;
int
lastR
;
for
(
shape
=
geom
->
shapes
,
i
=
0
;
i
<
geom
->
num_shapes
;
i
++
,
shape
++
)
{
lastR
=
0
;
fprintf
(
file
,
" shape
\"
%s
\"
{"
,
XkbAtomText
(
dpy
,
shape
->
name
,
XkbXKBFile
));
outline
=
shape
->
outlines
;
if
(
shape
->
num_outlines
>
1
)
{
for
(
n
=
0
;
n
<
shape
->
num_outlines
;
n
++
,
outline
++
)
{
if
(
n
==
0
)
fprintf
(
file
,
"
\n
"
);
else
fprintf
(
file
,
",
\n
"
);
WriteXKBOutline
(
file
,
shape
,
outline
,
lastR
,
8
,
8
);
lastR
=
outline
->
corner_radius
;
}
fprintf
(
file
,
"
\n
};
\n
"
);
}
else
{
WriteXKBOutline
(
file
,
NULL
,
outline
,
lastR
,
1
,
8
);
fprintf
(
file
,
" };
\n
"
);
}
}
}
if
(
geom
->
num_sections
>
0
)
{
XkbSectionPtr
section
;
for
(
section
=
geom
->
sections
,
i
=
0
;
i
<
geom
->
num_sections
;
i
++
,
section
++
){
WriteXKBSection
(
file
,
dpy
,
section
,
geom
);
}
}
if
(
geom
->
num_doodads
>
0
)
{
XkbDoodadPtr
doodad
;
for
(
i
=
0
,
doodad
=
geom
->
doodads
;
i
<
geom
->
num_doodads
;
i
++
,
doodad
++
)
{
WriteXKBDoodad
(
file
,
dpy
,
4
,
geom
,
doodad
);
}
}
if
(
addOn
)
(
*
addOn
)(
file
,
result
,
topLevel
,
showImplicit
,
XkmGeometryIndex
,
priv
);
fprintf
(
file
,
"};
\n\n
"
);
return
True
;
}
/*ARGSUSED*/
Bool
XkbWriteXKBSemantics
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Bool
ok
;
fprintf
(
file
,
"xkb_semantics {
\n
"
);
ok
=
XkbWriteXKBKeyTypes
(
file
,
result
,
False
,
False
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBCompatMap
(
file
,
result
,
False
,
False
,
addOn
,
priv
);
fprintf
(
file
,
"};
\n
"
);
return
ok
;
}
/*ARGSUSED*/
Bool
XkbWriteXKBLayout
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Bool
ok
;
XkbDescPtr
xkb
;
xkb
=
result
->
xkb
;
fprintf
(
file
,
"xkb_layout {
\n
"
);
ok
=
XkbWriteXKBKeycodes
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBKeyTypes
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBSymbols
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
if
(
xkb
->
geom
)
ok
=
ok
&&
XkbWriteXKBGeometry
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
fprintf
(
file
,
"};
\n
"
);
return
ok
;
}
/*ARGSUSED*/
Bool
XkbWriteXKBKeymap
(
FILE
*
file
,
XkbFileInfo
*
result
,
Bool
topLevel
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Bool
ok
;
XkbDescPtr
xkb
;
xkb
=
result
->
xkb
;
fprintf
(
file
,
"xkb_keymap {
\n
"
);
ok
=
XkbWriteXKBKeycodes
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBKeyTypes
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBCompatMap
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
ok
=
ok
&&
XkbWriteXKBSymbols
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
if
(
xkb
->
geom
)
ok
=
ok
&&
XkbWriteXKBGeometry
(
file
,
result
,
False
,
showImplicit
,
addOn
,
priv
);
fprintf
(
file
,
"};
\n
"
);
return
ok
;
}
Bool
XkbWriteXKBFile
(
FILE
*
out
,
XkbFileInfo
*
result
,
Bool
showImplicit
,
XkbFileAddOnFunc
addOn
,
void
*
priv
)
{
Bool
ok
=
False
;
Bool
(
*
func
)(
FILE
*
/* file */
,
XkbFileInfo
*
/* result */
,
Bool
/* topLevel */
,
Bool
/* showImplicit */
,
XkbFileAddOnFunc
/* addOn */
,
void
*
/* priv */
)
=
NULL
;
switch
(
result
->
type
)
{
case
XkmSemanticsFile
:
func
=
XkbWriteXKBSemantics
;
break
;
case
XkmLayoutFile
:
func
=
XkbWriteXKBLayout
;
break
;
case
XkmKeymapFile
:
func
=
XkbWriteXKBKeymap
;
break
;
case
XkmTypesIndex
:
func
=
XkbWriteXKBKeyTypes
;
break
;
case
XkmCompatMapIndex
:
func
=
XkbWriteXKBCompatMap
;
break
;
case
XkmSymbolsIndex
:
func
=
XkbWriteXKBSymbols
;
break
;
case
XkmKeyNamesIndex
:
func
=
XkbWriteXKBKeycodes
;
break
;
case
XkmGeometryFile
:
case
XkmGeometryIndex
:
func
=
XkbWriteXKBGeometry
;
break
;
case
XkmVirtualModsIndex
:
case
XkmIndicatorsIndex
:
_XkbLibError
(
_XkbErrBadImplementation
,
XkbConfigText
(
result
->
type
,
XkbMessage
),
0
);
return
False
;
}
if
(
out
==
NULL
)
{
_XkbLibError
(
_XkbErrFileCannotOpen
,
"XkbWriteXkbFile"
,
0
);
ok
=
False
;
}
else
if
(
func
)
{
ok
=
(
*
func
)(
out
,
result
,
True
,
showImplicit
,
addOn
,
priv
);
}
return
ok
;
}
nx-X11/programs/Xserver/xkb/xkbtext.c
deleted
100644 → 0
View file @
a6cb8583
/************************************************************
Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
Permission to use, copy, modify, and distribute this
software and its documentation for any purpose and without
fee is hereby granted, provided that the above copyright
notice appear in all copies and that both that copyright
notice and this permission notice appear in supporting
documentation, and that the name of Silicon Graphics not be
used in advertising or publicity pertaining to distribution
of the software without specific prior written permission.
Silicon Graphics makes no representation about the suitability
of this software for any purpose. It is provided "as is"
without any express or implied warranty.
SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.
********************************************************/
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <nx-X11/Xos.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
#include "misc.h"
#include "inputstr.h"
#include "dix.h"
#include "xkbstr.h"
#include <xkbsrv.h>
#include "xkbgeom.h"
/***====================================================================***/
#define BUFFER_SIZE 512
static
char
textBuffer
[
BUFFER_SIZE
];
static
int
tbNext
=
0
;
static
char
*
tbGetBuffer
(
unsigned
size
)
{
char
*
rtrn
;
if
(
size
>=
BUFFER_SIZE
)
return
NULL
;
if
((
BUFFER_SIZE
-
tbNext
)
<=
size
)
tbNext
=
0
;
rtrn
=
&
textBuffer
[
tbNext
];
tbNext
+=
size
;
return
rtrn
;
}
/***====================================================================***/
char
*
XkbAtomText
(
Display
*
dpy
,
Atom
atm
,
unsigned
format
)
{
char
*
rtrn
,
*
tmp
;
tmp
=
(
char
*
)
NameForAtom
(
atm
);
if
(
tmp
!=
NULL
)
{
int
len
;
len
=
strlen
(
tmp
)
+
1
;
if
(
len
>
BUFFER_SIZE
)
len
=
BUFFER_SIZE
-
2
;
rtrn
=
tbGetBuffer
(
len
);
strncpy
(
rtrn
,
tmp
,
len
);
rtrn
[
len
]
=
'\0'
;
}
else
{
rtrn
=
tbGetBuffer
(
1
);
rtrn
[
0
]
=
'\0'
;
}
if
(
format
==
XkbCFile
)
{
for
(
tmp
=
rtrn
;
*
tmp
!=
'\0'
;
tmp
++
)
{
if
((
tmp
==
rtrn
)
&&
(
!
isalpha
(
*
tmp
)))
*
tmp
=
'_'
;
else
if
(
!
isalnum
(
*
tmp
))
*
tmp
=
'_'
;
}
}
return
XkbStringText
(
rtrn
,
format
);
}
/***====================================================================***/
char
*
XkbVModIndexText
(
Display
*
dpy
,
XkbDescPtr
xkb
,
unsigned
ndx
,
unsigned
format
)
{
register
int
len
;
register
Atom
*
vmodNames
;
char
*
rtrn
,
*
tmp
;
char
numBuf
[
20
];
if
(
xkb
&&
xkb
->
names
)
vmodNames
=
xkb
->
names
->
vmods
;
else
vmodNames
=
NULL
;
tmp
=
NULL
;
if
(
ndx
>=
XkbNumVirtualMods
)
tmp
=
"illegal"
;
else
if
(
vmodNames
&&
(
vmodNames
[
ndx
]
!=
None
))
tmp
=
(
char
*
)
NameForAtom
(
vmodNames
[
ndx
]);
if
(
tmp
==
NULL
)
sprintf
(
tmp
=
numBuf
,
"%d"
,
ndx
);
len
=
strlen
(
tmp
)
+
1
;
if
(
format
==
XkbCFile
)
len
+=
4
;
if
(
len
>=
BUFFER_SIZE
)
len
=
BUFFER_SIZE
-
1
;
rtrn
=
tbGetBuffer
(
len
);
if
(
format
==
XkbCFile
)
{
strcpy
(
rtrn
,
"vmod_"
);
strncpy
(
&
rtrn
[
5
],
tmp
,
len
-
4
);
}
else
strncpy
(
rtrn
,
tmp
,
len
);
return
rtrn
;
}
char
*
XkbVModMaskText
(
Display
*
dpy
,
XkbDescPtr
xkb
,
unsigned
modMask
,
unsigned
mask
,
unsigned
format
)
{
register
int
i
,
bit
;
int
len
;
char
*
mm
,
*
rtrn
;
char
*
str
,
buf
[
BUFFER_SIZE
];
if
((
modMask
==
0
)
&&
(
mask
==
0
))
{
rtrn
=
tbGetBuffer
(
5
);
if
(
format
==
XkbCFile
)
sprintf
(
rtrn
,
"0"
);
else
sprintf
(
rtrn
,
"none"
);
return
rtrn
;
}
if
(
modMask
!=
0
)
mm
=
XkbModMaskText
(
modMask
,
format
);
else
mm
=
NULL
;
str
=
buf
;
buf
[
0
]
=
'\0'
;
if
(
mask
)
{
char
*
tmp
;
for
(
i
=
0
,
bit
=
1
;
i
<
XkbNumVirtualMods
;
i
++
,
bit
<<=
1
)
{
if
(
mask
&
bit
)
{
tmp
=
XkbVModIndexText
(
dpy
,
xkb
,
i
,
format
);
len
=
strlen
(
tmp
)
+
1
+
(
str
==
buf
?
0
:
1
);
if
(
format
==
XkbCFile
)
len
+=
4
;
if
((
str
-
(
buf
+
len
))
<=
BUFFER_SIZE
)
{
if
(
str
!=
buf
)
{
if
(
format
==
XkbCFile
)
*
str
++=
'|'
;
else
*
str
++=
'+'
;
len
--
;
}
}
if
(
format
==
XkbCFile
)
sprintf
(
str
,
"%sMask"
,
tmp
);
else
strcpy
(
str
,
tmp
);
str
=
&
str
[
len
-
1
];
}
}
str
=
buf
;
}
else
str
=
NULL
;
if
(
mm
)
len
=
strlen
(
mm
);
else
len
=
0
;
if
(
str
)
len
+=
strlen
(
str
)
+
(
mm
==
NULL
?
0
:
1
);
if
(
len
>=
BUFFER_SIZE
)
len
=
BUFFER_SIZE
-
1
;
rtrn
=
tbGetBuffer
(
len
+
1
);
rtrn
[
0
]
=
'\0'
;
if
(
mm
!=
NULL
)
{
i
=
strlen
(
mm
);
if
(
i
>
len
)
i
=
len
;
strcpy
(
rtrn
,
mm
);
}
else
{
i
=
0
;
}
if
(
str
!=
NULL
)
{
if
(
mm
!=
NULL
)
{
if
(
format
==
XkbCFile
)
strcat
(
rtrn
,
"|"
);
else
strcat
(
rtrn
,
"+"
);
}
strncat
(
rtrn
,
str
,
len
-
i
);
}
rtrn
[
len
]
=
'\0'
;
return
rtrn
;
}
static
char
*
modNames
[
XkbNumModifiers
]
=
{
"Shift"
,
"Lock"
,
"Control"
,
"Mod1"
,
"Mod2"
,
"Mod3"
,
"Mod4"
,
"Mod5"
};
char
*
XkbModIndexText
(
unsigned
ndx
,
unsigned
format
)
{
char
*
rtrn
;
char
buf
[
100
];
if
(
format
==
XkbCFile
)
{
if
(
ndx
<
XkbNumModifiers
)
sprintf
(
buf
,
"%sMapIndex"
,
modNames
[
ndx
]);
else
if
(
ndx
==
XkbNoModifier
)
sprintf
(
buf
,
"XkbNoModifier"
);
else
sprintf
(
buf
,
"0x%02x"
,
ndx
);
}
else
{
if
(
ndx
<
XkbNumModifiers
)
strcpy
(
buf
,
modNames
[
ndx
]);
else
if
(
ndx
==
XkbNoModifier
)
strcpy
(
buf
,
"none"
);
else
sprintf
(
buf
,
"ILLEGAL_%02x"
,
ndx
);
}
rtrn
=
tbGetBuffer
(
strlen
(
buf
)
+
1
);
strcpy
(
rtrn
,
buf
);
return
rtrn
;
}
char
*
XkbModMaskText
(
unsigned
mask
,
unsigned
format
)
{
register
int
i
,
bit
;
char
buf
[
64
],
*
rtrn
;
if
((
mask
&
0xff
)
==
0xff
)
{
if
(
format
==
XkbCFile
)
strcpy
(
buf
,
"0xff"
);
else
strcpy
(
buf
,
"all"
);
}
else
if
((
mask
&
0xff
)
==
0
)
{
if
(
format
==
XkbCFile
)
strcpy
(
buf
,
"0"
);
else
strcpy
(
buf
,
"none"
);
}
else
{
char
*
str
=
buf
;
buf
[
0
]
=
'\0'
;
for
(
i
=
0
,
bit
=
1
;
i
<
XkbNumModifiers
;
i
++
,
bit
<<=
1
)
{
if
(
mask
&
bit
)
{
if
(
str
!=
buf
)
{
if
(
format
==
XkbCFile
)
*
str
++=
'|'
;
else
*
str
++=
'+'
;
}
strcpy
(
str
,
modNames
[
i
]);
str
=
&
str
[
strlen
(
str
)];
if
(
format
==
XkbCFile
)
{
strcpy
(
str
,
"Mask"
);
str
+=
4
;
}
}
}
}
rtrn
=
tbGetBuffer
(
strlen
(
buf
)
+
1
);
strcpy
(
rtrn
,
buf
);
return
rtrn
;
}
/***====================================================================***/
/*ARGSUSED*/
char
*
XkbConfigText
(
unsigned
config
,
unsigned
format
)
{
static
char
*
buf
;
buf
=
tbGetBuffer
(
32
);
switch
(
config
)
{
case
XkmSemanticsFile
:
strcpy
(
buf
,
"Semantics"
);
break
;
case
XkmLayoutFile
:
strcpy
(
buf
,
"Layout"
);
break
;
case
XkmKeymapFile
:
strcpy
(
buf
,
"Keymap"
);
break
;
case
XkmGeometryFile
:
case
XkmGeometryIndex
:
strcpy
(
buf
,
"Geometry"
);
break
;
case
XkmTypesIndex
:
strcpy
(
buf
,
"Types"
);
break
;
case
XkmCompatMapIndex
:
strcpy
(
buf
,
"CompatMap"
);
break
;
case
XkmSymbolsIndex
:
strcpy
(
buf
,
"Symbols"
);
break
;
case
XkmIndicatorsIndex
:
strcpy
(
buf
,
"Indicators"
);
break
;
case
XkmKeyNamesIndex
:
strcpy
(
buf
,
"KeyNames"
);
break
;
case
XkmVirtualModsIndex
:
strcpy
(
buf
,
"VirtualMods"
);
break
;
default:
sprintf
(
buf
,
"unknown(%d)"
,
config
);
break
;
}
return
buf
;
}
/***====================================================================***/
char
*
XkbKeysymText
(
KeySym
sym
,
unsigned
format
)
{
static
char
buf
[
32
],
*
rtrn
;
if
(
sym
==
NoSymbol
)
strcpy
(
rtrn
=
buf
,
"NoSymbol"
);
else
sprintf
(
rtrn
=
buf
,
"0x%lx"
,
(
long
)
sym
);
return
rtrn
;
}
char
*
XkbKeyNameText
(
char
*
name
,
unsigned
format
)
{
char
*
buf
;
if
(
format
==
XkbCFile
)
{
buf
=
tbGetBuffer
(
5
);
memcpy
(
buf
,
name
,
4
);
buf
[
4
]
=
'\0'
;
}
else
{
int
len
;
buf
=
tbGetBuffer
(
7
);
buf
[
0
]
=
'<'
;
memcpy
(
&
buf
[
1
],
name
,
4
);
buf
[
5
]
=
'\0'
;
len
=
strlen
(
buf
);
buf
[
len
++
]
=
'>'
;
buf
[
len
]
=
'\0'
;
}
return
buf
;
}
/***====================================================================***/
static
char
*
siMatchText
[
5
]
=
{
"NoneOf"
,
"AnyOfOrNone"
,
"AnyOf"
,
"AllOf"
,
"Exactly"
};
char
*
XkbSIMatchText
(
unsigned
type
,
unsigned
format
)
{
static
char
buf
[
40
];
char
*
rtrn
;
switch
(
type
&
XkbSI_OpMask
)
{
case
XkbSI_NoneOf
:
rtrn
=
siMatchText
[
0
];
break
;
case
XkbSI_AnyOfOrNone
:
rtrn
=
siMatchText
[
1
];
break
;
case
XkbSI_AnyOf
:
rtrn
=
siMatchText
[
2
];
break
;
case
XkbSI_AllOf
:
rtrn
=
siMatchText
[
3
];
break
;
case
XkbSI_Exactly
:
rtrn
=
siMatchText
[
4
];
break
;
default:
sprintf
(
buf
,
"0x%x"
,
type
&
XkbSI_OpMask
);
return
buf
;
}
if
(
format
==
XkbCFile
)
{
if
(
type
&
XkbSI_LevelOneOnly
)
sprintf
(
buf
,
"XkbSI_LevelOneOnly|XkbSI_%s"
,
rtrn
);
else
sprintf
(
buf
,
"XkbSI_%s"
,
rtrn
);
rtrn
=
buf
;
}
return
rtrn
;
}
/***====================================================================***/
static
char
*
imWhichNames
[]
=
{
"base"
,
"latched"
,
"locked"
,
"effective"
,
"compat"
};
char
*
XkbIMWhichStateMaskText
(
unsigned
use_which
,
unsigned
format
)
{
int
len
;
unsigned
i
,
bit
,
tmp
;
char
*
buf
;
if
(
use_which
==
0
)
{
buf
=
tbGetBuffer
(
2
);
strcpy
(
buf
,
"0"
);
return
buf
;
}
tmp
=
use_which
&
XkbIM_UseAnyMods
;
for
(
len
=
i
=
0
,
bit
=
1
;
tmp
!=
0
;
i
++
,
bit
<<=
1
)
{
if
(
tmp
&
bit
)
{
tmp
&=
~
bit
;
len
+=
strlen
(
imWhichNames
[
i
])
+
1
;
if
(
format
==
XkbCFile
)
len
+=
9
;
}
}
buf
=
tbGetBuffer
(
len
+
1
);
tmp
=
use_which
&
XkbIM_UseAnyMods
;
for
(
len
=
i
=
0
,
bit
=
1
;
tmp
!=
0
;
i
++
,
bit
<<=
1
)
{
if
(
tmp
&
bit
)
{
tmp
&=
~
bit
;
if
(
format
==
XkbCFile
)
{
if
(
len
!=
0
)
buf
[
len
++
]
=
'|'
;
sprintf
(
&
buf
[
len
],
"XkbIM_Use%s"
,
imWhichNames
[
i
]);
buf
[
len
+
9
]
=
toupper
(
buf
[
len
+
9
]);
}
else
{
if
(
len
!=
0
)
buf
[
len
++
]
=
'+'
;
sprintf
(
&
buf
[
len
],
"%s"
,
imWhichNames
[
i
]);
}
len
+=
strlen
(
&
buf
[
len
]);
}
}
return
buf
;
}
char
*
XkbAccessXDetailText
(
unsigned
state
,
unsigned
format
)
{
char
*
buf
,
*
prefix
;
buf
=
tbGetBuffer
(
32
);
if
(
format
==
XkbMessage
)
prefix
=
""
;
else
prefix
=
"XkbAXN_"
;
switch
(
state
){
case
XkbAXN_SKPress
:
sprintf
(
buf
,
"%sSKPress"
,
prefix
);
break
;
case
XkbAXN_SKAccept
:
sprintf
(
buf
,
"%sSKAccept"
,
prefix
);
break
;
case
XkbAXN_SKRelease
:
sprintf
(
buf
,
"%sSKRelease"
,
prefix
);
break
;
case
XkbAXN_SKReject
:
sprintf
(
buf
,
"%sSKReject"
,
prefix
);
break
;
case
XkbAXN_BKAccept
:
sprintf
(
buf
,
"%sBKAccept"
,
prefix
);
break
;
case
XkbAXN_BKReject
:
sprintf
(
buf
,
"%sBKReject"
,
prefix
);
break
;
case
XkbAXN_AXKWarning
:
sprintf
(
buf
,
"%sAXKWarning"
,
prefix
);
break
;
default:
sprintf
(
buf
,
"ILLEGAL"
);
break
;
}
return
buf
;
}
static
char
*
nknNames
[]
=
{
"keycodes"
,
"geometry"
,
"deviceID"
};
#define NUM_NKN (sizeof(nknNames)/sizeof(char *))
char
*
XkbNKNDetailMaskText
(
unsigned
detail
,
unsigned
format
)
{
char
*
buf
,
*
prefix
,
*
suffix
;
register
int
i
;
register
unsigned
bit
;
int
len
,
plen
,
slen
;
if
((
detail
&
XkbAllNewKeyboardEventsMask
)
==
0
)
{
char
*
tmp
=
""
;
if
(
format
==
XkbCFile
)
tmp
=
"0"
;
else
if
(
format
==
XkbMessage
)
tmp
=
"none"
;
buf
=
tbGetBuffer
(
strlen
(
tmp
)
+
1
);
strcpy
(
buf
,
tmp
);
return
buf
;
}
else
if
((
detail
&
XkbAllNewKeyboardEventsMask
)
==
XkbAllNewKeyboardEventsMask
){
char
*
tmp
;
if
(
format
==
XkbCFile
)
tmp
=
"XkbAllNewKeyboardEventsMask"
;
else
tmp
=
"all"
;
buf
=
tbGetBuffer
(
strlen
(
tmp
)
+
1
);
strcpy
(
buf
,
tmp
);
return
buf
;
}
if
(
format
==
XkbMessage
)
{
prefix
=
""
;
suffix
=
""
;
slen
=
plen
=
0
;
}
else
{
prefix
=
"XkbNKN_"
;
plen
=
7
;
if
(
format
==
XkbCFile
)
suffix
=
"Mask"
;
else
suffix
=
""
;
slen
=
strlen
(
suffix
);
}
for
(
len
=
0
,
i
=
0
,
bit
=
1
;
i
<
NUM_NKN
;
i
++
,
bit
<<=
1
)
{
if
(
detail
&
bit
)
{
if
(
len
!=
0
)
len
+=
1
;
/* room for '+' or '|' */
len
+=
plen
+
slen
+
strlen
(
nknNames
[
i
]);
}
}
buf
=
tbGetBuffer
(
len
+
1
);
buf
[
0
]
=
'\0'
;
for
(
len
=
0
,
i
=
0
,
bit
=
1
;
i
<
NUM_NKN
;
i
++
,
bit
<<=
1
)
{
if
(
detail
&
bit
)
{
if
(
len
!=
0
)
{
if
(
format
==
XkbCFile
)
buf
[
len
++
]
=
'|'
;
else
buf
[
len
++
]
=
'+'
;
}
if
(
plen
)
{
strcpy
(
&
buf
[
len
],
prefix
);
len
+=
plen
;
}
strcpy
(
&
buf
[
len
],
nknNames
[
i
]);
len
+=
strlen
(
nknNames
[
i
]);
if
(
slen
)
{
strcpy
(
&
buf
[
len
],
suffix
);
len
+=
slen
;
}
}
}
buf
[
len
++
]
=
'\0'
;
return
buf
;
}
static
char
*
ctrlNames
[]
=
{
"repeatKeys"
,
"slowKeys"
,
"bounceKeys"
,
"stickyKeys"
,
"mouseKeys"
,
"mouseKeysAccel"
,
"accessXKeys"
,
"accessXTimeout"
,
"accessXFeedback"
,
"audibleBell"
,
"overlay1"
,
"overlay2"
,
"ignoreGroupLock"
};
char
*
XkbControlsMaskText
(
unsigned
ctrls
,
unsigned
format
)
{
int
len
;
unsigned
i
,
bit
,
tmp
;
char
*
buf
;
if
(
ctrls
==
0
)
{
buf
=
tbGetBuffer
(
5
);
if
(
format
==
XkbCFile
)
strcpy
(
buf
,
"0"
);
else
strcpy
(
buf
,
"none"
);
return
buf
;
}
tmp
=
ctrls
&
XkbAllBooleanCtrlsMask
;
for
(
len
=
i
=
0
,
bit
=
1
;
tmp
!=
0
;
i
++
,
bit
<<=
1
)
{
if
(
tmp
&
bit
)
{
tmp
&=
~
bit
;
len
+=
strlen
(
ctrlNames
[
i
])
+
1
;
if
(
format
==
XkbCFile
)
len
+=
7
;
}
}
buf
=
tbGetBuffer
(
len
+
1
);
tmp
=
ctrls
&
XkbAllBooleanCtrlsMask
;
for
(
len
=
i
=
0
,
bit
=
1
;
tmp
!=
0
;
i
++
,
bit
<<=
1
)
{
if
(
tmp
&
bit
)
{
tmp
&=
~
bit
;
if
(
format
==
XkbCFile
)
{
if
(
len
!=
0
)
buf
[
len
++
]
=
'|'
;
sprintf
(
&
buf
[
len
],
"Xkb%sMask"
,
ctrlNames
[
i
]);
buf
[
len
+
3
]
=
toupper
(
buf
[
len
+
3
]);
}
else
{
if
(
len
!=
0
)
buf
[
len
++
]
=
'+'
;
sprintf
(
&
buf
[
len
],
"%s"
,
ctrlNames
[
i
]);
}
len
+=
strlen
(
&
buf
[
len
]);
}
}
return
buf
;
}
/***====================================================================***/
char
*
XkbStringText
(
char
*
str
,
unsigned
format
)
{
char
*
buf
;
register
char
*
in
,
*
out
;
int
len
;
Bool
ok
;
if
(
str
==
NULL
)
{
buf
=
tbGetBuffer
(
2
);
buf
[
0
]
=
'\0'
;
return
buf
;
}
else
if
(
format
==
XkbXKMFile
)
return
str
;
for
(
ok
=
True
,
len
=
0
,
in
=
str
;
*
in
!=
'\0'
;
in
++
,
len
++
)
{
if
(
!
isprint
(
*
in
))
{
ok
=
False
;
switch
(
*
in
)
{
case
'\n'
:
case
'\t'
:
case
'\v'
:
case
'\b'
:
case
'\r'
:
case
'\f'
:
len
++
;
break
;
default:
len
+=
4
;
break
;
}
}
}
if
(
ok
)
return
str
;
buf
=
tbGetBuffer
(
len
+
1
);
for
(
in
=
str
,
out
=
buf
;
*
in
!=
'\0'
;
in
++
)
{
if
(
isprint
(
*
in
))
*
out
++=
*
in
;
else
{
*
out
++=
'\\'
;
if
(
*
in
==
'\n'
)
*
out
++=
'n'
;
else
if
(
*
in
==
'\t'
)
*
out
++=
't'
;
else
if
(
*
in
==
'\v'
)
*
out
++=
'v'
;
else
if
(
*
in
==
'\b'
)
*
out
++=
'b'
;
else
if
(
*
in
==
'\r'
)
*
out
++=
'r'
;
else
if
(
*
in
==
'\f'
)
*
out
++=
'f'
;
else
if
((
*
in
==
'\033'
)
&&
(
format
==
XkbXKMFile
))
{
*
out
++=
'e'
;
}
else
{
*
out
++=
'0'
;
sprintf
(
out
,
"%o"
,
*
in
);
while
(
*
out
!=
'\0'
)
out
++
;
}
}
}
*
out
++=
'\0'
;
return
buf
;
}
/***====================================================================***/
char
*
XkbGeomFPText
(
int
val
,
unsigned
format
)
{
int
whole
,
frac
;
char
*
buf
;
buf
=
tbGetBuffer
(
12
);
if
(
format
==
XkbCFile
)
{
sprintf
(
buf
,
"%d"
,
val
);
}
else
{
whole
=
val
/
XkbGeomPtsPerMM
;
frac
=
val
%
XkbGeomPtsPerMM
;
if
(
frac
!=
0
)
sprintf
(
buf
,
"%d.%d"
,
whole
,
frac
);
else
sprintf
(
buf
,
"%d"
,
whole
);
}
return
buf
;
}
char
*
XkbDoodadTypeText
(
unsigned
type
,
unsigned
format
)
{
char
*
buf
;
if
(
format
==
XkbCFile
)
{
buf
=
tbGetBuffer
(
24
);
if
(
type
==
XkbOutlineDoodad
)
strcpy
(
buf
,
"XkbOutlineDoodad"
);
else
if
(
type
==
XkbSolidDoodad
)
strcpy
(
buf
,
"XkbSolidDoodad"
);
else
if
(
type
==
XkbTextDoodad
)
strcpy
(
buf
,
"XkbTextDoodad"
);
else
if
(
type
==
XkbIndicatorDoodad
)
strcpy
(
buf
,
"XkbIndicatorDoodad"
);
else
if
(
type
==
XkbLogoDoodad
)
strcpy
(
buf
,
"XkbLogoDoodad"
);
else
sprintf
(
buf
,
"UnknownDoodad%d"
,
type
);
}
else
{
buf
=
tbGetBuffer
(
12
);
if
(
type
==
XkbOutlineDoodad
)
strcpy
(
buf
,
"outline"
);
else
if
(
type
==
XkbSolidDoodad
)
strcpy
(
buf
,
"solid"
);
else
if
(
type
==
XkbTextDoodad
)
strcpy
(
buf
,
"text"
);
else
if
(
type
==
XkbIndicatorDoodad
)
strcpy
(
buf
,
"indicator"
);
else
if
(
type
==
XkbLogoDoodad
)
strcpy
(
buf
,
"logo"
);
else
sprintf
(
buf
,
"unknown%d"
,
type
);
}
return
buf
;
}
static
char
*
actionTypeNames
[
XkbSA_NumActions
]
=
{
"NoAction"
,
"SetMods"
,
"LatchMods"
,
"LockMods"
,
"SetGroup"
,
"LatchGroup"
,
"LockGroup"
,
"MovePtr"
,
"PtrBtn"
,
"LockPtrBtn"
,
"SetPtrDflt"
,
"ISOLock"
,
"Terminate"
,
"SwitchScreen"
,
"SetControls"
,
"LockControls"
,
"ActionMessage"
,
"RedirectKey"
,
"DeviceBtn"
,
"LockDeviceBtn"
};
char
*
XkbActionTypeText
(
unsigned
type
,
unsigned
format
)
{
static
char
buf
[
32
];
char
*
rtrn
;
if
(
type
<=
XkbSA_LastAction
)
{
rtrn
=
actionTypeNames
[
type
];
if
(
format
==
XkbCFile
)
{
sprintf
(
buf
,
"XkbSA_%s"
,
rtrn
);
return
buf
;
}
return
rtrn
;
}
sprintf
(
buf
,
"Private"
);
return
buf
;
}
/***====================================================================***/
static
int
TryCopyStr
(
char
*
to
,
char
*
from
,
int
*
pLeft
)
{
register
int
len
;
if
(
*
pLeft
>
0
)
{
len
=
strlen
(
from
);
if
(
len
<
((
*
pLeft
)
-
3
))
{
strcat
(
to
,
from
);
*
pLeft
-=
len
;
return
True
;
}
}
*
pLeft
=
-
1
;
return
False
;
}
/*ARGSUSED*/
static
Bool
CopyNoActionArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
return
True
;
}
static
Bool
CopyModActionArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbModAction
*
act
;
unsigned
tmp
;
act
=
&
action
->
mods
;
tmp
=
XkbModActionVMods
(
act
);
TryCopyStr
(
buf
,
"modifiers="
,
sz
);
if
(
act
->
flags
&
XkbSA_UseModMapMods
)
TryCopyStr
(
buf
,
"modMapMods"
,
sz
);
else
if
(
act
->
real_mods
||
tmp
)
{
TryCopyStr
(
buf
,
XkbVModMaskText
(
dpy
,
xkb
,
act
->
real_mods
,
tmp
,
XkbXKBFile
),
sz
);
}
else
TryCopyStr
(
buf
,
"none"
,
sz
);
if
(
act
->
type
==
XkbSA_LockMods
)
return
True
;
if
(
act
->
flags
&
XkbSA_ClearLocks
)
TryCopyStr
(
buf
,
",clearLocks"
,
sz
);
if
(
act
->
flags
&
XkbSA_LatchToLock
)
TryCopyStr
(
buf
,
",latchToLock"
,
sz
);
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyGroupActionArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbGroupAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
group
;
TryCopyStr
(
buf
,
"group="
,
sz
);
if
(
act
->
flags
&
XkbSA_GroupAbsolute
)
sprintf
(
tbuf
,
"%d"
,
XkbSAGroup
(
act
)
+
1
);
else
if
(
XkbSAGroup
(
act
)
<
0
)
sprintf
(
tbuf
,
"%d"
,
XkbSAGroup
(
act
));
else
sprintf
(
tbuf
,
"+%d"
,
XkbSAGroup
(
act
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
(
act
->
type
==
XkbSA_LockGroup
)
return
True
;
if
(
act
->
flags
&
XkbSA_ClearLocks
)
TryCopyStr
(
buf
,
",clearLocks"
,
sz
);
if
(
act
->
flags
&
XkbSA_LatchToLock
)
TryCopyStr
(
buf
,
",latchToLock"
,
sz
);
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyMovePtrArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbPtrAction
*
act
;
int
x
,
y
;
char
tbuf
[
32
];
act
=
&
action
->
ptr
;
x
=
XkbPtrActionX
(
act
);
y
=
XkbPtrActionY
(
act
);
if
((
act
->
flags
&
XkbSA_MoveAbsoluteX
)
||
(
x
<
0
))
sprintf
(
tbuf
,
"x=%d"
,
x
);
else
sprintf
(
tbuf
,
"x=+%d"
,
x
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
((
act
->
flags
&
XkbSA_MoveAbsoluteY
)
||
(
y
<
0
))
sprintf
(
tbuf
,
",y=%d"
,
y
);
else
sprintf
(
tbuf
,
",y=+%d"
,
y
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
(
act
->
flags
&
XkbSA_NoAcceleration
)
TryCopyStr
(
buf
,
",!accel"
,
sz
);
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyPtrBtnArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbPtrBtnAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
btn
;
TryCopyStr
(
buf
,
"button="
,
sz
);
if
((
act
->
button
>
0
)
&&
(
act
->
button
<
6
))
{
sprintf
(
tbuf
,
"%d"
,
act
->
button
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
else
TryCopyStr
(
buf
,
"default"
,
sz
);
if
(
act
->
count
>
0
)
{
sprintf
(
tbuf
,
",count=%d"
,
act
->
count
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
if
(
action
->
type
==
XkbSA_LockPtrBtn
)
{
switch
(
act
->
flags
&
(
XkbSA_LockNoUnlock
|
XkbSA_LockNoLock
))
{
case
XkbSA_LockNoLock
:
sprintf
(
tbuf
,
",affect=unlock"
);
break
;
case
XkbSA_LockNoUnlock
:
sprintf
(
tbuf
,
",affect=lock"
);
break
;
case
XkbSA_LockNoUnlock
|
XkbSA_LockNoLock
:
sprintf
(
tbuf
,
",affect=neither"
);
break
;
default:
sprintf
(
tbuf
,
",affect=both"
);
break
;
}
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
return
True
;
}
/*ARGSUSED*/
static
Bool
CopySetPtrDfltArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbPtrDfltAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
dflt
;
if
(
act
->
affect
==
XkbSA_AffectDfltBtn
)
{
TryCopyStr
(
buf
,
"affect=button,button="
,
sz
);
if
((
act
->
flags
&
XkbSA_DfltBtnAbsolute
)
||
(
XkbSAPtrDfltValue
(
act
)
<
0
))
sprintf
(
tbuf
,
"%d"
,
XkbSAPtrDfltValue
(
act
));
else
sprintf
(
tbuf
,
"+%d"
,
XkbSAPtrDfltValue
(
act
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
return
True
;
}
static
Bool
CopyISOLockArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbISOAction
*
act
;
char
tbuf
[
64
];
act
=
&
action
->
iso
;
if
(
act
->
flags
&
XkbSA_ISODfltIsGroup
)
{
TryCopyStr
(
tbuf
,
"group="
,
sz
);
if
(
act
->
flags
&
XkbSA_GroupAbsolute
)
sprintf
(
tbuf
,
"%d"
,
XkbSAGroup
(
act
)
+
1
);
else
if
(
XkbSAGroup
(
act
)
<
0
)
sprintf
(
tbuf
,
"%d"
,
XkbSAGroup
(
act
));
else
sprintf
(
tbuf
,
"+%d"
,
XkbSAGroup
(
act
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
else
{
unsigned
tmp
;
tmp
=
XkbModActionVMods
(
act
);
TryCopyStr
(
buf
,
"modifiers="
,
sz
);
if
(
act
->
flags
&
XkbSA_UseModMapMods
)
TryCopyStr
(
buf
,
"modMapMods"
,
sz
);
else
if
(
act
->
real_mods
||
tmp
)
{
if
(
act
->
real_mods
)
{
TryCopyStr
(
buf
,
XkbModMaskText
(
act
->
real_mods
,
XkbXKBFile
),
sz
);
if
(
tmp
)
TryCopyStr
(
buf
,
"+"
,
sz
);
}
if
(
tmp
)
TryCopyStr
(
buf
,
XkbVModMaskText
(
dpy
,
xkb
,
0
,
tmp
,
XkbXKBFile
),
sz
);
}
else
TryCopyStr
(
buf
,
"none"
,
sz
);
}
TryCopyStr
(
buf
,
",affect="
,
sz
);
if
((
act
->
affect
&
XkbSA_ISOAffectMask
)
==
0
)
TryCopyStr
(
buf
,
"all"
,
sz
);
else
{
int
nOut
=
0
;
if
((
act
->
affect
&
XkbSA_ISONoAffectMods
)
==
0
)
{
TryCopyStr
(
buf
,
"mods"
,
sz
);
nOut
++
;
}
if
((
act
->
affect
&
XkbSA_ISONoAffectGroup
)
==
0
)
{
sprintf
(
tbuf
,
"%sgroups"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
((
act
->
affect
&
XkbSA_ISONoAffectPtr
)
==
0
)
{
sprintf
(
tbuf
,
"%spointer"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
((
act
->
affect
&
XkbSA_ISONoAffectCtrls
)
==
0
)
{
sprintf
(
tbuf
,
"%scontrols"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
}
return
True
;
}
/*ARGSUSED*/
static
Bool
CopySwitchScreenArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbSwitchScreenAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
screen
;
if
((
act
->
flags
&
XkbSA_SwitchAbsolute
)
||
(
XkbSAScreen
(
act
)
<
0
))
sprintf
(
tbuf
,
"screen=%d"
,
XkbSAScreen
(
act
));
else
sprintf
(
tbuf
,
"screen=+%d"
,
XkbSAScreen
(
act
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
(
act
->
flags
&
XkbSA_SwitchApplication
)
TryCopyStr
(
buf
,
",!same"
,
sz
);
else
TryCopyStr
(
buf
,
",same"
,
sz
);
return
True
;
}
/*ARGSUSED*/
static
Bool
CopySetLockControlsArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbCtrlsAction
*
act
;
unsigned
tmp
;
char
tbuf
[
32
];
act
=
&
action
->
ctrls
;
tmp
=
XkbActionCtrls
(
act
);
TryCopyStr
(
buf
,
"controls="
,
sz
);
if
(
tmp
==
0
)
TryCopyStr
(
buf
,
"none"
,
sz
);
else
if
((
tmp
&
XkbAllBooleanCtrlsMask
)
==
XkbAllBooleanCtrlsMask
)
TryCopyStr
(
buf
,
"all"
,
sz
);
else
{
int
nOut
=
0
;
if
(
tmp
&
XkbRepeatKeysMask
)
{
sprintf
(
tbuf
,
"%sRepeatKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbSlowKeysMask
)
{
sprintf
(
tbuf
,
"%sSlowKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbBounceKeysMask
)
{
sprintf
(
tbuf
,
"%sBounceKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbStickyKeysMask
)
{
sprintf
(
tbuf
,
"%sStickyKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbMouseKeysMask
)
{
sprintf
(
tbuf
,
"%sMouseKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbMouseKeysAccelMask
)
{
sprintf
(
tbuf
,
"%sMouseKeysAccel"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbAccessXKeysMask
)
{
sprintf
(
tbuf
,
"%sAccessXKeys"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbAccessXTimeoutMask
)
{
sprintf
(
tbuf
,
"%sAccessXTimeout"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbAccessXFeedbackMask
)
{
sprintf
(
tbuf
,
"%sAccessXFeedback"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbAudibleBellMask
)
{
sprintf
(
tbuf
,
"%sAudibleBell"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbOverlay1Mask
)
{
sprintf
(
tbuf
,
"%sOverlay1"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbOverlay2Mask
)
{
sprintf
(
tbuf
,
"%sOverlay2"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
if
(
tmp
&
XkbIgnoreGroupLockMask
)
{
sprintf
(
tbuf
,
"%sIgnoreGroupLock"
,(
nOut
>
0
?
"+"
:
""
));
TryCopyStr
(
buf
,
tbuf
,
sz
);
nOut
++
;
}
}
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyActionMessageArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbMessageAction
*
act
;
unsigned
all
;
char
tbuf
[
32
];
act
=
&
action
->
msg
;
all
=
XkbSA_MessageOnPress
|
XkbSA_MessageOnRelease
;
TryCopyStr
(
buf
,
"report="
,
sz
);
if
((
act
->
flags
&
all
)
==
0
)
TryCopyStr
(
buf
,
"none"
,
sz
);
else
if
((
act
->
flags
&
all
)
==
all
)
TryCopyStr
(
buf
,
"all"
,
sz
);
else
if
(
act
->
flags
&
XkbSA_MessageOnPress
)
TryCopyStr
(
buf
,
"KeyPress"
,
sz
);
else
TryCopyStr
(
buf
,
"KeyRelease"
,
sz
);
sprintf
(
tbuf
,
",data[0]=0x%02x"
,
act
->
message
[
0
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[1]=0x%02x"
,
act
->
message
[
1
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[2]=0x%02x"
,
act
->
message
[
2
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[3]=0x%02x"
,
act
->
message
[
3
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[4]=0x%02x"
,
act
->
message
[
4
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[5]=0x%02x"
,
act
->
message
[
5
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
return
True
;
}
static
Bool
CopyRedirectKeyArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbRedirectKeyAction
*
act
;
char
tbuf
[
32
],
*
tmp
;
unsigned
kc
;
unsigned
vmods
,
vmods_mask
;
act
=
&
action
->
redirect
;
kc
=
act
->
new_key
;
vmods
=
XkbSARedirectVMods
(
act
);
vmods_mask
=
XkbSARedirectVModsMask
(
act
);
if
(
xkb
&&
xkb
->
names
&&
xkb
->
names
->
keys
&&
(
kc
<=
xkb
->
max_key_code
)
&&
(
xkb
->
names
->
keys
[
kc
].
name
[
0
]
!=
'\0'
))
{
char
*
kn
;
kn
=
XkbKeyNameText
(
xkb
->
names
->
keys
[
kc
].
name
,
XkbXKBFile
);
sprintf
(
tbuf
,
"key=%s"
,
kn
);
}
else
sprintf
(
tbuf
,
"key=%d"
,
kc
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
((
act
->
mods_mask
==
0
)
&&
(
vmods_mask
==
0
))
return
True
;
if
((
act
->
mods_mask
==
XkbAllModifiersMask
)
&&
(
vmods_mask
==
XkbAllVirtualModsMask
))
{
tmp
=
XkbVModMaskText
(
dpy
,
xkb
,
act
->
mods
,
vmods
,
XkbXKBFile
);
TryCopyStr
(
buf
,
",mods="
,
sz
);
TryCopyStr
(
buf
,
tmp
,
sz
);
}
else
{
if
((
act
->
mods_mask
&
act
->
mods
)
||
(
vmods_mask
&
vmods
))
{
tmp
=
XkbVModMaskText
(
dpy
,
xkb
,
act
->
mods_mask
&
act
->
mods
,
vmods_mask
&
vmods
,
XkbXKBFile
);
TryCopyStr
(
buf
,
",mods= "
,
sz
);
TryCopyStr
(
buf
,
tmp
,
sz
);
}
if
((
act
->
mods_mask
&
(
~
act
->
mods
))
||
(
vmods_mask
&
(
~
vmods
)))
{
tmp
=
XkbVModMaskText
(
dpy
,
xkb
,
act
->
mods_mask
&
(
~
act
->
mods
),
vmods_mask
&
(
~
vmods
),
XkbXKBFile
);
TryCopyStr
(
buf
,
",clearMods= "
,
sz
);
TryCopyStr
(
buf
,
tmp
,
sz
);
}
}
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyDeviceBtnArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbDeviceBtnAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
devbtn
;
sprintf
(
tbuf
,
"device= %d"
,
act
->
device
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
TryCopyStr
(
buf
,
",button="
,
sz
);
sprintf
(
tbuf
,
"%d"
,
act
->
button
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
if
(
act
->
count
>
0
)
{
sprintf
(
tbuf
,
",count=%d"
,
act
->
count
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
if
(
action
->
type
==
XkbSA_LockDeviceBtn
)
{
switch
(
act
->
flags
&
(
XkbSA_LockNoUnlock
|
XkbSA_LockNoLock
))
{
case
XkbSA_LockNoLock
:
sprintf
(
tbuf
,
",affect=unlock"
);
break
;
case
XkbSA_LockNoUnlock
:
sprintf
(
tbuf
,
",affect=lock"
);
break
;
case
XkbSA_LockNoUnlock
|
XkbSA_LockNoLock
:
sprintf
(
tbuf
,
",affect=neither"
);
break
;
default:
sprintf
(
tbuf
,
",affect=both"
);
break
;
}
TryCopyStr
(
buf
,
tbuf
,
sz
);
}
return
True
;
}
/*ARGSUSED*/
static
Bool
CopyOtherArgs
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
char
*
buf
,
int
*
sz
)
{
XkbAnyAction
*
act
;
char
tbuf
[
32
];
act
=
&
action
->
any
;
sprintf
(
tbuf
,
"type=0x%02x"
,
act
->
type
);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[0]=0x%02x"
,
act
->
data
[
0
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[1]=0x%02x"
,
act
->
data
[
1
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[2]=0x%02x"
,
act
->
data
[
2
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[3]=0x%02x"
,
act
->
data
[
3
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[4]=0x%02x"
,
act
->
data
[
4
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[5]=0x%02x"
,
act
->
data
[
5
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
sprintf
(
tbuf
,
",data[6]=0x%02x"
,
act
->
data
[
6
]);
TryCopyStr
(
buf
,
tbuf
,
sz
);
return
True
;
}
typedef
Bool
(
*
actionCopy
)(
Display
*
/* dpy */
,
XkbDescPtr
/* xkb */
,
XkbAction
*
/* action */
,
char
*
/* buf */
,
int
*
/* sz */
);
static
actionCopy
copyActionArgs
[
XkbSA_NumActions
]
=
{
CopyNoActionArgs
/* NoAction */
,
CopyModActionArgs
/* SetMods */
,
CopyModActionArgs
/* LatchMods */
,
CopyModActionArgs
/* LockMods */
,
CopyGroupActionArgs
/* SetGroup */
,
CopyGroupActionArgs
/* LatchGroup */
,
CopyGroupActionArgs
/* LockGroup */
,
CopyMovePtrArgs
/* MovePtr */
,
CopyPtrBtnArgs
/* PtrBtn */
,
CopyPtrBtnArgs
/* LockPtrBtn */
,
CopySetPtrDfltArgs
/* SetPtrDflt */
,
CopyISOLockArgs
/* ISOLock */
,
CopyNoActionArgs
/* Terminate */
,
CopySwitchScreenArgs
/* SwitchScreen */
,
CopySetLockControlsArgs
/* SetControls */
,
CopySetLockControlsArgs
/* LockControls */
,
CopyActionMessageArgs
/* ActionMessage*/
,
CopyRedirectKeyArgs
/* RedirectKey */
,
CopyDeviceBtnArgs
/* DeviceBtn */
,
CopyDeviceBtnArgs
/* LockDeviceBtn*/
};
#define ACTION_SZ 256
char
*
XkbActionText
(
Display
*
dpy
,
XkbDescPtr
xkb
,
XkbAction
*
action
,
unsigned
format
)
{
char
buf
[
ACTION_SZ
],
*
tmp
;
int
sz
;
if
(
format
==
XkbCFile
)
{
sprintf
(
buf
,
"{ %20s, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x } }"
,
XkbActionTypeText
(
action
->
type
,
XkbCFile
),
action
->
any
.
data
[
0
],
action
->
any
.
data
[
1
],
action
->
any
.
data
[
2
],
action
->
any
.
data
[
3
],
action
->
any
.
data
[
4
],
action
->
any
.
data
[
5
],
action
->
any
.
data
[
6
]);
}
else
{
sprintf
(
buf
,
"%s("
,
XkbActionTypeText
(
action
->
type
,
XkbXKBFile
));
sz
=
ACTION_SZ
-
strlen
(
buf
)
+
2
;
/* room for close paren and NULL */
if
(
action
->
type
<
(
unsigned
)
XkbSA_NumActions
)
(
*
copyActionArgs
[
action
->
type
])(
dpy
,
xkb
,
action
,
buf
,
&
sz
);
else
CopyOtherArgs
(
dpy
,
xkb
,
action
,
buf
,
&
sz
);
TryCopyStr
(
buf
,
")"
,
&
sz
);
}
tmp
=
tbGetBuffer
(
strlen
(
buf
)
+
1
);
if
(
tmp
!=
NULL
)
strcpy
(
tmp
,
buf
);
return
tmp
;
}
char
*
XkbBehaviorText
(
XkbDescPtr
xkb
,
XkbBehavior
*
behavior
,
unsigned
format
)
{
char
buf
[
256
],
*
tmp
;
if
(
format
==
XkbCFile
)
{
if
(
behavior
->
type
==
XkbKB_Default
)
sprintf
(
buf
,
"{ 0, 0 }"
);
else
sprintf
(
buf
,
"{ %3d, 0x%02x }"
,
behavior
->
type
,
behavior
->
data
);
}
else
{
unsigned
type
,
permanent
;
type
=
behavior
->
type
&
XkbKB_OpMask
;
permanent
=
((
behavior
->
type
&
XkbKB_Permanent
)
!=
0
);
if
(
type
==
XkbKB_Lock
)
{
sprintf
(
buf
,
"lock= %s"
,(
permanent
?
"Permanent"
:
"True"
));
}
else
if
(
type
==
XkbKB_RadioGroup
)
{
int
g
;
char
*
tmp
;
g
=
((
behavior
->
data
)
&
(
~
XkbKB_RGAllowNone
))
+
1
;
if
(
XkbKB_RGAllowNone
&
behavior
->
data
)
{
sprintf
(
buf
,
"allowNone,"
);
tmp
=
&
buf
[
strlen
(
buf
)];
}
else
tmp
=
buf
;
if
(
permanent
)
sprintf
(
tmp
,
"permanentRadioGroup= %d"
,
g
);
else
sprintf
(
tmp
,
"radioGroup= %d"
,
g
);
}
else
if
((
type
==
XkbKB_Overlay1
)
||
(
type
==
XkbKB_Overlay2
))
{
int
ndx
,
kc
;
char
*
kn
;
ndx
=
((
type
==
XkbKB_Overlay1
)
?
1
:
2
);
kc
=
behavior
->
data
;
if
((
xkb
)
&&
(
xkb
->
names
)
&&
(
xkb
->
names
->
keys
))
kn
=
XkbKeyNameText
(
xkb
->
names
->
keys
[
kc
].
name
,
XkbXKBFile
);
else
{
static
char
tbuf
[
8
];
sprintf
(
tbuf
,
"%d"
,
kc
);
kn
=
tbuf
;
}
if
(
permanent
)
sprintf
(
buf
,
"permanentOverlay%d= %s"
,
ndx
,
kn
);
else
sprintf
(
buf
,
"overlay%d= %s"
,
ndx
,
kn
);
}
}
tmp
=
tbGetBuffer
(
strlen
(
buf
)
+
1
);
if
(
tmp
!=
NULL
)
strcpy
(
tmp
,
buf
);
return
tmp
;
}
/***====================================================================***/
char
*
XkbIndentText
(
unsigned
size
)
{
static
char
buf
[
32
];
register
int
i
;
if
(
size
>
31
)
size
=
31
;
for
(
i
=
0
;
i
<
size
;
i
++
)
{
buf
[
i
]
=
' '
;
}
buf
[
size
]
=
'\0'
;
return
buf
;
}
nx-X11/programs/Xserver/xkb/xkmread.c
View file @
1918bcb9
...
...
@@ -26,8 +26,6 @@
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#elif defined(HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
...
...
@@ -35,7 +33,6 @@
#include <nx-X11/Xos.h>
#include <nx-X11/Xfuncs.h>
#include <nx-X11/X.h>
#include <nx-X11/Xproto.h>
#include <nx-X11/keysym.h>
...
...
@@ -53,7 +50,6 @@ XkbInternAtom(Display *dpy,char *str,Bool only_if_exists)
return
MakeAtom
(
str
,
strlen
(
str
),
!
only_if_exists
);
}
#ifndef SEEK_SET
#define SEEK_SET 0
#endif
...
...
@@ -156,6 +152,89 @@ int count,nRead=0;
return
nRead
;
}
unsigned
_XkbKSCheckCase
(
KeySym
ks
)
{
unsigned
set
,
rtrn
;
set
=
(
ks
&
(
~
0xff
))
>>
8
;
rtrn
=
0
;
switch
(
set
)
{
case
0
:
/* latin 1 */
if
(((
ks
>=
XK_A
)
&&
(
ks
<=
XK_Z
))
||
((
ks
>=
XK_Agrave
)
&&
(
ks
<=
XK_THORN
)
&&
(
ks
!=
XK_multiply
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_a
)
&&
(
ks
<=
XK_z
))
||
((
ks
>=
XK_agrave
)
&&
(
ks
<=
XK_ydiaeresis
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
1
:
/* latin 2 */
if
(((
ks
>=
XK_Aogonek
)
&&
(
ks
<=
XK_Zabovedot
)
&&
(
ks
!=
XK_breve
))
||
((
ks
>=
XK_Racute
)
&&
(
ks
<=
XK_Tcedilla
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_aogonek
)
&&
(
ks
<=
XK_zabovedot
)
&&
(
ks
!=
XK_caron
))
||
((
ks
>=
XK_racute
)
&&
(
ks
<=
XK_tcedilla
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
2
:
/* latin 3 */
if
(((
ks
>=
XK_Hstroke
)
&&
(
ks
<=
XK_Jcircumflex
))
||
((
ks
>=
XK_Cabovedot
)
&&
(
ks
<=
XK_Scircumflex
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_hstroke
)
&&
(
ks
<=
XK_jcircumflex
))
||
((
ks
>=
XK_cabovedot
)
&&
(
ks
<=
XK_scircumflex
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
3
:
/* latin 4 */
if
(((
ks
>=
XK_Rcedilla
)
&&
(
ks
<=
XK_Tslash
))
||
(
ks
==
XK_ENG
)
||
((
ks
>=
XK_Amacron
)
&&
(
ks
<=
XK_Umacron
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
(((
ks
>=
XK_rcedilla
)
&&
(
ks
<=
XK_tslash
))
||
(
ks
==
XK_eng
)
||
((
ks
>=
XK_amacron
)
&&
(
ks
<=
XK_umacron
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
18
:
/* latin 8 */
if
((
ks
==
XK_Babovedot
)
||
((
ks
>=
XK_Dabovedot
)
&&
(
ks
<=
XK_Wacute
))
||
((
ks
>=
XK_Ygrave
)
&&
(
ks
<=
XK_Fabovedot
))
||
(
ks
==
XK_Mabovedot
)
||
(
ks
==
XK_Pabovedot
)
||
(
ks
==
XK_Sabovedot
)
||
(
ks
==
XK_Wdiaeresis
)
||
((
ks
>=
XK_Wcircumflex
)
&&
(
ks
<=
XK_Ycircumflex
)))
{
rtrn
|=
_XkbKSUpper
;
}
if
((
ks
==
XK_babovedot
)
||
(
ks
==
XK_dabovedot
)
||
(
ks
==
XK_fabovedot
)
||
(
ks
==
XK_mabovedot
)
||
((
ks
>=
XK_wgrave
)
&&
(
ks
<=
XK_wacute
))
||
(
ks
==
XK_ygrave
)
||
((
ks
>=
XK_wdiaeresis
)
&&
(
ks
<=
XK_ycircumflex
)))
{
rtrn
|=
_XkbKSLower
;
}
break
;
case
19
:
/* latin 9 */
if
((
ks
==
XK_OE
)
||
(
ks
==
XK_Ydiaeresis
))
{
rtrn
|=
_XkbKSUpper
;
}
if
(
ks
==
XK_oe
)
{
rtrn
|=
_XkbKSLower
;
}
break
;
}
return
rtrn
;
}
/***====================================================================***/
static
int
...
...
@@ -1159,14 +1238,10 @@ int nRead;
*
loaded_rtrn
|=
XkmGeometryMask
;
break
;
default:
_XkbLibError
(
_XkbErrBadImplementation
,
XkbConfigText
(
tmpTOC
.
type
,
XkbMessage
),
0
);
nRead
=
0
;
break
;
}
if
(
nRead
!=
tmpTOC
.
size
)
{
_XkbLibError
(
_XkbErrBadLength
,
XkbConfigText
(
tmpTOC
.
type
,
XkbMessage
),
nRead
-
tmpTOC
.
size
);
return
0
;
}
return
(
nRead
>=
0
);
...
...
@@ -1201,8 +1276,6 @@ char name[100];
return
Xstrdup
(
name
);
break
;
default:
_XkbLibError
(
_XkbErrBadImplementation
,
XkbConfigText
(
tmpTOC
.
type
,
XkbMessage
),
0
);
break
;
}
return
NULL
;
...
...
@@ -1268,8 +1341,6 @@ unsigned which= need|want;
tmp
=
ReadXkmGeometry
(
file
,
result
);
break
;
default:
_XkbLibError
(
_XkbErrBadImplementation
,
XkbConfigText
(
tmpTOC
.
type
,
XkbMessage
),
0
);
tmp
=
0
;
break
;
}
...
...
@@ -1279,8 +1350,7 @@ unsigned which= need|want;
result
->
defined
|=
(
1
<<
toc
[
i
].
type
);
}
if
(
nRead
!=
tmpTOC
.
size
)
{
_XkbLibError
(
_XkbErrBadLength
,
XkbConfigText
(
tmpTOC
.
type
,
XkbMessage
),
nRead
-
tmpTOC
.
size
);
return
0
;
}
}
return
which
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment