summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEtienne Brateau <etienne.brateau@gmail.com>2024-03-10 00:48:38 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2024-03-10 17:00:12 +0100
commit3358b1473f52876c21e3acafe8f7eac41d01a290 (patch)
tree660b679180fd5254cf41b9d7d3f82bbb0f5ad3b8
parent66c891b1cb9ba42bd1824ef0dbffba503697c405 (diff)
console-client: use xkbcommon instead of x11 for xkb extended support
This allow to reduce the dependencies, only xkbcommon (keyboard support only) is required instead of the whole x11 library + lex + yacc. This replacement allow to reduce the code size, now features are handled by xkbcommon itself. The functionnalites remain the sames (actions are reimplemented but in the code directly as it’s impossible to add custom actions). The custom xkb data files are removed as we can now directly use the standard ones from xkeyboard-config. The configuration to launch the console keyboard modules changed to now directly configure the model+layout+variat+options directly. Tested by compiling with and without xkbcommon. Tested X11 (ran i3 correctly). Composing is still working. Message-ID: <20240309234838.31923-1-etienne.brateau@gmail.com>
-rw-r--r--config.make.in12
-rw-r--r--configure.ac60
-rw-r--r--console-client/Makefile39
-rw-r--r--console-client/pc-kbd.c111
-rw-r--r--console-client/xkb/MISSING-FEATURES6
-rw-r--r--console-client/xkb/README27
-rw-r--r--console-client/xkb/TODO3
-rw-r--r--console-client/xkb/compose.c592
-rw-r--r--console-client/xkb/kstoucs.c58
-rw-r--r--console-client/xkb/kstoucs_map.sh20
-rw-r--r--console-client/xkb/lex.l386
-rw-r--r--console-client/xkb/parser.y1605
-rw-r--r--console-client/xkb/xkb-data/keymap/hurd660
-rw-r--r--console-client/xkb/xkb-data/symbols/hurd125
-rw-r--r--console-client/xkb/xkb-data/types/hurd17
-rw-r--r--console-client/xkb/xkb.c1488
-rw-r--r--console-client/xkb/xkb.h405
-rw-r--r--console-client/xkb/xkbdata.c464
-rw-r--r--console-client/xkb/xkbtimer.c142
19 files changed, 452 insertions, 5768 deletions
diff --git a/config.make.in b/config.make.in
index 4a722a7a..1a30626b 100644
--- a/config.make.in
+++ b/config.make.in
@@ -51,8 +51,6 @@ MIG = @MIG@
MIGCOM = $(MIG) -cc cat - /dev/null
AWK = @AWK@
SED = @SED@
-LEX = @LEX@
-YACC = @YACC@
# Compilation flags. Append these to the definitions already made by
# the specific Makefile.
@@ -69,12 +67,10 @@ PARTED_LIBS = @PARTED_LIBS@
LIBNCURSESW = @LIBNCURSESW@
NCURSESW_INCLUDE = @NCURSESW_INCLUDE@
-# How to compile and link against X11.
-HAVE_X11 = @have_x11@
-X11_CFLAGS = @X11_CFLAGS@
-X11_LIBS = @X11_LIBS@
-XKB_BASE = @XKB_BASE@
-X11_KEYSYMDEF_H = @X11_KEYSYMDEF_H@
+# How to compile and link against xkbcommon.
+HAVE_XKBCOMMON = @have_xkbcommon@
+XKBCOMMON_CFLAGS = @xkbcommon_CFLAGS@
+XKBCOMMON_LIBS = @xkbcommon_LIBS@
# How to compile and link against libdaemon.
libdaemon_CFLAGS = @libdaemon_CFLAGS@
diff --git a/configure.ac b/configure.ac
index dd2481b0..a2e325cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -286,62 +286,12 @@ AC_MSG_RESULT($boot_store_types)
# Check for ncursesw, which is needed for the console-curses client.
hurd_LIB_NCURSESW
-AC_PROG_LEX
-AC_PROG_YACC
-AS_IF([test "$LEX" = ":" -o "$YACC" = ":"], [
-have_x11=no
-AC_MSG_WARN([lex or yacc is mising, XKB will be disabled.])
-],[
-# Check for those Xorg modules needed for keyboard mappings.
-PKG_CHECK_MODULES([X11], [x11 xproto],
- [ have_x11=yes
- pkg_failed=no
- AC_MSG_CHECKING([for xkb base])
- _PKG_CONFIG([XKB_BASE], [variable=xkb_base], [xkeyboard-config])
- AS_IF([test $pkg_failed = no],
- [XKB_BASE="$pkg_cv_XKB_BASE"
- AC_MSG_RESULT([$XKB_BASE])],
- [XKB_BASE="$datadir/X11/xkb"
- AC_MSG_RESULT([(default) $XKB_BASE])])
- pkg_failed=no
- AC_MSG_CHECKING([for X11 prefix])
- _PKG_CONFIG([X11_PREFIX], [variable=prefix], [x11])
- AS_IF([test $pkg_failed = no],
- [X11_PREFIX="$pkg_cv_X11_PREFIX"
- AC_MSG_RESULT([$X11_PREFIX])],
- [X11_PREFIX="$prefix"
- AC_MSG_RESULT([(default) $X11_PREFIX])])
-
- have_keysymdef_h=no
- AC_CHECK_HEADER([X11/keysymdef.h],
- [AC_MSG_CHECKING([for X11/keysymdef.h absolute location])
- AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <X11/keysymdef.h>]])],
- [[X11_KEYSYMDEF_H=`$SED -n 's%^[^"]*"\([^"]*X11/keysymdef.h\)".*$%\1%p' conftest.i`]
- # did the sed magic above work?
- AS_IF([test -f "$X11_KEYSYMDEF_H"],
- [have_keysymdef_h=yes],
- [X11_KEYSYMDEF_H=not-found])
- ],
- [X11_KEYSYMDEF_H=not-found])
- AC_MSG_RESULT([$X11_KEYSYMDEF_H])
- ])
- AS_IF([test $have_keysymdef_h = no],
- [AC_MSG_WARN([X11/keysymdef.h was not found, XKB will be disabled.])
- have_x11=no])
- ], [have_x11=no])
-])
+# Check for xkbcommon, needed for keyboard mappings.
+PKG_CHECK_MODULES([xkbcommon], [xkbcommon], [have_xkbcommon=yes], [have_xkbcommon=no])
-AS_IF([test "$have_x11" = "yes"],
- [AC_MSG_CHECKING([whether AWK is usable])
- AS_IF([test "$AWK" != ":" && $AWK 'BEGIN { strtonum("1"); }' 2>/dev/null],
- [AC_MSG_RESULT([yes])],
- [AC_MSG_RESULT([no])
- AC_MSG_ERROR([$AWK does not provide required strtonum function])])])
-
-AC_SUBST([have_x11])
-AC_SUBST([XKB_BASE])
-AC_DEFINE_UNQUOTED([X11_PREFIX], "$X11_PREFIX")
-AC_SUBST([X11_KEYSYMDEF_H])
+AC_SUBST([have_xkbcommon])
+AC_SUBST([xkbcommon_CFLAGS])
+AC_SUBST([xkbcommon_LIBS])
# Check for Sun RPC headers and library.
AC_ARG_WITH([libtirpc],
diff --git a/console-client/Makefile b/console-client/Makefile
index e4d9504d..b991cd73 100644
--- a/console-client/Makefile
+++ b/console-client/Makefile
@@ -40,7 +40,6 @@ console-LDFLAGS = -Wl,-E
CPPFLAGS += -I$(CURDIR)/xkb -I$(srcdir)/xkb $(libdaemon_CFLAGS)
LFLAGS = -i
-YFLAGS = -by
XKB_DATA_FILES = keymap/hurd types/hurd symbols/hurd
# In seeking, thou shalt find it!
@@ -96,38 +95,12 @@ $(DESTDIR)$(module-dir)/%: %
$(CFLAGS) $($*-CFLAGS) $(LDFLAGS) \
$^ '-Wl,-(' $($*-LDLIBS) '-Wl,-)'
-lex.c: lex.l parser.tab.h
-%.tab.h %.c: %.y
- if $(YACC) $(YFLAGS) -d $<; then \
- mv y.tab.h $*.tab.h; \
- mv y.tab.c $*.c; \
- fi
-
-XKB_SRCS = xkb/compose.c xkb/kstoucs.c xkb/parser.y xkb/lex.l \
- xkb/xkb.c xkb/xkbdata.c xkb/xkbtimer.c
-ifeq ($(HAVE_X11),yes)
+XKB_SRCS =
+ifeq ($(HAVE_XKBCOMMON),yes)
+XKB_SRCS = xkb/xkb.c xkb/xkbtimer.c
XKB_UNITS = $(basename $(notdir $(XKB_SRCS)))
pc_kbd.so.$(hurd-version): $(addsuffix _pic.o,$(XKB_UNITS))
-pc-kbd-CFLAGS = -DXKB_SUPPORT -DXKB_DATA_DIR=\"$(XKB_BASE)\" $(X11_CFLAGS)
-$(foreach XKB_UNIT, $(XKB_UNITS), $(eval $(XKB_UNIT)-CFLAGS = $(X11_CFLAGS)))
-compose-CFLAGS += -DDATADIR=\"$(datadir)\"
-pc_kbd-LDLIBS = $(X11_LIBS)
-install: $(DESTDIR)$(XKB_BASE) $(addprefix $(DESTDIR)$(XKB_BASE)/, $(XKB_DATA_FILES))
-
-$(DESTDIR)$(XKB_BASE):
- @$(MKINSTALLDIRS) $@
-
-$(DESTDIR)$(XKB_BASE)/%: xkb/xkb-data/%
- $(INSTALL_DATA) $< $@
-
-kstoucs.o: xkb/kstoucs_map.c
-kstoucs_pic.o: xkb/kstoucs_map.c
-xkb/kstoucs_map.c: $(X11_KEYSYMDEF_H) $(srcdir)/xkb/kstoucs_map.sh
- mkdir -p xkb ; \
- SED=$(SED) \
- AWK=$(AWK) \
- sh $(srcdir)/xkb/kstoucs_map.sh \
- < $< \
- > map.tmp && \
- mv map.tmp $@
+pc-kbd-CFLAGS = -DXKB_SUPPORT $(XKBCOMMON_CFLAGS)
+$(foreach XKB_UNIT, $(XKB_UNITS), $(eval $(XKB_UNIT)-CFLAGS = $(XKBCOMMON_CFLAGS)))
+pc_kbd-LDLIBS = $(XKBCOMMON_LIBS)
endif
diff --git a/console-client/pc-kbd.c b/console-client/pc-kbd.c
index aa5f1103..9e03cff8 100644
--- a/console-client/pc-kbd.c
+++ b/console-client/pc-kbd.c
@@ -45,11 +45,8 @@
/* The keyboard device in the kernel. */
static device_t kbd_dev;
-/* The converter.
- XXX: Here it is used by the fixed US layout code. It's not static because
- xkb.c also needs a converter. This variable and it's initialization should
- be moved there once XKB is supported in OSKit. */
-iconv_t cd;
+/* The converter. */
+static iconv_t cd;
/* The status of various LEDs. */
struct {
@@ -710,14 +707,13 @@ keycode_t
read_keycode (void)
{
scancode_t sc = input_next ();
- int release = 0;
/* The keypress generated two keycodes. */
if (sc == SC_EXTENDED1)
{
sc = input_next ();
- release = sc & 0x80;
+ int release = sc & 0x80;
sc &= ~0x80;
switch (sc)
@@ -780,8 +776,6 @@ read_keycode (void)
sc |= release;
}
- else
- release = sc & 0x80;
return sc;
}
@@ -805,30 +799,17 @@ input_loop (void *unused)
{
keypress_t key;
- key.keycode = read_keycode () + min_keys;
- key.rel = key.keycode & 0x80;
- key.redir = 0;
-
- if (!key.rel && key.keycode == prevkey)
- key.repeat = 1;
- else
- key.repeat = 0;
+ keycode_t raw_keycode = read_keycode () + get_min_keycode();
+ key.keycode = raw_keycode & ~0x80;
+ key.rel = raw_keycode & 0x80;
- if (key.repeat)
+ /* don’t allow repeated key */
+ if (raw_keycode == prevkey)
continue;
- /* The keycombination CTRL+Alt+Backspace terminates the console
- client. Keycodes instead of modifiers+symbols are used to
- make it able to exit the client, even when the keymaps are
- faulty. */
- if ((keystate[64].keypressed || keystate[113].keypressed) /* Alt */
- && (keystate[37].keypressed || keystate[109].keypressed) /* CTRL*/
- && keystate[22].keypressed && ctrlaltbs) /* Backspace. */
- console_exit ();
-
- if (!key.repeat)
- xkb_input_key (key.keycode);
- prevkey = key.keycode;
+ process_input(key);
+
+ prevkey = raw_keycode;
}
return 0;
@@ -1188,9 +1169,10 @@ struct arguments
{
int pos;
#ifdef XKB_SUPPORT
- char *xkbdir;
- char *keymapfile;
- char *keymap;
+ char *model;
+ char *layout;
+ char *variant;
+ char *options;
char *composefile;
int ctrlaltbs;
int repeat_delay;
@@ -1204,12 +1186,14 @@ static const struct argp_option options[] =
/* Some random ids for options available only in long form. */
#define REPEAT_DELAY_ID 25425
#define REPEAT_INTERVAL_ID 5322
- {"xkbdir", 'x', "DIR", 0,
- "Directory containing the XKB configuration files" },
- {"keymapfile", 'f', "FILE", 0,
- "File containing the keymap" },
- {"keymap", 'k', "SECTIONNAME" , 0,
- "Choose keymap"},
+ {"model", 'm', "XKB_MODEL", 0,
+ "the keyboard model for xkb" },
+ {"layout", 'l', "XKB_LAYOUT", 0,
+ "The layout of the keyboard" },
+ {"variant", 'v', "XKB_VARIANT" , 0,
+ "The variant to use"},
+ {"options", 'p', "XKB_OPTIONS" , 0,
+ "The xkb options"},
{"compose", 'o', "COMPOSEFILE", 0,
"Compose file to load (default none)"},
{"ctrlaltbs", 'c', 0 , 0,
@@ -1234,18 +1218,22 @@ parse_opt (int key, char *arg, struct argp_state *state)
switch (key)
{
#ifdef XKB_SUPPORT
- case 'x':
- arguments->xkbdir = arg;
+ case 'm':
+ arguments->model = arg;
break;
- case 'f':
- arguments->keymapfile = arg;
+ case 'l':
+ arguments->layout = arg;
break;
- case 'k':
- arguments->keymap = arg;
+ case 'v':
+ arguments->variant = arg;
break;
+ case 'p': // o already taken for composefile
+ arguments->options = arg;
+ break;
+
case 'o':
arguments->composefile = arg;
break;
@@ -1292,9 +1280,10 @@ pc_kbd_init (void **handle, int no_exit, int argc, char *argv[], int *next)
{
pos: 1
#ifdef XKB_SUPPORT
- , xkbdir: 0
- , keymapfile: 0
- , keymap: 0
+ , model: 0
+ , layout: 0
+ , variant: 0
+ , options: 0
, composefile: 0
, ctrlaltbs: 1
, repeat_delay: -1
@@ -1311,14 +1300,6 @@ pc_kbd_init (void **handle, int no_exit, int argc, char *argv[], int *next)
return err;
#ifdef XKB_SUPPORT
- if (!arguments.xkbdir)
- {
- arguments.xkbdir = XKB_DATA_DIR;
- }
- if (!arguments.keymapfile)
- {
- arguments.keymapfile = "keymap/hurd";
- }
if (arguments.repeat_delay <= 0)
{
arguments.repeat_delay = 50;
@@ -1332,13 +1313,11 @@ pc_kbd_init (void **handle, int no_exit, int argc, char *argv[], int *next)
xkb_repeat_delay = arguments.repeat_delay;
xkb_repeat_interval = arguments.repeat_interval;
- err = read_composefile (arguments.composefile);
- if (err)
- return err;
-
- xkb_data_init ();
- err = xkb_load_layout (arguments.xkbdir, arguments.keymapfile,
- arguments.keymap);
+ /* Force rules to be "base" to be compatible with the raw keycode we give.
+ * Otherwise, evdev will be selected and the scancode to keycode conversion won’t be the same
+ * and would be incompatible with the input we give.
+ */
+ err = xkb_context_init ("base", arguments.model, arguments.layout, arguments.variant, arguments.options, arguments.composefile);
if (err)
return err;
@@ -1444,7 +1423,11 @@ pc_kbd_fini (void *handle, int force)
console_unregister_consnode (cnode);
console_destroy_consnode (cnode);
-
+
+#ifdef XKB_SUPPORT
+ xkb_context_cleanup ();
+#endif
+
return 0;
}
diff --git a/console-client/xkb/MISSING-FEATURES b/console-client/xkb/MISSING-FEATURES
index 237c13d7..9410a088 100644
--- a/console-client/xkb/MISSING-FEATURES
+++ b/console-client/xkb/MISSING-FEATURES
@@ -1,19 +1,13 @@
Required for 100% compatibility with XKB:
- Jukebox (possibility that this won't ever be done)
-- Loading the keydatabase
- Proper indicator support
-- ISOLock
-- key lock
-- radio groups
- overlays
-- Latching (properly, mostly works)
- Enabling/disabling controls
- The following controls are not implemented at all:
- SlowKeys
- BounceKeys
- StickyKeys
- - MouseKeysAccel
- AccesXKeys
- AccesXTimeout
- AccessXFreedback (jukebox required)
diff --git a/console-client/xkb/README b/console-client/xkb/README
index b8e246a7..82f46ba7 100644
--- a/console-client/xkb/README
+++ b/console-client/xkb/README
@@ -62,16 +62,15 @@ XFree and will be placed in /share/X11/xkb on most systems.
This module adds the following set of options to pc-kbd for overriding
the default behaviour:
---xkbdir : The root directory of the xkb configuration, by default
- this is /share/X11/xkb.
+--model : model of the keyboard (usually pc105).
---keymapfile : The file that hold the descriptions of the default
- keymaps file. This file holds the description of all keymaps. This
- path should be relative to the path set by `xkbdir'. By default
- "keymap/xfree86" is used.
+--layout : The layout of the keyboard (us, fr, it, etc).
---keymap : The keymap to use. By default en_US is used. Examples of
- some other keymaps are: fr, us, de, dvorak. Example: --keymap=de
+--variant : The variant of layout to use (latin9, dvorak, etc).
+
+--options : The options to pass to xkbcommon.
+
+--composefile : The compose file to use for key composition in the keyboard (ctrl, alt, etc).
--ctrlaltbs : CTRL+Alt+Backspace will exit the console client.
--no-ctrlaltbs : CTRL+Alt+Backspace will not exit the console client.
@@ -82,18 +81,6 @@ the default behaviour:
--repeat-interval : The number of jiffies the driver should wait
between each repeated key. By default this is 10 jiffies.
-I wrote some XKB extensions and configuration files to use these
-extensions. You can find these files in the xkb-data directory.
-
-The build system will copy these files to where your XKB
-configuration files are (usually /share/X11/xkb).
-
-for example: xkb-data/keymap/hurd will be copied to /share/X11/xkb/keymap.
-
-To use these extensions you have to use the hurd keymaps file. This
-holds all keymaps extended with Hurd features. Use "--keymapfile
-keymap/hurd" to select this file.
-
After that you can use these keybindings:
Alt + F1...F12: Switch VC.
diff --git a/console-client/xkb/TODO b/console-client/xkb/TODO
index 2066f9c6..e7403949 100644
--- a/console-client/xkb/TODO
+++ b/console-client/xkb/TODO
@@ -1,6 +1,3 @@
-Use layout/variant rules instead of keymaps
-Indicators.
-Use libihash.
Better memory handling.
Better debug output
CLEAN UP!
diff --git a/console-client/xkb/compose.c b/console-client/xkb/compose.c
deleted file mode 100644
index 955c820c..00000000
--- a/console-client/xkb/compose.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/* compose.c -- Keysym composing
-
- Copyright (C) 2003 Marco Gerards
-
- Written by Marco Gerards <metgerards@student.han.nl>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <X11/keysymdef.h>
-#include "xkb.h"
-#include <ctype.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <locale.h>
-#include <assert-backtrace.h>
-
-/* Tokens that can be recognised by the scanner. */
-enum tokentype
- {
- UNKNOWN,
- EOL,
- REQKS,
- SEMICOL,
- STR,
- PRODKS,
- END
- };
-
-/* The current token. */
-struct token
-{
- enum tokentype toktype;
- char value[50];
-} tok;
-
-/* The linenumber of the line currently parsed, used for returning
- errors and warnings. */
-static int linenum;
-
-/* Read a token from the file CF. */
-static void
-read_token (FILE *cf)
-{
- int c = fgetc (cf);
- int pos = 0;
-
- /* Remove whitespaces. */
- while (c == ' ' || c == '\t')
- c = fgetc (cf);
-
- /* Comment, remove until end of line and return a EOL token. */
- if (c == '#')
- {
- while (c != '\n')
- c = fgetc (cf);
- tok.toktype = EOL;
- linenum++;
- return;
- }
-
- /* End of file. */
- if (c == EOF)
- {
- tok.toktype = END;
- return;
- }
-
- /* Semicolon. */
- if (c == ':')
- {
- tok.toktype = SEMICOL;
- return;
- }
-
- /* End of line. */
- if (c == '\n')
- {
- linenum++;
- tok.toktype = EOL;
- return;
- }
-
-
- /* Required keysym. */
- if (c == '<')
- {
- while ((c = fgetc (cf)) != '>')
- tok.value[pos++] = c;
- tok.value[pos] = '\0';
- tok.toktype = REQKS;
- return;
- }
-
- /* Character string. */
- if (c == '"')
- {
- while ((c = fgetc (cf)) != '"')
- {
- if (c == '\\')
- c = fgetc (cf);
-
- tok.value[pos++] = c;
- }
- tok.value[pos] = '\0';
- tok.toktype = STR;
- return;
- }
-
- /* Produced keysym. */
- if (isalpha (c))
- {
- tok.value[pos++] = c;
- while (isgraph (c = fgetc (cf)))
- tok.value[pos++] = c;
- tok.value[pos] = '\0';
- tok.toktype = PRODKS;
- ungetc (c, cf);
- return;
- }
-
- /* Unknown token. */
- tok.toktype = UNKNOWN;
- return;
-}
-
-/* Compose sequence. */
-struct compose
-{
- struct compose *left;
- struct compose *right;
- symbol *expected;
- symbol produced;
-} *compose_tree;
-
-
-/* Compare symbol sequence s1 to symbol sequence s1. This function
- works just like the strcmp function. */
-static int
-symbolscmp (symbol *s1, symbol *s2)
-{
- while (*s1 && *s2 && (*s1 == *s2))
- {
- s1++;s2++;
- }
- if (*s1 < *s2)
- return -1;
- if (*s1 > *s2)
- return 1;
- return 0;
-}
-
-/* Compare symbol sequence s1 to symbol sequence s1, compare a maximum
- of N symbols. This function works just like the strcmp function.
- */
-static int
-symbolsncmp (symbol *s1, symbol *s2, int n)
-{
- int cnt = 0;
- while (*s1 && *s2 && (*s1 == *s2))
- {
- if (++cnt == n)
- break;
- s1++;s2++;
- }
-
- if (*s1 < *s2)
- return -1;
- if (*s1 > *s2)
- return 1;
- return 0;
-}
-
-
-/* Add the compose sequence EXP to the binary tree, store RESULT as
- the keysym produced by EXP. */
-static struct compose *
-composetree_add (struct compose *tree, symbol *exp, symbol result)
-{
- int cmp;
-
- if (tree == NULL)
- {
- tree = malloc (sizeof (struct compose));
- tree->expected = exp;
- tree->produced = result;
- tree->left = tree->right = NULL;
-
- return tree;
- }
-
- cmp = symbolscmp (exp, tree->expected);
- if (cmp == 0)
- {
- printf ("Warning: line %d: Double sequence.\n", linenum);
- free (exp);
- }
- else if (cmp < 0)
- tree->left = composetree_add (tree->left, exp, result);
- else
- tree->right = composetree_add (tree->right, exp, result);
- return tree;
-}
-
-/* Parse the composefile CF and put all sequences in the binary tree
- COMPOSE_TREE. This function may never fail because of syntactical or
- lexalical errors, generate a warning instead. */
-static error_t
-parse_composefile (FILE *cf)
-{
- void skip_line (void)
- {
- while (tok.toktype != EOL && tok.toktype != END)
- read_token (cf);
- }
-
- for (;;)
- {
- /* Expected keysyms. */
- symbol exp[50];
- symbol *exps;
- size_t expcnt = 0;
- symbol sym;
-
- read_token (cf);
- /* Blank line. */
- if (tok.toktype == EOL)
- continue;
-
- /* End of file, done parsing. */
- if (tok.toktype == END)
- return 0;
-
- if (tok.toktype != REQKS)
- {
- printf ("Warning: line %d: Keysym expected on beginning of line.\n",
- linenum);
- skip_line ();
- continue;
- }
-
- /* Keysym was recognised, add it. */
- sym = XStringToKeysym (tok.value);
- if (!sym)
- {
- printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum,
- tok.value);
- skip_line ();
- continue;
- }
- exp[expcnt++] = sym;
-
- do
- {
- read_token (cf);
- /* If another required keysym is recognised, add it. */
- if (tok.toktype == REQKS)
- {
- sym = XStringToKeysym (tok.value);
- if (!sym)
- {
- printf ("Warning: line %d: Unknown keysym \"%s\".\n",
- linenum, tok.value);
- skip_line ();
- continue;
- }
- exp[expcnt++] = sym;
- }
- } while (tok.toktype == REQKS);
-
- if (tok.toktype != SEMICOL)
- {
- printf ("Warning: line %d: Semicolon expected.\n", linenum);
- skip_line ();
- continue;
- }
-
- read_token (cf);
- /* Force token and ignore it. */
- if (tok.toktype != STR)
- {
- printf ("Warning: line %d: string expected.\n", linenum);
- skip_line ();
- continue;
- }
-
- read_token (cf);
- if (tok.toktype != PRODKS)
- {
- printf ("Warning: line %d: keysym expected.\n", linenum);
- skip_line ();
- continue;
- }
- sym = XStringToKeysym (tok.value);
- if (!sym)
- {
- printf ("Warning: line %d: Unknown keysym \"%s\".\n", linenum,
- tok.value);
- skip_line ();
- continue;
- }
-
- read_token (cf);
- if (tok.toktype != EOL && tok.toktype != END)
- {
- printf ("Warning: line %d: end of line or end of file expected.\n",
- linenum);
- skip_line ();
- continue;
- }
-
- /* Add the production rule. */
- exp[expcnt++] = 0;
- exps = malloc (sizeof (symbol) * expcnt);
- memcpy (exps, exp, sizeof (symbol) * expcnt);
- compose_tree = composetree_add (compose_tree, exps, sym);
- }
- return 0;
-}
-
-/* Read keysyms passed to this function by S until a keysym can be
- composed. If the first keysym cannot start a compose sequence return
- the keysym. */
-symbol
-compose_symbols (symbol s)
-{
- /* Current position in the compose tree. */
- static struct compose *treepos = NULL;
- /* Current compose sequence. */
- static symbol syms[100];
- /* Current position in the compose sequence. */
- static int pos = 0;
- int cmp;
-
- if (!treepos)
- treepos = compose_tree;
-
- /* Maximum sequence length reached. Some idiot typed this many
- symbols and now we throw it all away, wheee!!! */
- if (pos == 99)
- {
- treepos = compose_tree;
- pos = 0;
- }
-
- /* Put the keysym in the compose sequence array. */
- syms[pos++] = s;
- syms[pos] = 0;
-
- /* Search the tree for a keysym sequence that can match the current one. */
- while (treepos)
- {
- cmp = symbolsncmp (syms, treepos->expected, pos);
- if (cmp == 0)
- {
- /* The keysym sequence was partially recognised, check if it
- can completely match. */
- if (!symbolscmp (syms, treepos->expected))
- {
- symbol ret = treepos->produced;
- treepos = compose_tree;
- pos = 0;
- return ret;
- }
-
- /* The sequence was partially recognised. */
- return -1;
- }
-
- if (cmp < 0)
- treepos = treepos->left;
- else
- treepos = treepos->right;
- }
-
- /* Nothing can be found. */
- treepos = compose_tree;
-
- /* This ks should've started a sequence but couldn't be found,
- just return it. */
- if (pos == 1)
- {
- pos = 0;
- return s;
- }
-
- debug_printf ("Invalid\n");
- /* Invalid keysym sequence. */
- pos = 0;
- return -1;
-}
-
-struct map_entry
-{
- const char *left;
- const char *right;
-};
-
-enum callback_result
- {
- NEXT,
- DONE
- };
-
-typedef enum callback_result (*map_callback) (void *context, struct map_entry *entry);
-
-static error_t
-map_iterate(const char *map_path, map_callback action, void *context)
-{
- FILE *map;
- char *buffer = NULL;
- size_t buffer_size = 0;
- size_t line_length = 0;
-
- assert_backtrace (map_path != NULL);
- assert_backtrace (action != NULL);
-
- map = fopen (map_path, "r");
-
- if (map == NULL)
- return errno;
-
- while ( (line_length = getline (&buffer, &buffer_size, map)) != -1)
- {
- /* skips empty lines and comments */
- if (line_length < 1 || buffer[0] == '#')
- continue;
- else
- {
- struct map_entry entry = {NULL, NULL};
- char *end = buffer + line_length;
- char *p = buffer;
-
- while (p != end && isspace(*p)) p++;
-
- if (p == end)
- continue;
-
- entry.left = p;
-
- while (p != end && !isspace(*p)) p++;
-
- if (p != end)
- {
- *(p++) = 0;
- while (p != end && isspace(*p)) p++;
-
- if (p != end)
- {
- entry.right = p;
- while (p != end && !isspace(*p)) p++;
- if (p != end)
- *p = 0;
- }
- }
-
- if (action (context, &entry) == DONE)
- break;
- }
- }
- free (buffer);
- fclose (map);
- return 0;
-}
-
-struct matcher_context
-{
- char *value;
- char *result;
-};
-
-static enum callback_result
-match_left_set_right (void *context, struct map_entry *entry)
-{
- struct matcher_context *ctx = (struct matcher_context *) context;
-
- if (strcmp (ctx->value, entry->left) == 0)
- {
- ctx->result = strdup (entry->right);
- return DONE;
- }
- return NEXT;
-}
-
-static enum callback_result
-match_right_set_left (void *context, struct map_entry *entry)
-{
- struct matcher_context *ctx = (struct matcher_context *) context;
-
- if (strcmp (ctx->value, entry->right) == 0)
- {
- ctx->result = strdup (entry->left);
- return DONE;
- }
- return NEXT;
-}
-
-/* Search for a compose file.
-
- According to Compose(5) man page the compose file searched in the
- following locations:
- - XCOMPOSEFILE variable.
- - .XCompose at $HOME.
- - System wide compose file for the current locale. */
-static char *
-get_compose_file_for_locale(void)
-{
- struct matcher_context context = { NULL };
- char *xcomposefile;
- char *to_be_freed;
- char *home;
- int err;
-
- xcomposefile = getenv ("XCOMPOSEFILE");
- if (xcomposefile != NULL)
- return strdup (xcomposefile);
-
- home = getenv ("HOME");
- if (home != NULL)
- {
- err = asprintf (&xcomposefile, "%s/.XCompose", home);
- if (err != -1)
- {
- if (faccessat(AT_FDCWD, xcomposefile, R_OK, AT_EACCESS) == 0)
- return xcomposefile;
- else
- {
- free (xcomposefile);
- /* TODO: check and report whether the compose file doesn't exist or
- read permission was not granted to us. */
- }
- }
- }
-
- context.value = setlocale (LC_ALL, NULL);
- map_iterate (X11_PREFIX "/share/X11/locale/locale.alias", match_left_set_right, &context);
- to_be_freed = context.result;
-
- if (context.result != NULL)
- {
- /* Current locale is an alias. Use the real name to index the database. */
- context.value = context.result;
- }
- context.result = NULL;
- map_iterate (X11_PREFIX "/share/X11/locale/compose.dir", match_right_set_left, &context);
- free (to_be_freed);
-
- /* compose.dir contains relative paths to compose files. */
- to_be_freed = context.result;
- err = asprintf (&context.result, X11_PREFIX "/share/X11/locale/%s", context.result);
- if (err == -1)
- context.result = NULL;
-
- free (to_be_freed);
- return context.result;
-}
-
-/* Read a Compose file. */
-error_t
-read_composefile (char *composefn)
-{
- FILE *cf;
-
- error_t err;
-
- if (composefn == NULL)
- composefn = get_compose_file_for_locale ();
-
- cf = fopen (composefn, "r");
- if (cf == NULL)
- return errno;
-
- err = parse_composefile (cf);
- fclose (cf);
-
- return err;
-}
diff --git a/console-client/xkb/kstoucs.c b/console-client/xkb/kstoucs.c
deleted file mode 100644
index 59af1e9f..00000000
--- a/console-client/xkb/kstoucs.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <assert-backtrace.h>
-
-struct ksmap {
- int keysym;
- unsigned int ucs;
-};
-
-#include "kstoucs_map.c"
-
-/* Binary search through `kstoucs_map'. */
-static unsigned int
-find_ucs (int keysym, struct ksmap *first, struct ksmap *last)
-{
- struct ksmap *middle = first + (last - first) / 2;
-
- assert_backtrace (first <= last);
-
- if (middle->keysym == keysym)
- return middle->ucs; /* base case: needle found. */
- else if (first == last) /* empty search space */
- return 0;
- /* recursive cases: halve search space. */
- else if (middle->keysym < keysym)
- return find_ucs (keysym, middle+1, last);
- else if (middle->keysym > keysym)
- /* don't remove middle from the range to compensate
- for rounding down in it's calculation */
- return find_ucs (keysym, first, middle);
- return 0;
-}
-
-unsigned int
-KeySymToUcs4 (int keysym)
-{
-#ifdef XKB_DEBUG
- char *XKeysymToString(int keysym);
- printf ("KeySymToUcs4: %s (%d) -> ", XKeysymToString (keysym), keysym);
-unsigned int doit (int keysym)
-{
-#endif
-
- /* Control characters not covered by keysym map. */
- if (keysym > 0 && keysym < 32)
- return keysym;
-
- /* 'Unicode keysym' */
- if ((keysym & 0xff000000) == 0x01000000)
- return (keysym & 0x00ffffff);
-
- #define NUM_KEYSYMS (sizeof kstoucs_map / sizeof(struct ksmap))
- return find_ucs(keysym, &kstoucs_map[0], &kstoucs_map[NUM_KEYSYMS - 1]);
-#ifdef XKB_DEBUG
-}
- unsigned int ret = doit (keysym);
- printf ("%d\n", ret);
- return ret;
-#endif
-}
diff --git a/console-client/xkb/kstoucs_map.sh b/console-client/xkb/kstoucs_map.sh
deleted file mode 100644
index 624d3518..00000000
--- a/console-client/xkb/kstoucs_map.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-
-SED=${SED:-sed}
-AWK=${AWK:-awk}
-
-$SED -n -e 's/#define XK_[a-zA-Z0-9_]\+\s\+\(0x[0-9a-fA-F]\+\)\s*\/\*\s*U+\([0-9a-fA-F]\+\).*\*\//\1\t0x\2/p' \
- | $AWK '{ print strtonum($1) "\t" $2; }' \
- | sort -n -k1 \
- | $AWK '
- BEGIN { print "struct ksmap kstoucs_map[] = {" }
- {
- if (NR == 1)
- separator =" ";
- else
- separator =" , ";
-
- if (strtonum($1) < 0x1000000)
- print separator "{ " $1 ", " $2 " }"
- }
- END { print "};" }'
diff --git a/console-client/xkb/lex.l b/console-client/xkb/lex.l
deleted file mode 100644
index ba805f0e..00000000
--- a/console-client/xkb/lex.l
+++ /dev/null
@@ -1,386 +0,0 @@
-/* XKB scanner.
-
- Copyright (C) 2002, 03 Marco Gerards
-
- Written by Marco Gerards <marco@student.han.nl>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details. */
-
-
- #include "xkb.h"
- #include "parser.tab.h"
- #include <string.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <error.h>
-
- int close_include (void);
- int lineno = 1;
- char *filename = "foo";
-
-%option nodebug
-
-%option UNPUT
-KEYCODE "<"[A-Z][-+A-Z0-9]*">"
-DIGIT [0-9]
-NUM {DIGIT}{DIGIT}*
-FLOAT {DIGIT}{DIGIT}*\.{DIGIT}{DIGIT}*
-HEX 0x[A-Za-z0-9]*
-IDENTIFIER [a-zA-Z][a-zA-Z0-9_]*
-CPPCOMMENT "//".*"\n"
-%%
- /* When the end of a file is reached, close the
- current one and pop the next file to process
- of the stack. */
-
- /* Filter out comment. */
-{CPPCOMMENT} { lineno++; }
- "/*" {
- int c;
-
- while((c = input()) != 0)
- {
- if(c == '\n')
- lineno++;
-
- else if(c == '*')
- {
- if((c = input()) == '/')
- break;
- else
- unput(c);
- }
- }
- }
-
-\n { lineno++; }
-
- /* Beginning of sections. */
-xkb_keymap { return XKBKEYMAP; }
-xkb_symbols { return XKBSYMBOLS; }
-xkb_keycodes { return XKBKEYCODES; }
-xkb_types { return XKBTYPES; }
-xkb_compatibility { return XKBCOMPAT; }
-xkb_geometry { return XKBGEOMETRY; }
-
-
- /* Real modifiers. */
-shift { return SHIFT; }
-lock { return LOCK; }
-control { return CONTROL; }
-ctrl { return CONTROL; }
-mod1 { return MOD1; }
-mod2 { return MOD2; }
-mod3 { return MOD3; }
-mod4 { return MOD4; }
-mod5 { return MOD5; }
-
- /* Levels. */
-anylevel { yylval.val = 0; return LEVEL; }
-levelone { yylval.val = 1; return LEVEL; }
-level1 { yylval.val = 1; return LEVEL; }
-level2 { yylval.val = 2; return LEVEL; }
-level3 { yylval.val = 3; return LEVEL; }
-level4 { yylval.val = 4; return LEVEL; }
-level[1-9][0-9]* { yylval.val = atoi(yytext + 5); return LEVEL; }
-
- /* Groups. */
-group1 { yylval.val = 1; return GROUPNUM; }
-group2 { yylval.val = 2; return GROUPNUM; }
-group3 { yylval.val = 3; return GROUPNUM; }
-group4 { yylval.val = 4; return GROUPNUM; }
-
- /* Booleans */
-true { yylval.val = 1; return BOOLEAN; }
-false { yylval.val = 0; return BOOLEAN; }
-
- /* Interpretation */
-interpret { return INTERPRET; }
-usemodmap { return USEMODMAP; }
-usemodmapmods { return USEMODMAP; }
-modmapmods { return USEMODMAP; }
-repeat { return REPEAT; }
-locking { return LOCKING; }
-locks { return LOCKING; }
-virtualmodifier { return VIRTUALMODIFIER; }
-virtualmod { return VIRTUALMODIFIER; }
-
- /* Interpretation match. */
-noneof { yylval.val = 0; return INTERPMATCH ;}
-anyofornone { yylval.val = 1; return INTERPMATCH ;}
-anyof { yylval.val = 2; return INTERPMATCH ;}
-allof { yylval.val = 3; return INTERPMATCH ;}
-exactly { yylval.val = 4; return INTERPMATCH ;}
-
- /* SetMods action. */
-clearlocks { return CLEARLOCKS; }
-mods { return MODS; }
-
-unlock { return UNLOCK; }
-both { return BOTH; }
-neither { return NEITHER; }
-
- /* Actions. */
-setmods { return SETMODS; }
-latchmods { return LATCHMODS; }
-lockmods { return LOCKMODS; }
-setgroup { return SETGROUP; }
-latchgroup { return LATCHGROUP; }
-lockgroup { return LOCKGROUP; }
-setptrdflt { return PTRDFLT; }
-setpointerdefault { return PTRDFLT; }
-lockptrbtn { return LOCKPTRBTN; }
-lockpointerbutton { return LOCKPTRBTN; }
-lockptrbutton { return LOCKPTRBTN; }
-lockpointerbtn { return LOCKPTRBTN; }
-setcontrols { return SETCONTROLS; }
-lockcontrols { return LOCKCONTROLS; }
-terminateserver { return TERMINATE; }
-terminate { return TERMINATE; }
-switchscreen { return SWITCHSCREEN; }
-consscroll { return CONSSCROLL; }
-consolescroll { return CONSSCROLL; }
-moveptr { return MOVEPTR; }
-private { return PRIVATE; }
- /* Action parameters. */
-latchtolock { return LATCHTOLOCK; }
-group { return GROUP; }
-groups { return GROUPS; }
-accel { return ACCEL; }
-accelerate { return ACCEL; }
-default { return DEFAULT; }
-count { return COUNT; }
-controls { return CONTROLS; }
-same { return SAMESERVER; }
-sameserver { return SAMESERVER; }
-screen { return SCREEN; }
-line { return LINE; }
-percentage { return PERCENT; }
-ptrbtn { return PTRBTN ; }
-pointerbutton { return PTRBTN ; }
-
-action { return ACTION; }
-actions { return ACTIONS; }
-
-whichmodstate { return WHICHMODSTATE; }
-whichmodifierstate { return WHICHMODSTATE; }
-whichgroupstate { return WHICHGROUPSTATE; }
-
- /* Match state for indicator. */
-base { yylval.val = 0; return WHICHSTATE; }
-latched { yylval.val = 1; return WHICHSTATE; }
-locked { yylval.val = 4; return WHICHSTATE; }
-effective { yylval.val = 8; return WHICHSTATE; }
-
- /* Bits for binary controls. */
-repeatkeys { yylval.val = 0; return CONTROLFLAG; }
-autorepeat { yylval.val = 0; return CONTROLFLAG; }
-accessxkeys { yylval.val = 0; return CONTROLFLAG; }
-slowkeys { yylval.val = 0; return CONTROLFLAG; }
-bouncekeys { yylval.val = 0; return CONTROLFLAG; }
-stickykeys { yylval.val = 0; return CONTROLFLAG; }
-accessxtimeout { yylval.val = 0; return CONTROLFLAG; }
-accessxfeedback { yylval.val = 0; return CONTROLFLAG; }
-mousekeys { yylval.val = 0; return CONTROLFLAG; }
-mousekeysaccel { yylval.val = 0; return CONTROLFLAG; }
-audiblebell { yylval.val = 0; return CONTROLFLAG; }
-ignoregrouplock { yylval.val = 0; return CONTROLFLAG; }
-
-index { return INDEX; }
-name { return NAME; }
-symbols { return SYMBOLS; }
-key { return KEY; }
-
- /* Mouse buttons. */
-button1 { yylval.val = 1; return BUTTONNUM; }
-button2 { yylval.val = 2; return BUTTONNUM; }
-button3 { yylval.val = 3; return BUTTONNUM; }
-button4 { yylval.val = 4; return BUTTONNUM; }
-button5 { yylval.val = 5; return BUTTONNUM; }
-button { return BUTTON; }
-
- /* Fuzzyness. */
-any { return ANY; }
-all { return ALL; }
-none { return NONE; }
-
-defaultbutton { return DEFAULTBTN; }
-affect { return AFFECT; }
-
-allowexplicit { return ALLOWEXPLICIT; }
-
- /* Feedback to the keyboard. */
-driveskeyboard { return DRIVESKBD; }
-driveskbd { return DRIVESKBD; }
-ledsdrivekbd { return DRIVESKBD; }
-ledsdrivekeyboard { return DRIVESKBD; }
-indicatordriveskbd { return DRIVESKBD; }
-indicatordriveskeyboard { return DRIVESKBD; }
-
-
-modifier_map { return MODMAP; }
-minimum { return MINIMUM; }
-maximum { return MAXIMUM; }
-virtual { return VIRTUAL; }
-alias { return ALIAS; }
-indicator { return INDICATOR; }
-virtual_modifiers { return VMODS; }
-virtualmods { return VMODS; }
-vmods { return VMODS; }
-type { return TYPE; }
-data { return DATA; }
-modifiers { return MODS; }
-map { return MAP; }
-level_name { return LEVEL_NAME; }
-preserve { return PRESERVE; }
-
- /* Section flags. */
-partial { yylval.val = 1; return FLAGS; }
-complete { yylval.val = 2; return FLAGS; }
-fc { yylval.val = 4; return FLAGS; }
-fd { yylval.val = 8; return FLAGS; }
-cp { return XKBCOMPAT; }
-
- /* Section merge modes. */
-include { yylval.mergemode = defaultmm; return INCLUDE; }
-augment { yylval.mergemode = augment; return AUGMENT; }
-replace { yylval.mergemode = replace; return REPLACE; }
-override { yylval.mergemode = override; return OVERRIDE; }
-
-isolock { return ISOLOCK; }
-pointers { return POINTERS;}
-ptr { return POINTERS;}
-noaction { return NOACTION;}
-groupswrap { return GROUPSWRAP; }
-wrapgroups { return GROUPSWRAP; }
-clampgroups { return GROUPSCLAMP; }
-groupsredirect { return GROUPSREDIRECT; }
-overlay1 { yylval.val = 1; return OVERLAY; }
-overlay2 { yylval.val = 2; return OVERLAY; }
-
- /* String. */
-\"([^"]|\\\")*\" {
- yytext[strlen (yytext) - 1] = '\0';
- yylval.str = strdup (yytext + 1);
- return STR;
- }
- /* Ignore whitespace. */
-[ \t]*
- /* A keycode. */
-{KEYCODE} { yylval.str = strdup (yytext) + 1; yylval.str[strlen (yylval.str) - 1] = 0; return KEYCODE; }
- /* A float vlaue. */
-{FLOAT} { yylval.dbl = atof (yytext); return FLOAT; }
- /* An integer. */
-{NUM} { yylval.val = atoi (yytext); return NUM; }
- /* A hexadecimal value. */
-{HEX} { sscanf (yytext, "0x%X", &yylval.val); return HEX; }
- /* An identifier. */
-{IDENTIFIER} { yylval.str = strdup (yytext); return IDENTIFIER; }
- /* All unrecognized characters. */
-. { return yytext[0]; }
-%%
- /* Stupid hack, the current version of flex is fucked. */
- #define yytext_ptr yytext
-
- void
- scanner_unput (int c)
- {
- unput (c);
- }
-
- int
- yywrap (void)
- {
- if (close_include () == 0)
- return 0;
- else
- return 1;
- }
-
- #define MAX_INCLUDE_DEPTH 50
-
- /* An include file on the stack. */
- struct include_stack
- {
- YY_BUFFER_STATE buffer;
- mergemode merge_mode;
- int currline;
- char *filename;
- } include_stack[MAX_INCLUDE_DEPTH];
- int include_stack_ptr = 0;
-
- /* Add an file to the stack. */
- void
- include_file (FILE *file, mergemode new_mm, char *fname)
- {
- YY_BUFFER_STATE buffer;
-
- debug_printf ("including file %s\n.", fname);
-
- if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
- {
- fprintf (stderr, "Includes nested too deeply\n");
- exit (EXIT_FAILURE);
- }
-
- include_stack[include_stack_ptr].filename = filename;
- include_stack[include_stack_ptr].currline = lineno;
- include_stack[include_stack_ptr].merge_mode = merge_mode;
- include_stack[include_stack_ptr++].buffer = YY_CURRENT_BUFFER;
- filename = fname;
- lineno = 1;
- merge_mode = new_mm;
-
- buffer = yy_create_buffer (file, YY_BUF_SIZE);
- yy_switch_to_buffer (buffer);
- }
-
- /* Close an includefile. returns 0 on success */
- int
- close_include (void)
- {
- if ( --include_stack_ptr < 0 )
- {
- fprintf (stderr, "Unexpected end of file at %s:%d.\n", filename, lineno);
- return (1);
- }
- else
- {
- fclose (yyin);
- yy_delete_buffer (YY_CURRENT_BUFFER);
- merge_mode = include_stack[include_stack_ptr].merge_mode;
- lineno = include_stack[include_stack_ptr].currline;
- filename = include_stack[include_stack_ptr].filename;
- yy_switch_to_buffer (include_stack[include_stack_ptr].buffer);
- debug_printf ("closing file. going back to %s.\n", filename);
- return (0);
- }
- }
-
- void
- yyerror (char *s)
- {
- fprintf (stderr, "%s:%d: %s\n", filename, lineno, s);
- // error_at_line (0, 1, filename, lineno, "foo %d\n", 2);
- }
-
- int
- scanner_get_current_location(void)
- {
- return lineno;
- }
-
- const char*
- scanner_get_current_file(void)
- {
- return filename;
- }
diff --git a/console-client/xkb/parser.y b/console-client/xkb/parser.y
deleted file mode 100644
index c8ba404e..00000000
--- a/console-client/xkb/parser.y
+++ /dev/null
@@ -1,1605 +0,0 @@
-/* parser.y -- XKB parser.
-
- Copyright (C) 2003, 2004 Marco Gerards
-
- Written by Marco Gerards <marco@student.han.nl>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details. */
-
-%{
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include "xkb.h"
-
-void yyerror(char *);
-int yylex (void);
-static error_t include_section (char *incl, int sectionsymbol, char *dirname,
- mergemode);
-static error_t include_sections (char *incl, int sectionsymbol, char *dirname,
- mergemode);
-void close_include (void);
-static void skipsection (void);
-static error_t set_default_action (struct xkb_action *, struct xkb_action **);
-static void key_set_keysym (struct key *key, group_t group, int level,
- symbol ks);
-static void key_new (char *keyname);
-static void key_delete (char *keyname);
-void scanner_unput (int c);
-static void remove_symbols (struct key *key, group_t group);
-
-struct xkb_interpret *current_interpretation;
-struct xkb_action *current_action;
-struct xkb_indicator indi;
-struct xkb_indicator *current_indicator = &indi;
-struct key defkey;
-struct key *default_key = &defkey;
-
-/* The default settings for actions. */
-struct xkb_action default_setmods = { SA_SetMods };
-struct xkb_action default_lockmods = { SA_LockMods };
-struct xkb_action default_latchmods = { SA_LatchMods };
-struct xkb_action default_setgroup = { SA_SetGroup };
-struct xkb_action default_latchgroup = { SA_LatchGroup };
-struct xkb_action default_lockgroup = { SA_LockGroup };
-struct xkb_action default_moveptr = { SA_MovePtr };
-struct xkb_action default_ptrbtn = { SA_PtrBtn };
-struct xkb_action default_lockptrbtn = { SA_LockPtrBtn };
-struct xkb_action default_ptrdflt = { SA_SetPtrDflt };
-struct xkb_action default_setcontrols = { SA_SetControls };
-struct xkb_action default_lockcontrols = { SA_LockControls };
-struct xkb_action default_isolock = { SA_ISOLock };
-struct xkb_action default_switchscrn = { SA_SwitchScreen };
-struct xkb_action default_consscroll = { SA_ConsScroll };
-
-static struct key *current_key;
-
-/* The dummy gets used when the original may not be overwritten. */
-static struct key dummy_key;
-
-/* The current parsed group. */
-static int current_group;
-static int current_rmod = 0;
-
-/* The current symbol in the currently parsed key. */
-static int symbolcnt;
-static int actioncnt;
-
-mergemode merge_mode = override;
-
-//#define YYDEBUG 1
-
-#ifndef YY_NULL
-#define YY_NULL 0
-#endif
-
-static struct keytype *current_keytype;
-%}
-
-%union {
- int val;
- char *str;
- modmap_t modmap;
- struct xkb_action *action;
- double dbl;
- mergemode mergemode;
-}
-
-%token XKBKEYMAP "xkb_keymap"
-%token XKBKEYCODES "xkb_keycodes"
-%token XKBCOMPAT "xkb_compatibility"
-%token XKBGEOMETRY "xkb_geometry"
-%token XKBTYPES "xkb_types"
-%token XKBSYMBOLS "xkb_symbols"
-%token STR
-%token HEX
-%token FLAGS
-%token KEYCODE
-%token NUM
-%token MINIMUM "minimum"
-%token MAXIMUM "maximum"
-%token VIRTUAL "virtual"
-%token INDICATOR "indicator"
-%token ALIAS "alias"
-%token IDENTIFIER
-%token VMODS "virtualmods"
-%token TYPE "type"
-%token DATA "data"
-%token MAP "map"
-%token LEVEL_NAME "level_name"
-%token PRESERVE "preserve"
-%token LEVEL
-%token USEMODMAP "usemodmap"
-%token REPEAT "repeat"
-%token LOCKING "locking"
-%token VIRTUALMODIFIER "virtualmod"
-%token BOOLEAN
-%token INTERPRET "interpret"
-%token INTERPMATCH
-%token CLEARLOCKS "clearlocks"
-%token MODS "mods"
-%token SETMODS "setmods"
-%token LATCHMODS "latchmods"
-%token LOCKMODS "lockmods"
-%token ACTION "action"
-%token LATCHTOLOCK "latchtolock"
-%token GROUP "group"
-%token GROUPS "groups"
-%token SETGROUP "setgroup"
-%token LATCHGROUP "latchgroup"
-%token LOCKGROUP "lockgroup"
-%token ACCEL "accel"
-%token MOVEPTR "moveptr"
-%token PRIVATE "private"
-%token BUTTON "button"
-%token BUTTONNUM
-%token DEFAULT "default"
-%token COUNT "count"
-%token PTRBTN "ptrbtn"
-%token DEFAULTBTN "defaultbutton"
-%token ALL "all"
-%token NONE "none"
-%token ANY "any"
-%token CONTROLFLAG
-%token AFFECT "affect"
-%token PTRDFLT "setptrdflt"
-%token LOCKPTRBTN "lockptrbtn"
-%token SETCONTROLS "setcontrols"
-%token LOCKCONTROLS "lockcontrols"
-%token CONTROLS "controls"
-%token TERMINATE "terminate"
-%token WHICHMODSTATE "whichmodstate"
-%token WHICHGROUPSTATE "whichgroupstate"
-%token WHICHSTATE "whichstate"
-%token INDEX "index"
-%token ALLOWEXPLICIT "allowexplicit"
-%token DRIVESKBD "driveskbd"
-//%token AFFECTBTNLOCK
-%token SYMBOLS "symbols"
-%token NAME "name"
-%token GROUPNUM
-%token ACTIONS "actions"
-%token KEY "key"
-%token MODMAP "modifier_map"
-%token SHIFT "shift"
-%token LOCK "lock"
-%token CONTROL "control"
-%token MOD1 "mod1"
-%token MOD2 "mod2"
-%token MOD3 "mod3"
-%token MOD4 "mod4"
-%token MOD5 "mod5"
-%token UNLOCK "unlock"
-%token BOTH "both"
-%token NEITHER "neither"
-
-%token INCLUDE "include"
-%token AUGMENT "augment"
-%token OVERRIDE "override"
-%token REPLACE "replace"
-
-
-%token ISOLOCK "isolock"
-%token POINTERS "pointers"
-%token NOACTION "noaction"
-%token GROUPSWRAP "groupswrap"
-%token GROUPSCLAMP "groupsclamp"
-%token GROUPSREDIRECT "groupsredirect"
-%token OVERLAY "overlay"
-%token SWITCHSCREEN "switchscreen"
-%token SAMESERVER "sameserver"
-%token SCREEN "screen"
-%token LINE "line"
-%token PERCENT "percent"
-%token CONSSCROLL "consscroll"
-%token FLOAT "float"
-%type <str> STR KEYCODE IDENTIFIER
-%type <val> FLAGS NUM HEX vmod level LEVEL rmod BOOLEAN symbol INTERPMATCH
-%type <val> clearlocks usemodmap latchtolock noaccel button BUTTONNUM
-%type <val> ctrlflags allowexplicit driveskbd
-%type <val> DRIVESKBD GROUPNUM group symbolname groups whichstate WHICHSTATE
-/* Booleans */
-%type <val> locking repeat groupswrap groupsclamp sameserver
-%type <modmap> mods
-%type <action> action
-%type <action> ctrlparams
-%type <mergemode> include
-%type <dbl> FLOAT
-//%debug
-
-%%
-/* A XKB keymap. */
-xkbkeymap:
- "xkb_keymap" '{' keymap '}' ';' { YYACCEPT; }
-| "xkb_keymap" STR '{' keymap '}' ';' { YYACCEPT; }
-| '{' keymap '}' { YYACCEPT; } ';'
-;
-
-/* A XKB configuration has many sections. */
-keymap:
- /* empty */
-| keymap types
-| keymap keycodes
-| keymap compat
-| keymap symbols
-| keymap geometry
-;
-
-include:
- "include" { $$ = defaultmm; }
-| "augment" { $$ = augment; }
-| "replace" { $$ = replace; }
-| "override" { $$= override; }
-;
-
-/* All flags assigned to a section. */
-flags:
- /* empty */
-| flags FLAGS
-;
-
-/* The header of a keycode section. */
-keycodes:
- flags "xkb_keycodes" '{' keycodesect '}' ';'
-| flags "xkb_keycodes" STR '{' keycodesect '}' ';'
-;
-
-/* Process the includes on the stack. */
-keycodesinclude:
- '{' keycodesect '}' { close_include (); }
-| keycodesinclude '{' keycodesect '}' { close_include (); }
-;
-
-/* The first lines of a keycode section. The amount of keycodes are
- declared here. */
-keycodesect:
-/* empty */
-| "minimum" '=' NUM ';' keycodesect
- {
- min_keys = $3;
- debug_printf ("working on key: %d\n", $3);
- current_key = &keys[$3];
- }
-| MAXIMUM '=' NUM ';' keycodesect
- {
- max_keys = $3;
- keys = calloc ($3, sizeof (struct key));
- }
-| KEYCODE '=' NUM ';'
- { keyname_add ($1, $3); }
- keycodesect
-| "replace" KEYCODE '=' NUM ';'
- { keyname_add ($2, $4); }
- keycodesect
-| "indicator" NUM '=' STR ';' keycodesect { }
-| "virtual" INDICATOR NUM '=' STR ';' keycodesect
-| "alias" KEYCODE '=' KEYCODE ';'
- {
- keycode_t key = keyname_find ($4);
- if (key)
- keyname_add ($2, key);
- else
- {
- key = keyname_find ($2);
- if (key)
- keyname_add ($4, key);
- }
- }
- keycodesect
-| include STR
- { include_sections ($2, XKBKEYCODES, "keycodes", $1); }
- keycodesinclude keycodesect
-;
-
-/* The header of a keytypes section. */
-types:
- flags "xkb_types" '{' typessect '}' ';'
-| flags "xkb_types" STR '{' typessect '}' ';'
-;
-
-/* A list of virtual modifier declarations (see vmods_def), separated
- by commas. */
-vmodslist:
- IDENTIFIER { vmod_add ($1); }
-| vmodslist ',' IDENTIFIER { vmod_add ($3); }
-;
-
-/* Virtual modifiers must be declared before they can be used. */
-vmods_def:
- "virtualmods" vmodslist ';'
-;
-
-/* Return the number of the virtual modifier. */
-vmod:
- IDENTIFIER
- { if (($$ = vmod_find ($1)) != 0)
- $$ = 1 << ($$ - 1);
- else
- fprintf(stderr, "warning: %s virtual modifier is not defined.", $1);
- }
-;
-
-/* A single realmodifier. */
-rmod:
- "shift" { $$ = RMOD_SHIFT; }
-| "lock" { $$ = RMOD_LOCK; }
-| "control" { $$ = RMOD_CTRL; }
-| "mod1" { $$ = RMOD_MOD1; }
-| "mod2" { $$ = RMOD_MOD2; }
-| "mod3" { $$ = RMOD_MOD3; }
-| "mod4" { $$ = RMOD_MOD4; }
-| "mod5" { $$ = RMOD_MOD5; }
-;
-
-/* One of more modifiers, separated by '+'. A modmap_t will return all real
- and virtual modifiers specified. */
-mods:
- mods '+' rmod { $$.rmods = $1.rmods | $3; }
-| mods '+' vmod { $$.vmods = $1.vmods | $3; }
- /* Use a mid-rule action to start with no modifiers. */
-| { $<modmap>$.rmods = 0; $<modmap>$.vmods = 0; } rmod { $$.rmods = $2; }
-| { $<modmap>$.rmods = 0; $<modmap>$.vmods = 0; } vmod { $$.vmods = $2; }
-| "all" { $$.rmods = 0xFF; $$.vmods = 0xFFFF; }
-| "none" { $$.rmods = 0; $$.vmods = 0; }
-;
-
-/* The numeric level starts with 0. Level1-Level4 returns 0-3, also
- numeric values can be used to describe a level. */
-level:
- LEVEL { $$ = $1 - 1; }
-| "any" { $$ = 0; }
-| NUM { $$ = $1 - 1; }
-;
-
-/* A single keytype. */
-type:
- /* Empty */
-| type MODS '=' mods ';'
- { current_keytype->modmask = $4; }
-| type MAP '[' mods ']' '=' level ';'
- { keytype_mapadd (current_keytype, $4, $7); }
-| type "level_name" '[' level ']' '=' STR ';'
-| type "preserve" '[' mods ']' '=' mods ';'
- { keytype_preserve_add (current_keytype, $4, $7); }
-;
-
-/* Process the includes on the stack. */
-typesinclude:
- '{' typessect '}' { close_include (); }
-| typesinclude '{' typessect '}' { close_include (); }
-;
-
-/* A keytype section contains keytypes and virtual modifier declarations. */
-typessect:
- /* Empty */
-| typessect vmods_def
-| typessect TYPE STR { keytype_new ($3, &current_keytype); }'{' type '}' ';' { }
-| typessect include STR
- { include_sections ($3, XKBTYPES, "types", $2); }
- typesinclude
-;
-
-/* The header of a compatibility section. */
-compat:
- flags "xkb_compatibility" '{' compatsect '}' ';'
-| flags "xkb_compatibility" STR '{' compatsect '}' ';'
-;
-
-/* XXX: A symbol can be more than just an identifier (hex). */
-symbol:
- IDENTIFIER { $$ = (int) XStringToKeysym ( $1) ? : -1; }
-| ANY { $$ = 0; }
-| error { yyerror ("Invalid symbol."); }
-;
-
-/* Which kinds of modifiers (like base, locked, etc.) can affect the
- indicator. */
-whichstate:
- WHICHSTATE { $$ = $1; }
-| "none" { $$ = 0; }
-| "any" { $$ = 0xff; } /* XXX */
-;
-
-/* The groups that can affect a indicator. */
-groups:
- groups '+' group
-| groups '-' group
-| group {}
-| "all" { $$ = 0xff; } /* XXX */
-;
-
-indicators:
-/* empty */
-| indicators indicator
-;
-
-/* An indicator desciption. */
-indicator:
- "mods" '=' mods ';' { current_indicator->modmap = $3; }
-| "groups" '=' groups ';' { current_indicator->groups = $3; }
-| "controls" '=' ctrls ';'
-| "whichmodstate" '=' whichstate ';' { current_indicator->which_mods = $3; }
-| "whichgroupstate" '=' whichstate ';' { current_indicator->which_mods = $3; }
-| allowexplicit ';' {} /* Ignored for now. */
-| driveskbd ';' {}
-| "index" '=' NUM ';' {}
-;
-
-/* Boolean for allowexplicit. */
-allowexplicit:
- '~' "allowexplicit" { $$ = 0; }
-| '!' "allowexplicit" { $$ = 0; }
-| "allowexplicit" { $$ = 1; }
-| "allowexplicit" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for driveskbd. */
-driveskbd:
- '~' "driveskbd" { $$ = 0; }
-| '!' "driveskbd" { $$ = 0; }
-| "driveskbd" { $$ = 1; }
-| "driveskbd" '=' BOOLEAN { $$ = $3; }
-;
-
-interprets:
- /* Empty */
-| interprets interpret
-;
-
-/* A single interpretation. */
-interpret:
- "usemodmap" '=' level ';'
- { current_interpretation->match &= 0x7F | ($3 << 7); } /* XXX */
-| repeat ';'
- {
- current_interpretation->flags &= ~(KEYREPEAT | KEYNOREPEAT);
- current_interpretation->flags |= $1;
- }
-| locking ';' {}
-| "virtualmod" '=' vmod ';' { current_interpretation->vmod = $3; }
-| "action" '=' action ';'
- {
- memcpy (&current_interpretation->action, $3, sizeof (xkb_action_t));
- free ($3);
- }
-;
-
-/* Process the includes on the stack. */
-compatinclude:
- '{' compatsect '}' { close_include (); }
-| compatinclude '{' compatsect '}' { close_include (); }
-;
-
-/* The body of a compatibility section. */
-compatsect:
- /* Empty */
-| compatsect vmods_def
-| compatsect "interpret" '.'
- { current_interpretation = &default_interpretation; }
- interpret
-| compatsect "interpret" symbol
- {
- if ($3 != -1)
- {
- interpret_new (&current_interpretation, $3);
- current_interpretation->match |= 1;
- }
- }
- '{' interprets '}' ';'
-| compatsect "interpret" symbol '+' rmod
- {
- if ($3 != -1)
- {
- interpret_new (&current_interpretation, $3);
- current_interpretation->rmods = $5;
- current_interpretation->match |= 4;
- }
- }
- '{' interprets '}' ';'
-| compatsect "interpret" symbol '+' "any"
- {
- if ($3 != -1)
- {
- interpret_new (&current_interpretation, $3);
- current_interpretation->rmods = 255;
- current_interpretation->match |= 2;
- }
- }
- '{' interprets '}' ';'
-| compatsect "interpret" symbol '+' INTERPMATCH '(' mods ')'
- {
- if ($3 != -1)
- {
- interpret_new (&current_interpretation, $3);
- current_interpretation->rmods = $7.rmods;
- current_interpretation->match |= $5;
- }
- }
- '{' interprets '}' ';'
-| compatsect GROUP NUM '=' mods ';'
-| compatsect "indicator" STR '{' indicators '}' ';'
-| compatsect include STR
- { include_sections ($3, XKBCOMPAT, "compat", $2); }
- compatinclude
-| compatsect actiondef
-| compatsect "indicator" '.' indicator
-;
-
-
- /* Booleans */
-/* Boolean for clearlocks. */
-clearlocks:
- '~' "clearlocks" { $$ = 0; }
-| '!' "clearlocks" { $$ = 0; }
-| "clearlocks" { $$ = 1; }
-| "clearlocks" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for latchtolock. */
-latchtolock:
- '~' "latchtolock" { $$ = 0; }
-| '!' "latchtolock" { $$ = 0; }
-| "latchtolock" { $$ = 1; }
-| "latchtolock" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for useModMap. */
-usemodmap:
- '~' "usemodmap" { $$ = 0; }
-| '!' "usemodmap" { $$ = 0; }
-| "usemodmap" { $$ = 1; }
-| "usemodmap" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for locking. */
-locking:
- '~' "locking" { $$ = 0; }
-| '!' "locking" { $$ = 0; }
-| "locking" { $$ = 1; }
-| "locking" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for repeat. */
-repeat:
- '~' "repeat" { $$ = KEYNOREPEAT; }
-| '!' "repeat" { $$ = KEYNOREPEAT; }
-| "repeat" { $$ = KEYREPEAT; }
-| "repeat" '=' BOOLEAN
- {
- if ($3)
- $$ = KEYREPEAT;
- else
- $$ = KEYNOREPEAT;
- }
-;
-
-/* Boolean for groupswrap. */
-groupswrap:
- '~' "groupswrap" { $$ = 0; }
-| '!' "groupswrap" { $$ = 0; }
-| "groupswrap" { $$ = 1; }
-| "groupswrap" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for groupsclamp. */
-groupsclamp:
- '~' "groupsclamp" { $$ = 0; }
-| '!' "groupsclamp" { $$ = 0; }
-| "groupsclamp" { $$ = 1; }
-| "groupsclamp" '=' BOOLEAN { $$ = $3; }
-;
-
-/* Boolean for noaccel. */
-noaccel:
- '~' "accel" { $$ = 0; }
-| '!' "accel" { $$ = 0; }
-| "accel" { $$ = 1; }
-| "accel" '=' BOOLEAN { $$ = $3; }
-;
-
-
-sameserver:
- '~' "sameserver" { $$ = 0; }
-| '!' "sameserver" { $$ = 0; }
-| "sameserver" { $$ = 1; }
-| "sameserver" '=' BOOLEAN { $$ = $3; }
-;
-
-setmodsparams:
- /* empty */
-| setmodsparam
-| setmodsparams ',' setmodsparam
-;
-
-
-/* Parameter for the (Set|Lock|Latch)Mods action. */
-setmodsparam:
- "mods" '=' mods
- {
- ((action_setmods_t *) current_action)->modmap = $3;
- }
-| "mods" '=' "usemodmap"
- { ((action_setmods_t *) current_action)->flags |= useModMap;
- }
-| clearlocks
- {
- ((action_setmods_t *) current_action)->flags &= ~clearLocks;
- ((action_setmods_t *) current_action)->flags |= $1;
- }
-| usemodmap
- {
- ((action_setmods_t *) current_action)->flags &= ~useModMap;
- ((action_setmods_t *) current_action)->flags |= $1;
- }
-| latchtolock
- {
- ((action_setmods_t *) current_action)->flags &= ~latchToLock;
- ((action_setmods_t *) current_action)->flags |= $1;
- }
-;
-
-setgroupparams:
-/* empty */
-| setgroupparam
-| setgroupparams ',' setgroupparam
-;
-
-/* Parameter for the (Set|Lock|Latch)Group action. */
-setgroupparam:
- "group" '=' NUM
- {
- ((action_setgroup_t *) current_action)->group = $3;
- ((action_setgroup_t *) current_action)->flags |= groupAbsolute;
- }
-| "group" '=' '+' NUM
- {
- ((action_setgroup_t *) current_action)->group = $4;
- }
-| "group" '=' '-' NUM
- {
- ((action_setgroup_t *) current_action)->group = -$4;
- }
-| clearlocks
- {
- ((action_setgroup_t *) current_action)->flags |= $1;
- }
-| latchtolock
- {
- ((action_setgroup_t *) current_action)->flags |= $1;
- }
-;
-
-moveptrparams:
-/* empty */
-| moveptrparam
-| moveptrparams ',' moveptrparam
-;
-
-/* Parameters for the MovePtr action. */
-moveptrparam:
- IDENTIFIER '=' NUM
- {
- ((action_moveptr_t *) current_action)->x = $3;
- ((action_setgroup_t *) current_action)->flags |= MoveAbsoluteX;
- }
-| IDENTIFIER '=' '+' NUM
- {
- ((action_moveptr_t *) current_action)->x = $4;
- }
-| IDENTIFIER '=' '-' NUM
- {
- ((action_moveptr_t *) current_action)->x = -$4;
- }
-| noaccel
- {
- ((action_moveptr_t *) current_action)->flags |= NoAcceleration;
- }
-;
-
-/* A mouse button. */
-button:
- NUM { $$ = $1; }
-| BUTTONNUM { $$ = $1; }
-| "default" { $$ = 0; }
-;
-
-affectbtnlock:
- "lock"
-| "unlock"
-| "both"
-| "neither"
-;
-
-ptrbtnparams:
- /* empty */
-| ptrbtnparam
-| ptrbtnparams ',' ptrbtnparam
-;
-
-/* Parameters for the (Set|Lock|Latch)PtrBtn action. */
-ptrbtnparam:
- "button" '=' button
- { ((action_ptrbtn_t *) current_action)->button = $3; }
-| "count" '=' NUM
- { ((action_ptrbtn_t *) current_action)->count = $3; }
-| "affect" '=' affectbtnlock
- {
- // ((action_ptrbtn_t *) $$)->a = $3;
- }
-;
-
-/* XXX: This should be extended. */
-affectbtns:
- "defaultbutton"
-| "button"
-| "all"
-;
-
-ptrdfltparams:
-/* empty */
-| ptrdfltparam
-| ptrdfltparams ',' ptrdfltparam
-;
-
-/* Parameters for the SetPtrDflt action. */
-ptrdfltparam:
- "button" '=' button { }
-| "button" '=' '+' button { }
-| "button" '=' '-' button { }
-| "affect" '=' affectbtns { }
-;
-
-/* A list of controlflags. */
-ctrls:
- ctrls '+' CONTROLFLAG// { $$ |= $3; }
-| CONTROLFLAG// { $$ = $1; }
-| OVERLAY
-;
-
-/* Modified controlflags. */
-ctrlflags:
- ctrls { /*$$ = $1;*/ }
-| "all" { $$ = 0xFFFF; }
-| "none" { $$ = 0; }
-;
-
-/* The parameters of a (Set|Lock|Latch)Ctrls Action. */
-ctrlparams:
- "controls" '=' ctrlflags
- { /* ((action_setcontrols_t *) $$)->controls = $3; */ }
-;
-
-isoaffect:
- "mods"
-| "groups"
-| "controls"
-| "pointers"
-| "all"
-| "none"
-;
-
-isolockparams:
-/* empty */
-| isolockparam
-| isolockparams ',' isolockparam
-;
-
-/* Parameters for the ISOLock action. */
-isolockparam:
- "mods" '=' mods
-| "mods" '=' USEMODMAP
-| "group" '=' group
-| "controls" '=' ctrlflags
-| "affect" '=' isoaffect
-;
-
-switchscrnparams:
- switchscrnparam
- | switchscrnparams ',' switchscrnparam
-;
-
-/* Parameters for the SwitchScreen action. */
-switchscrnparam:
- "screen" '=' NUM
- {
- ((action_switchscrn_t *) current_action)->screen = $3;
- ((action_switchscrn_t *) current_action)->flags |= screenAbs;
- }
-| "screen" '+' '=' NUM
- {
- ((action_switchscrn_t *) current_action)->screen = $4;
- }
-| "screen" '-' '=' NUM
- {
- ((action_switchscrn_t *) current_action)->screen = -$4;
- }
-| sameserver
- {
- /* XXX: Implement this. */
-/* ((action_switchscrn_t *) current_action)->flags &= ~0; */
-/* ((action_switchscrn_t *) current_action)->flags |= $1; */
- }
-;
-
-consscrollparams:
- consscrollparam
- | consscrollparams ',' consscrollparam
-;
-
-/* Parameters for the ConsScroll action. */
-consscrollparam:
- "screen" '+' '=' FLOAT
- {
- ((action_consscroll_t *) current_action)->screen = $4;
- }
-| "screen" '-' '=' FLOAT
- {
- ((action_consscroll_t *) current_action)->screen = -$4;
- }
-| "line" '=' NUM
- {
- ((action_consscroll_t *) current_action)->line = $3;
- ((action_consscroll_t *) current_action)->flags |= lineAbs;
- }
-| "line" '+' '=' NUM
- {
- ((action_consscroll_t *) current_action)->line = $4;
- }
-| "line" '-' '=' NUM
- {
- ((action_consscroll_t *) current_action)->line = -$4;
- }
-| "percent" '=' NUM
- {
- ((action_consscroll_t *) current_action)->percent = $3;
- ((action_consscroll_t *) current_action)->flags |= usePercentage;
- }
-;
-
-privateparams:
- /* empty */
- | privateparam
- | privateparams ',' privateparam
-;
-
-privateparam:
- "type" '=' HEX
- {
- }
-| "data" '=' STR
- {
- }
-;
-
-/* An action definition. */
-action:
- "setmods"
- {
- if (set_default_action (&default_setmods, &current_action))
- YYABORT;
- }
- '(' setmodsparams ')' { $$ = current_action; }
-| "latchmods"
- {
- if (set_default_action (&default_latchmods, &current_action))
- YYABORT;
- }
- '(' setmodsparams ')' { $$ = current_action; }
-| "lockmods"
- {
- if (set_default_action (&default_lockmods, &current_action))
- YYABORT;
- }
- '(' setmodsparams ')' { $$ = current_action; }
-| "setgroup"
- {
- if (set_default_action (&default_setgroup, &current_action))
- YYABORT;
- }
- '(' setgroupparams ')' { $$ = current_action; }
-| "latchgroup"
- {
- if (set_default_action (&default_latchgroup, &current_action))
- YYABORT;
- }
- '(' setgroupparams ')' { $$ = current_action; }
-| "lockgroup"
- {
- if (set_default_action (&default_lockgroup, &current_action))
- YYABORT;
- }
- '(' setgroupparams ')' { $$ = current_action; }
-| "moveptr"
- {
- if (set_default_action (&default_moveptr, &current_action))
- YYABORT;
- }
- '(' moveptrparams ')' { $$ = current_action; }
-| "ptrbtn"
- {
- if (set_default_action (&default_ptrbtn, &current_action))
- YYABORT;
- }
- '(' ptrbtnparams ')' { $$ = current_action; }
-| "lockptrbtn"
- {
- if (set_default_action (&default_lockptrbtn, &current_action))
- YYABORT;
- }
- '(' ptrbtnparams ')' { $$ = current_action; }
-| "setptrdflt"
- {
- if (set_default_action (&default_ptrdflt, &current_action))
- YYABORT;
- }
- '(' ptrdfltparams ')' { $$ = current_action; }
-| "setcontrols"
- {
- if (set_default_action (&default_setcontrols, &current_action))
- YYABORT;
- }
- '(' ctrlparams ')' { $$ = current_action; }
-| "lockcontrols"
- {
- if (set_default_action (&default_lockcontrols, &current_action))
- YYABORT;
- }
- '(' ctrlparams ')' { $$ = current_action; }
-| "terminate" '(' ')'
- { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_TerminateServer; }
-| "switchscreen"
- {
- if (set_default_action (&default_switchscrn, &current_action))
- YYABORT;
- }
-'(' switchscrnparams ')' { $$ = current_action; }
-| "consscroll"
- {
- if (set_default_action (&default_consscroll, &current_action))
- YYABORT;
- }
- '(' consscrollparams ')' { $$ = current_action; }
-| "isolock"
- {
- if (set_default_action (&default_isolock, &current_action))
- YYABORT;
- }
- '(' isolockparams ')' { $$ = current_action; }
-| "private" '(' privateparams ')'
- { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction; }
-| "noaction" '(' ')'
- { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_NoAction; }
-| error ')' { yyerror ("Invalid action\n"); }
-;
-
-/* Define values for default actions. */
-actiondef:
- "setmods" '.' { current_action = &default_setmods; } setmodsparam ';'
-| "latchmods" '.' { current_action = &default_latchmods; } setmodsparam ';'
-| "lockmods" '.' { current_action = &default_lockmods; } setmodsparam ';'
-| "setgroup" '.' { current_action = &default_setgroup; } setgroupparam ';'
-| "latchgroup" '.' { current_action = &default_latchgroup; } setgroupparam ';'
-| "lockgroup" '.' { current_action = &default_lockgroup; } setgroupparam ';'
-| "moveptr" '.' { current_action = &default_moveptr; } moveptrparam ';'
-| "ptrbtn" '.' { current_action = &default_ptrbtn; } ptrbtnparam ';'
-| "lockptrbtn" '.' { current_action = &default_lockptrbtn; } ptrbtnparam ';'
-| "setptrdflt" '.' { current_action = &default_ptrdflt; } ptrdfltparam ';'
-| "setcontrols" '.' { current_action = &default_setcontrols; } ctrlparams ';'
-| "lockcontrols" '.' { current_action = &default_lockcontrols; } ctrlparams ';'
-| "isolock" '.' { current_action = &default_isolock; } isolockparam ';'
-| "switchscreen" '.' { current_action = &default_switchscrn; } switchscrnparam ';'
-;
-
-/* The header of a symbols section. */
-symbols:
- flags "xkb_symbols" '{' symbolssect '}' ';'
-| flags "xkb_symbols" STR '{' symbolssect '}' ';'
-;
-
-/* A group. */
-group:
- GROUPNUM { $$ = $1 - 1; }
-| NUM { $$ = $1 - 1; }
-| HEX { $$ = $1 - 1; }
-;
-
-/* A list of keysyms and keycodes bound to a realmodifier. */
-key_list:
- key_list ',' KEYCODE { set_rmod_keycode ($3, current_rmod); }
-| key_list ',' symbolname { ksrm_add ($3, current_rmod); }
-| KEYCODE { set_rmod_keycode ($1, current_rmod); }
-| symbolname { ksrm_add ($1, current_rmod); }
-;
-
-/* Process the includes on the stack. */
-symbolinclude:
- '{' symbolssect '}' { close_include (); }
-| symbolinclude '{' symbolssect '}' { close_include (); }
-;
-
-/* A XKB symbol section. It is used to bind keysymbols, actions and
- realmodifiers to keycodes. */
-symbolssect:
- /* Empty */
-| symbolssect vmods_def
-| symbolssect NAME '[' group ']' '=' STR ';'
-| symbolssect "key" KEYCODE
- {
- key_new ($3);
- current_group = 0;
- } '{' keydescs '}' ';'
-| symbolssect "replace" "key" KEYCODE
- {
- key_delete ($4);
- key_new ($4);
- current_group = 0;
- } '{' keydescs '}' ';'
-| symbolssect "override" "key" KEYCODE
- {
- key_delete ($4);
- key_new ($4);
- current_group = 0;
- } '{' keydescs '}' ';'
-| symbolssect "modifier_map" rmod { current_rmod = $3; } '{' key_list '}' ';'
-| symbolssect include STR
- { include_sections ($3, XKBSYMBOLS, "symbols", $2); }
- symbolinclude
-| symbolssect actiondef
-| symbolssect "key" '.' {debug_printf ("working on default key.\n"); current_key = default_key; } keydesc ';'
-| symbolssect error ';' { yyerror ("Error in symbol section\n"); }
-;
-
-/* Returns a keysymbols, the numberic representation. */
-symbolname:
- IDENTIFIER { $$ = XStringToKeysym ($1); }
-| NUM
- {
- if (($1 >= 0) && ($1 < 10))
- $$ = $1 + '0';
- else
- $$ = $1;
- }
-| HEX { $$ = $1; }
-;
-
-/* None or more keysyms, assigned to a single group of the current
- key. */
-groupsyms:
- /* empty */
-| groupsyms ',' symbolname
- { key_set_keysym (current_key, current_group, symbolcnt++, $3); }
-| { symbolcnt = 0; } symbolname
- {
- symbolcnt = 0;
- key_set_keysym (current_key, current_group, symbolcnt++, $2);
- }
-;
-
-/* A list of actions. */
-actions:
- actions ',' action
- { key_set_action (current_key, current_group, actioncnt++, $3); }
-| { actioncnt = 0; } action
- { key_set_action ( current_key, current_group, actioncnt++, $2); }
-;
-
-keydescs:
- keydesc
-| keydescs ',' keydesc
-;
-
-/* A single key and everything assigned to it. */
-keydesc:
- "type" '[' group ']' '=' STR
- {
- current_key->groups[$3].keytype = keytype_find ($6);
- }
-| "type" '[' error ']' { yyerror ("Invalid group.\n"); }
-| "type" '=' STR
- { current_key->groups[current_group].keytype = keytype_find ($3); }
-| { symbolcnt = 0; } "symbols" '[' group ']' { current_group = $4; } '=' '[' groupsyms ']'
- {
- current_key->numgroups = ($4 + 1) > current_key->numgroups ?
- ($4 + 1) : current_key->numgroups;
- }
-| {actioncnt = 0; } "actions" '[' group ']' { current_group = $4; } '=' '[' actions ']'
- {
- current_key->numgroups = ($4 + 1) > current_key->numgroups ?
- ($4 + 1) : current_key->numgroups;
- }
-| "virtualmods" '=' mods
- { current_key->mods.vmods = $3.vmods; }
-| '[' groupsyms ']'
- {
- current_group++;
- current_key->numgroups = current_group > current_key->numgroups ?
- current_group : current_key->numgroups;
- }
-| '[' actions ']'
- {
- current_group++;
- current_key->numgroups = current_group > current_key->numgroups ?
- current_group : current_key->numgroups;
- }
-| locking {}/* This is not implemented - YET. */
-/* XXX: There 3 features are described in Ivan Pascals docs about XKB,
- but aren't used in the standard keymaps and cannot be used because it
- cannot be stored in the XKM dataformat. */
-| groupswrap {}
-| groupsclamp {}
-| "groupsredirect" '=' NUM
-| "overlay" '=' KEYCODE /* If you _REALLY_ need overlays, mail me!!!! */
-| repeat
- {
- current_key->flags &= ~(KEYREPEAT | KEYNOREPEAT);
- current_key->flags |= $1;
- }
-;
-
-/* The geometry map is ignored. */
-
-/* The header of a geometry section. */
-geometry:
- flags "xkb_geometry" '{' { skipsection (); } '}' ';'
-| flags "xkb_geometry" STR '{' { skipsection (); } '}' ';'
-;
-
-%%
-/* Skip all tokens until a section of the type SECTIONSYMBOL with the
- name SECTIONNAME is found. */
-static int
-skip_to_sectionname (char *sectionname, int sectionsymbol)
-{
- int symbol;
-
- do
- {
- do
- {
- symbol = yylex ();
- } while ((symbol != YY_NULL) && (symbol != sectionsymbol));
-
- if (symbol != YY_NULL)
- symbol = yylex ();
-
- if (symbol == YY_NULL) {
- return 1;
- } else if (symbol != STR)
- continue;
-
- } while (strcmp (yylval.str, sectionname));
- return 0;
-}
-
-/* Skip all tokens until the first section of the type SECTIONSYMBOL
- is found. */
-static int
-skip_to_firstsection (int sectionsymbol)
-{
- int symbol;
-
- do
- {
- do
- {
- symbol = yylex ();
- } while ((symbol != YY_NULL) && (symbol != sectionsymbol));
-
- if (symbol != YY_NULL)
- symbol = yylex ();
-
- if (symbol == YY_NULL)
- return 1;
- } while (symbol != STR);
- return 0;
-}
-
-/* Skip all tokens until the default section is found. */
-static int
-skip_to_defaultsection (void)
-{
- int symbol;
-
- /* Search the default section. */
- do
- {
- if ((symbol = yylex ()) == YY_NULL)
- return 1;
- } while (symbol != DEFAULT);
-
- do
- {
- if ((symbol = yylex ()) == YY_NULL)
- return 1;
- } while (symbol != '{');
- scanner_unput ('{');
- return 0;
-}
-
-/* Include a single file. INCL is the filename. SECTIONSYMBOL is the
- token that marks the beginning of the section. DIRNAME is the name
- of the directory from where the includefiles must be loaded. NEW_MM
- is the mergemode that should be used. */
-static error_t
-include_section (char *incl, int sectionsymbol, char *dirname,
- mergemode new_mm)
-{
- void include_file (FILE *, mergemode, char *);
- int scanner_get_current_location (void);
- const char* scanner_get_current_file (void);
-
- char *filename;
- char *sectionname = NULL;
- FILE *includefile;
-
- int current_location = scanner_get_current_location ();
- char* current_file = strdup (scanner_get_current_file ());
-
- sectionname = strchr (incl, '(');
- if (sectionname)
- {
- int snlen;
-
- snlen = strlen (sectionname);
- if (sectionname[snlen-1] != ')')
- {
- free(current_file);
- return 0;
- }
- sectionname[snlen-1] = '\0';
- sectionname[0] = '\0';
- sectionname++;
-
- if (asprintf (&filename, "%s/%s", dirname, incl) < 0)
- {
- free (current_file);
- return ENOMEM;
- }
- }
- else
- {
- if (asprintf (&filename, "%s/%s", dirname, incl) < 0)
- {
- free (current_file);
- return ENOMEM;
- }
- }
-
- includefile = fopen (filename, "r");
-
- if (includefile == NULL)
- {
- fprintf (stderr, "Couldn't open include file \"%s\"\n", filename);
- free (current_file);
- free (filename);
- exit (EXIT_FAILURE);
- }
-
- include_file (includefile, new_mm, strdup (filename));
- debug_printf ("skipping to section %s\n", (sectionname ? sectionname : "default"));
- /* If there is a sectionname not the entire file should be included,
- the scanner should be positioned at the required section. */
- int err;
- if (sectionname)
- err = skip_to_sectionname (sectionname, sectionsymbol);
- else
- if ((err = skip_to_defaultsection ()) != 0)
- {
- /* XXX: after skip_to_defaultsection failed the whole file was
- consumed and it is required to include it here, too. */
- include_file (includefile, new_mm, strdup (filename));
- err = skip_to_firstsection (sectionsymbol);
- }
- if (err != 0) {
- char* tmpbuf = malloc (sizeof(char)*1024);
- if (tmpbuf) {
- snprintf (tmpbuf, 1023, "cannot find section %s in file %s included from %s:%d.\n"
- , (sectionname ? sectionname : "DEFAULT")
- , filename, current_file, current_location);
- yyerror (tmpbuf);
- free (tmpbuf);
- }
- free (current_file);
- free (filename);
- exit (err);
- }
- free (current_file);
- free (filename);
- return 0;
-}
-
-/* Include multiple file sections, separated by '+'. INCL is the
- include string. SECTIONSYMBOL is the token that marks the beginning
- of the section. DIRNAME is the name of the directory from where the
- includefiles must be loaded. NEW_MM is the mergemode that should be
- used. */
-static error_t
-include_sections (char *incl, int sectionsymbol, char *dirname,
- mergemode new_mm)
-{
- char *curstr;
- char *s;
-
- if (new_mm == defaultmm)
- new_mm = merge_mode;
-
-/* printf ("dir: %s - include: %s: %d\n", dirname, incl, new_mm); */
- /* Cut of all includes, starting with the first. The includes are
- pushed on the stack in reversed order. */
- do {
- curstr = strrchr (incl, '+');
- if (curstr)
- {
- curstr[0] = '\0';
- curstr++;
-
- s = strdup (curstr);
- if (s == NULL)
- return ENOMEM;
-
- include_section (s, sectionsymbol, dirname, new_mm);
- free (s);
- }
- } while (curstr);
-
- s = strdup (incl);
- if (s == NULL)
- return ENOMEM;
-
- include_section (s, sectionsymbol, dirname, new_mm);
- free (s);
-
- return 0;
-}
-
-/* Skip all tokens until the end of the section is reached. */
-static void
-skipsection (void)
-{
- /* Pathesensis counter. */
- int p = 0;
- while (p >= 0)
- {
- int symbol = yylex ();
- if (symbol == '{')
- p++;
- if (symbol == '}')
- p--;
- }
- scanner_unput ('}');
-}
-
-/* Initialize the default action with the default DEF. */
-static error_t
-set_default_action (struct xkb_action *def,
- struct xkb_action **newact)
-{
- struct xkb_action *newaction;
- newaction = malloc (sizeof (struct xkb_action));
- if (newaction == NULL)
- return ENOMEM;
- memcpy (newaction, def, sizeof (struct xkb_action));
-
- *newact = newaction;
-
- return 0;
-}
-
-/* Remove all keysyms bound to the group GROUP or the key KEY. */
-static void
-remove_symbols (struct key *key, group_t group)
-{
- // printf ("rem: group: %d\n", group);
- if (key->groups[group].symbols)
- {
- free (key->groups[group].symbols);
- key->groups[group].symbols = NULL;
- key->groups[group].width = 0;
- }
-}
-
-/* Set the keysym KS for key KEY on group GROUP and level LEVEL. */
-static void
-key_set_keysym (struct key *key, group_t group, int level, symbol ks)
-{
- symbol *keysyms = key->groups[group].symbols;
-
- if ((level + 1) > key->groups[group].width)
- {
- keysyms = realloc (keysyms, (level + 1)*sizeof(symbol));
-
- if (!keysyms)
- {
- fprintf (stderr, "No mem\n");
- exit (EXIT_FAILURE);
- }
-
- key->groups[group].symbols = keysyms;
- key->groups[group].width++;
- }
- else
- /* For NoSymbol leave the old symbol intact. */
- if (!ks) {
- debug_printf ("symbol %d was not added to key.\n", ks);
- return;
- }
-
- debug_printf ("symbol '%c'(%d) added to key for group %d and level %d.\n", ks, ks, group, level);
- keysyms[level++] = ks;
-}
-
-/* Set the action ACTION for key KEY on group GROUP and level LEVEL. */
-void
-key_set_action (struct key *key, group_t group, int level, xkb_action_t *action)
-{
- xkb_action_t **actions = key->groups[group].actions;
- size_t width = key->groups[group].actionwidth;
-
- if ((size_t) (level + 1) > width)
- {
- actions = realloc (actions, (level + 1)*sizeof(xkb_action_t *));
- /* Levels between 'width' and 'level' have no actions defined. */
- memset (&actions[width], 0, (level - width)*sizeof(xkb_action_t *));
-
- if (!actions)
- {
- fprintf (stderr, "No mem\n");
- exit (EXIT_FAILURE);
- }
-
- key->groups[group].actions = actions;
- key->groups[group].actionwidth += level - width + 1;
- }
-
- actions[level++] = action;
-}
-
-/* Delete keycode to keysym mapping. */
-void
-key_delete (char *keyname)
-{
- group_t group;
- keycode_t kc = keyname_find (keyname);
-
- current_key = &keys[kc];
- for (group = 0; group < current_key->numgroups; group++)
- remove_symbols (current_key, group);
- memset (current_key, 0, sizeof (struct key));
-
-}
-
-/* Create a new keycode to keysym mapping, check if the old one should
- be removed or preserved. */
-static void
-key_new (char *keyname)
-{
- group_t group;
-
- int isempty (char *mem, int size)
- {
- int i;
- for (i = 0; i < size; i++)
- if (mem[i])
- return 0;
- return 1;
- }
-
- keycode_t kc = keyname_find (keyname);
-
- if (merge_mode == augment)
- {
- if (!isempty ((char *) &keys[kc], sizeof (struct key)))
- {
- current_key = &dummy_key;
- debug_printf ("working on dummy key due to merge mode.\n");
- return;
- }
- else
- current_key = &keys[kc];
- }
-
- if (merge_mode == override)
- current_key = &keys[kc];
-
- if (merge_mode == replace)
- {
- key_delete (keyname);
- current_key = &keys[kc];
- }
-
- debug_printf ("working on key %s(%d)", keyname, kc);
-
- if (current_key->numgroups == 0 || merge_mode == replace)
- {
- debug_printf (" cloned default key");
- /* Clone the default key. */
- memcpy (current_key, default_key, sizeof (struct key));
- for (group = 0; group < 3; group++)
- {
- current_key->groups[group].symbols = NULL;
- current_key->groups[group].actions = NULL;
- current_key->groups[group].actionwidth = 0;
- current_key->groups[group].width = 0;
- }
- }
- debug_printf ("\n");
-}
-
-/* Load the XKB configuration from the section XKBKEYMAP in the
- keymapfile XKBKEYMAPFILE. Use XKBDIR as root directory for relative
- pathnames. */
-error_t
-parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap)
-{
- error_t err;
- char *cwd = getcwd (NULL, 0);
- extern FILE *yyin;
- extern char *filename;
-
- debug_printf ("Dir: %s, file: %s sect: %s\n", xkbdir, xkbkeymapfile, xkbkeymap);
-
- if (xkbkeymapfile)
- {
- filename = xkbkeymapfile;
-
- if (chdir (xkbdir) == -1)
- {
- fprintf (stderr, "Could not set \"%s\" as the active directory\n",
- xkbdir);
- free (cwd);
- return errno;
- }
-
- yyin = fopen (xkbkeymapfile, "r");
- if (yyin == NULL)
- {
- fprintf (stderr, "Couldn't open keymap file\n");
- free (cwd);
- return errno;
- }
-
- if (xkbkeymap)
- skip_to_sectionname (xkbkeymap, XKBKEYMAP);
- else
- skip_to_defaultsection();
- }
- else
- {
- free (cwd);
- return EINVAL;
- }
- err = yyparse ();
- fclose (yyin);
-
- if (err || yynerrs > 0)
- {
- free (cwd);
- return EINVAL;
- }
-
- if (xkbkeymapfile)
- {
- if (chdir (cwd) == -1)
- {
- fprintf (stderr,
- "Could not set \"%s\" as the active directory\n", cwd);
- free (cwd);
- return errno;
- }
- }
-
- /* Apply keysym to realmodifier mappings. */
- ksrm_apply ();
-
- free (cwd);
- return 0;
-}
diff --git a/console-client/xkb/xkb-data/keymap/hurd b/console-client/xkb/xkb-data/keymap/hurd
deleted file mode 100644
index 3d472776..00000000
--- a/console-client/xkb/xkb-data/keymap/hurd
+++ /dev/null
@@ -1,660 +0,0 @@
-// $XFree86: xc/programs/xkbcomp/keymap/xfree86,v 3.30 2003/04/03 16:34:49 dawes Exp $
-
-
-xkb_keymap "Hurd" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+us+hurd+group(win_switch)+compose(menu)" };
- xkb_geometry { include "pc" };
-};
-
-default xkb_keymap "us" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+us+hurd" };
- xkb_geometry { include "pc" };
-};
-
-// "ar" addition by Arabeyes Team, <support@arabeyes.org>
-xkb_keymap "ar" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ara+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "be" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+be+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "bg" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+bg+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-// us_intl and br by Ricardo Y. Igarashi (iga@that.com.br)
-xkb_keymap "br" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+br+hurd" };
- xkb_geometry { include "pc(abnt2)" };
-};
-// cz and sk keymaps by Kamil Toman (ktoman@email.cz)
-// are designed to replace old czechoslovakian and czsk keyboards
-// and their prog variants. Those are now obsolete and should not be used anymore.
-xkb_keymap "cz" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+cz+hurd" };
- xkb_geometry { include "pc" };
-};
-xkb_keymap "de" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+de+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ch_de" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ch(de)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ch_fr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ch(fr)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "dk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+dk+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "dvorak" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+us(dvorak)+hurd"};
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "en_US" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+us+hurd" };
- xkb_geometry { include "pc" };
-};
-xkb_keymap "es" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+es+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "fr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+fr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "fr-latin9" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+fr-latin9+hurd" };
- xkb_geometry { include "pc" };
-};
-xkb_keymap "fr_CA" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ca+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "gb" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+gb+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "hr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+hr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "it" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+it+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "jp106" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "jp(jp106)+hurd" };
- xkb_geometry { include "pc(jp106)" };
-};
-xkb_keymap "lt" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+lt+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "lt_std" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+lt(std)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "lv" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+lv+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "mk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+mk+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "mt" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+mt+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "neo" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)+caps(caps_lock)+misc(assign_shift_left_action)+level5(level5_lock)" };
- xkb_symbols { include "pc(pc105)+de(neo)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "no" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+no+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "pl" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+pl+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "pt" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+pt+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-// ro: additions by Cristian Gafton, <gafton@redhat.com>
-xkb_keymap "ro" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ro(pc101)+hurd" };
- xkb_geometry { include "pc(pc101)" };
-};
-xkb_keymap "ro_microsoft" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ro(pc105)+hurd" };
- xkb_geometry { include "pc(pc105)" };
-};
-xkb_keymap "ru" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ru+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "se_FI" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+fi+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "se_SE" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+se+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "sl" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+si+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "sl_SI" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+si+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-// cz and sk keymaps by Kamil Toman (ktoman@email.cz)
-// are designed to replace old czechoslovakian and czsk keyboards
-// and their prog variants. Those are now obsolete and should not be used anymore.
-xkb_keymap "sk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+sk+hurd" };
- xkb_geometry { include "pc" };
-};
-// Additions by Emil Soleyman-Zomalan, <emil@nishra.com>
-xkb_keymap "syr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+syr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "th" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+th+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "th_tis" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+th(tis)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "th_pat" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+th(pat)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "tr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+tr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "uk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+uk)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "us_flexpro" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "us(pc105)+hurd" };
- xkb_geometry { include "keytronic(FlexPro)" };
-};
-// us_intl and br by Ricardo Y. Igarashi (iga@that.com.br)
-// us_intl means standard us keyboard plus dead_keys symbols
-// these keyboards are very popular in Brazil
-xkb_keymap "us_intl" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "us(pc101)+us(intl)+hurd" };
- xkb_geometry { include "pc" };
-};
-xkb_keymap "us_microsoft" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "us(pc105)+hurd" };
- xkb_geometry { include "microsoft" };
-};
-
-xkb_keymap "uz" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+uz+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-
-# svu: compatibility keymaps, based on variants
-xkb_keymap "cz_qwerty" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+cz(qwerty)+hurd" };
- xkb_geometry { include "pc" };
-};
-xkb_keymap "de_CH" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ch(de)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "fr_CH" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ch(fr)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "mt_us" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+mt(us)+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "sk_qwerty" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+sk(qwerty)+hurd" };
- xkb_geometry { include "pc" };
-};
-
-/* Additional keymaps used by the Debian installer */
-xkb_keymap "al" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+al+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ara" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ara+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "bd" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+bd+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "by" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+by+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "in" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+in+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ba" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ba+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ca" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ca+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "cn" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+cn+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "nl" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+nl+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "bt" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+bt+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "epo" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+epo+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ee" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ee+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "et" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+et+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "fi" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+fi+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ge" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ge+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "gr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+gr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "il" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+il+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "hu" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+hu+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "is" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+is+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ie" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ie+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "jp" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+jp+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "kz" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+kz+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "kh" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+kh+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "kg" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+kg+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "kr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+kr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "la" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+la+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "latam" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+latam+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "np" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+np+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ir" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ir+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "rs" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+rs+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "pk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+pk+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "lk" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+lk+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "si" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+si+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "se" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+se+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ch" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ch+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "tr" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+tr+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "ua" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+ua+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
-xkb_keymap "vn" {
- xkb_keycodes { include "xfree86" };
- xkb_types { include "default+hurd" };
- xkb_compatibility { include "basic+mousekeys+accessx(basic)+misc+iso9995+level5+caps(caps_lock)" };
- xkb_symbols { include "pc(pc105)+vn+hurd" };
- xkb_geometry { include "pc(pc102)" };
-};
diff --git a/console-client/xkb/xkb-data/symbols/hurd b/console-client/xkb/xkb-data/symbols/hurd
deleted file mode 100644
index 39edf2ae..00000000
--- a/console-client/xkb/xkb-data/symbols/hurd
+++ /dev/null
@@ -1,125 +0,0 @@
-// -*- Mode: C -*-
-default
-xkb_symbols "hurd" {
- /* Switch to local consoles by default. */
- // SwitchScreen.SameServer;
-
- /* Make F1 - F10 switch virtual consoles when Alt is held down. */
- key <FK01>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 1),
- NoAction () ]
- };
- key <FK02>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 2),
- NoAction () ]
- };
- key <FK03>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 3),
- NoAction () ]
- };
- key <FK04>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 4),
- NoAction () ]
- };
- key <FK05>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 5),
- NoAction () ]
- };
- key <FK06>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 6),
- NoAction () ]
- };
- key <FK07>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 7),
- NoAction () ]
- };
- key <FK08>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 8),
- NoAction () ]
- };
- key <FK09>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 9),
- NoAction () ]
- };
- key <FK10>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction () , SwitchScreen (screen = 10),
- NoAction () ]
- };
-
- // Make the left and right cursor keys switch virtual consoles when
- // Alt is held down.
- key <LEFT>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), SwitchScreen (screen -= 1),
- NoAction () ]
- };
- key <RGHT>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), SwitchScreen (screen += 1),
- NoAction () ]
- };
-
- // Scroll the console up or down (one line).
- key <UP>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), ConsScroll (line -= 1) ]
- };
- key <DOWN>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), ConsScroll (line += 1) ]
- };
-
- // Scroll the console up or down (1/2 screen).
- key <PGUP>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), NoAction (),
- ConsScroll (screen -= 0.5) ]
- };
- key <PGDN>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (), NoAction (),
- ConsScroll (screen += 0.5) ]
- };
-
- // Scroll the console to 0%, 25%, 75% or 100%.
- key <HOME>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (),
- ConsScroll (percentage = 0),
- ConsScroll (percentage = 25) ]
- };
- key <END>
- {
- type[Group1] = "HURD",
- actions[Group1] = [ NoAction (),
- ConsScroll (percentage = 100),
- ConsScroll (percentage = 75) ]
- };
-};
diff --git a/console-client/xkb/xkb-data/types/hurd b/console-client/xkb/xkb-data/types/hurd
deleted file mode 100644
index 11ad5647..00000000
--- a/console-client/xkb/xkb-data/types/hurd
+++ /dev/null
@@ -1,17 +0,0 @@
-// -*- Mode: C -*-
-
-default xkb_types "hurd" {
- virtual_modifiers Alt;
-
- type "HURD"
- {
- modifiers = Shift + Alt + Control;
- map[Alt] = Level2;
- map[Shift] = Level3;
- map[Control] = Level4;
- level_name[Level1] = "Base";
- level_name[Level2] = "Hurd console";
- level_name[Level3] = "Hurd console2";
- level_name[Level4] = "Hurd console3";
- };
-};
diff --git a/console-client/xkb/xkb.c b/console-client/xkb/xkb.c
index f0c36a64..31253f5c 100644
--- a/console-client/xkb/xkb.c
+++ b/console-client/xkb/xkb.c
@@ -26,7 +26,6 @@
#include <errno.h>
#include <ctype.h>
#include <stdlib.h>
-#include <iconv.h>
#include <locale.h>
#include <error.h>
#include <device/device.h>
@@ -34,73 +33,26 @@
#include "xkb.h"
#include <hurd/console.h>
-#define XK_XKB_KEYS
-#define XK_MISCELLANY
-#include <X11/keysymdef.h>
#include <driver.h>
#include <mach-inputdev.h>
#include <wctype.h>
+#include <xkbcommon/xkbcommon-compose.h>
+#include <assert.h>
-
-/* The converter. */
-extern iconv_t cd;
+/* The xkbcommon kdb context */
+struct xkb_context *ctx;
-/* All interpretations for compatibility. (Translation from keysymbol
- to actions). */
-xkb_interpret_t *interpretations;
+/* The loaded keymap (immutable) */
+struct xkb_keymap *keymap;
-/* All keysymbols and how they are handled by XKB. */
-struct key *keys = NULL;
-int min_keys;
-int max_keys;
+/* The keyboard state */
+struct xkb_state *state;
-/* The current set of modifiers. */
-static modmap_t bmods;
-/* Temporary set of modifiers. This is a copy of mods, so mods won't
- be consumed (Effective modifiers). */
-static modmap_t emods;
+/* The compose context and table */
+struct xkb_compose_table *compose_table;
+struct xkb_compose_state *compose_state;
-/* Effective group. */
-static group_t egroup;
-/* Base group. */
-static group_t bgroup;
-/* Locked group. */
-static group_t lgroup;
-/* Latched group. */
-static group_t latchedgroup;
-
-static boolctrls bboolctrls;
-
-/* A counter to count how often the modifier was set. This is used
- when two separate actions set the same modifier. (example: Left
- Shift and Right Shift.). */
-modcount_t modsc;
-
-keystate_t keystate[255];
-
-/* The locked modifiers. Lock simply works an an invertion. */
-static modmap_t lmods = {0, 0};
-
-/* When the modifier is used the modifier will be consumed. */
-static modmap_t latchedmods = {0, 0};
-
-/* Not setting GroupsWrap uses modulus to keep the value into the
- range. */
-static int GroupsWrap = 0;
-
-/* MouseKeys, default: off. */
-static int MouseKeys = 0;
-/* Default mousebutton. */
-static int default_button = 0;
-
-static xkb_indicator_t *indicators;
-static int indicator_count;
-static int indicator_map = 0;
-
-/* unused
-static int stickykeys_active = 1;
-*/
int
debug_printf (const char *f, ...)
@@ -109,922 +61,19 @@ debug_printf (const char *f, ...)
int ret = 0;
va_start (ap, f);
-#ifdef XKB_DEBUG
+#ifdef XKB_DEBUG
ret = vfprintf (stderr, f, ap);
#endif
va_end (ap);
return ret;
}
-
-
-static void
-interpret_kc (keycode_t kc)
-{
- int cursym;
- int rmods = keys[kc].mods.rmods;
- struct xkb_interpret *interp;
-
- for (interp = interpretations; interp; interp = interp->next)
- {
- group_t group;
-
- for (group = 0; group < keys[kc].numgroups; group++)
- {
- int width = keys[kc].groups[group].width;
-
- for (cursym = 0; cursym < width; cursym++)
- {
- int symbol = keys[kc].groups[group].symbols[cursym];
-
- /* Check if a keysymbol requirement exists or if it
- matches. */
- if (interp->symbol == 0 ||
- (symbol && (interp->symbol == symbol)))
- {
- int flags = interp->match & 0x7f;
-
- /* XXX: use enum. */
- if ((flags == 0 && (!(interp->rmods & rmods))) ||
- (flags == 1) ||
- (flags == 2 && (interp->rmods & rmods)) ||
- (flags == 3 && ((interp->rmods & rmods) ==
- interp->rmods)) ||
- (flags == 4 && interp->rmods == rmods))
- {
- xkb_action_t *action;
-
- if (keys[kc].groups[group].actionwidth > cursym &&
- keys[kc].groups[group].actions[cursym] &&
- keys[kc].groups[group].actions[cursym]->type !=
- SA_NoAction)
- continue;
-
- action = malloc (sizeof (xkb_action_t));
- memcpy (action, &interp->action, sizeof (xkb_action_t));
-
- key_set_action (&keys[kc], group, cursym, action);
-
- keys[kc].flags = interp->flags | KEYHASACTION;
- if (!keys[kc].mods.vmods)
- keys[kc].mods.vmods = interp->vmod;
- }
- }
- }
- }
- }
-
-}
-
-
-/* Test if c is an uppercase letter. */
-static int islatin_upper (int c)
-{
- return (c >= 'A' && c <= 'Z');
-}
-
-/* Test if c is an lowercase letter. */
-static int islatin_lower (int c)
-{
- return (c >= 'a' && c <= 'z');
-}
-
-/* A key is of the keytype KEYPAD when one of the symbols that can be produced
- by this key is in the KEYPAD symbol range. */
-static int
-iskeypad (int width, int *sym)
-{
- int i;
-
- for (i = 0; i < width; i++, sym++)
- {
- /* Numlock is in the keypad range but shouldn't be of the type
- keypad because it will depend on itself in that case. */
- if (*sym == XK_Num_Lock)
- return 0;
- if (*sym >= KEYPAD_FIRST_KEY && *sym <= KEYPAD_LAST_KEY)
- return 1;
- }
- return 0;
-}
-
-/* Get the keytype (the keytype determines which modifiers are used
- for shifting.
-
- For reference, see FindAutomaticType@xkbcomp/symbols.c.
-
- These rules are used:
-
- * If the width is 1 the keytype is ONE_LEVEL.
- * If the first symbol is lowercase and the second is uppercase
- (latin alphabeth) the keytype is ALPHABETHIC.
- * If one of the symbols is in the keypad range the keytype is KEYPAD.
- * If width is 4 the type is either FOUR_LEVEL, FOUR_LEVEL_ALPHABETIC,
- FOUR_LEVEL_SEMI_ALPHABETIC (first sym pair is alphabetic) or
- FOUR_LEVEL_KEYPAD.
- * Else the keytype is TWO_LEVEL. */
-static struct keytype *
-get_keytype (int width, symbol *sym)
-{
- struct keytype *ktfound = NULL;
-
- if (!sym)
- ktfound = keytype_find ("TWO_LEVEL");
- else if ((width == 1) || (width == 0))
- ktfound = keytype_find ("ONE_LEVEL");
- else if (width == 2) {
- if (islatin_lower (sym[0]) && islatin_upper (sym[1]))
- ktfound = keytype_find ("ALPHABETIC");
- else if (iskeypad (width, sym))
- ktfound = keytype_find ("KEYPAD");
- else
- ktfound = keytype_find ("TWO_LEVEL");
- }
- else if (width <= 4) {
- if (islatin_lower (sym[0]) && islatin_upper (sym[1]))
- if (islatin_lower(sym[2]) && islatin_upper(sym[3]))
- ktfound = keytype_find ("FOUR_LEVEL_ALPHABETIC");
- else
- ktfound = keytype_find ("FOUR_LEVEL_SEMIALPHABETIC");
- else if (iskeypad (2, sym))
- ktfound = keytype_find ("FOUR_LEVEL_KEYPAD");
- else
- ktfound = keytype_find ("FOUR_LEVEL");
- }
-
- if (!ktfound)
- ktfound = keytype_find ("TWO_LEVEL");
- if (!ktfound)
- {
- console_error (L"Default keytypes have not been defined!\n");
- exit (1);
- }
-
- return ktfound;
-}
-
-/* Create XKB style actions for every action described by keysymbols. */
-static void
-interpret_all (void)
-{
- keycode_t curkc;
-
- /* Check every key. */
- for (curkc = 0; curkc < max_keys; curkc++)
- interpret_kc (curkc);
-}
-
-static void
-determine_keytypes (void)
-{
- keycode_t curkc;
-
- /* Check every key. */
- for (curkc = 0; curkc < max_keys; curkc++)
- {
- group_t group;
- for (group = 0; group < 4; group++)
- {
- struct keygroup *kg = &keys[curkc].groups[group];
-
- if (!kg->keytype)
- kg->keytype = get_keytype (kg->width, kg->symbols);
- }
- }
-}
-
-/* Wrap the group GROUP into a valid group range. The method to use is
- defined by the GroupsWrap control. */
-static int
-wrapgroup (group_t group, int maxgroup)
-{
- /* If the group is in an invalid range, fix it. */
- if (group < 0 || group >= maxgroup)
- {
- /* If RedirectIntoRange should be used use the 4 LSbs of
- the GroupsWrap control instead of the current group. */
- if (GroupsWrap & RedirectIntoRange)
- group = GroupsWrap & 0x0F;
- /* Select the closest valid group. */
- else if (GroupsWrap & ClampIntoRange)
- {
- if (group < 0)
- group = 0;
- else
- group = maxgroup - 1;
- }
- else /* Default: use modulus to wrap the group. */
- group %= maxgroup;
- }
-
- return group;
-}
-
-
-
-/* This function must be called after a modifier, group or control has
- been changed. The indicator map will be regenerated and the hardwre
- representation of this map will be updated. */
-static void
-set_indicator_mods (void)
-{
- int i;
-
- /* Calculate the effective modmap. */
- emods = bmods;
- emods.rmods |= lmods.rmods;
- emods.vmods |= lmods.vmods;
- emods.rmods |= latchedmods.rmods;
- emods.vmods |= latchedmods.vmods;
-
- for (i = 0; i < indicator_count; i++)
- {
- if (!(indicators[i].flags & IM_NoAutomatic))
- {
- if (indicators[i].which_mods & IM_UseBase)
- {
- if (((indicators[i].modmap.rmods & bmods.rmods) ==
- indicators[i].modmap.rmods) &&
- ((indicators[i].modmap.vmods & bmods.vmods) ==
- indicators[i].modmap.vmods))
- {
- indicator_map |= (1 << i);
- continue;
- }
- }
- if (indicators[i].which_mods & IM_UseLatched)
- {
- if (((indicators[i].modmap.rmods & latchedmods.rmods) ==
- indicators[i].modmap.rmods) &&
- ((indicators[i].modmap.vmods & latchedmods.vmods) ==
- indicators[i].modmap.vmods))
- {
- indicator_map |= (1 << i);
- continue;
- }
- }
- if (indicators[i].which_mods & IM_UseLocked)
- {
- if (((indicators[i].modmap.rmods & lmods.rmods) ==
- indicators[i].modmap.rmods) &&
- ((indicators[i].modmap.vmods & lmods.vmods) ==
- indicators[i].modmap.vmods))
- {
- indicator_map |= (1 << i);
- continue;
- }
- }
- if (indicators[i].which_mods & IM_UseEffective)
- {
- if (((indicators[i].modmap.rmods & emods.rmods) ==
- indicators[i].modmap.rmods) &&
- ((indicators[i].modmap.vmods & emods.vmods) ==
- indicators[i].modmap.vmods))
- {
- indicator_map |= (1 << i);
- continue;
- }
- }
- /* The indicator shouldn't be on anymore so turn it off. */
- indicator_map &= ~(1 << i);
- }
- }
- debug_printf ("INDICATOR: %d\n", indicator_map);
-}
-
-/* Set base modifiers. A counter exists for every modifier. When a
- modifier is set this counter will be incremented with one. */
-static void
-setmods (modmap_t smods, keypress_t key)
-{
- /* Higher the modcount for every set modifier. */
- void set_xmods (int xmods, int modsc[])
- {
- int i = 0;
-
- while (xmods)
- {
- if (xmods & 1)
- modsc[i]++;
-
- xmods >>= 1;
- i++;
- }
- }
-
- bmods.rmods |= smods.rmods;
- bmods.vmods |= smods.vmods;
-
- set_xmods (smods.rmods, modsc.rmods);
- set_xmods (smods.vmods, modsc.vmods);
-
- set_indicator_mods ();
-}
-
-/* Clear base modifiers. A counter exists for every modifier. When a
- key release wants to clear a modifier this counter will be
- decreased with one. When the counter becomes 0 the modifier will be
- cleared and unlocked if the clearLocks flag is set. */
-static void
-clearmods (modmap_t cmods, keypress_t key, int flags)
-{
-#define CLEAR_XMOD(MODTYPE) \
- { \
- int i = 0; \
- int mmods = cmods.MODTYPE; \
- \
- while (mmods) \
- { \
- if (mmods & 1) \
- if (!(--modsc.MODTYPE[i])) \
- { \
- bmods.MODTYPE &= ~(1 << i); \
- if (flags & clearLocks) \
- lmods.MODTYPE &= ~(1 << i); \
- } \
- mmods >>= 1; \
- i++; \
- } \
- }
-
- CLEAR_XMOD(rmods);
- CLEAR_XMOD(vmods);
-
- set_indicator_mods ();
-}
-
-/* Set modifiers in smods and also lock them if the flag noLock is
- not set. */
-static void
-setlocks (modmap_t smods, keypress_t key, int flags)
-{
- if (!key.rel)
- {
- modmap_t cmods;
- cmods.rmods = lmods.rmods & smods.rmods;
- cmods.vmods = lmods.vmods & smods.vmods;
-
- /* Locking also sets the base modifiers. */
- setmods (smods, key);
-
- if (!(flags & noUnlock))
- {
- lmods.rmods &= ~cmods.rmods;
- lmods.vmods &= ~cmods.vmods;
- }
-
- if (!(flags & noLock))
- {
- lmods.rmods |= (~cmods.rmods & smods.rmods);
- lmods.vmods |= (~cmods.vmods & smods.vmods);
- }
- }
- else
- clearmods (smods, key, flags);
-}
-
-/* Latch the modifiers smods for key KEY. When another key is operated while
- KEY is pressed the release of KEY will just clear the base
- modifiers, otherwise latch the modifiers like is described in the
- protocol specification. */
-static void
-latchmods (modmap_t smods, keypress_t key, int flags)
-{
- if (!key.rel)
- setmods (smods, key);
- else
- {
- modmap_t oldlmods;
- oldlmods = lmods;
- clearmods (smods, key, flags);
- /* Modifier that have been unlocked don't have effect anymore. */
- smods.rmods &= ~(lmods.rmods & oldlmods.rmods);
- smods.vmods &= ~(lmods.vmods & oldlmods.vmods);
-
-
- /* If another key has been pressed while this modifier key was
- pressed don't latch, just behave as SetMods. */
- if (key.keycode == key.prevkc)
- {
- if (flags & latchToLock)
- {
- /* When a modifier exists as a locked modifier, consume
- and unlock. */
- lmods.rmods |= latchedmods.rmods & smods.rmods;
- lmods.vmods |= latchedmods.vmods & smods.vmods;
-
- smods.rmods &= ~(latchedmods.rmods & smods.rmods);
- smods.vmods &= ~(latchedmods.vmods & smods.vmods);
- }
-
- /* Use the remaining modifiers for latching. */
- latchedmods.rmods |= smods.rmods;
- latchedmods.vmods |= smods.vmods;
- }
- }
-}
-
-static void
-setgroup (keypress_t key, group_t group, int flags)
-{
- debug_printf ("Setgroup ()\n");
- if (!key.rel)
- {
- if (flags & groupAbsolute)
- {
- bgroup = group;
- keystate[key.keycode].oldgroup = bgroup;
- }
- else
- bgroup += group;
- }
- else
- {
- if ((key.keycode == key.prevkc) && (flags & clearLocks))
- lgroup = 0;
- if (flags & groupAbsolute)
- bgroup = keystate[key.keycode].oldgroup;
- else
- /* XXX: Maybe oldgroup should be restored for !groupAbsolute
- too, because wrapgroup might have affected the calculation
- and subtracting will not undo the set operation. However
- this way of handeling relative groups is better because the
- order of releasing keys when multiple relative setgroup keys
- are pressed doesn't matter. */
- bgroup -= group;
- }
-}
-
-static void
-latchgroup (keypress_t key, group_t sgroup, int flags)
-{
- group_t oldlgroup = sgroup;
- setgroup (key, sgroup, flags);
- debug_printf ("Latchgroup ()\n");
-
- if (key.keycode == key.prevkc && oldlgroup == lgroup)
- {
- if ((flags & latchToLock) && latchedgroup)
- {
- lgroup += sgroup;
- latchedgroup -= sgroup;
- }
- else
- latchedgroup += sgroup;
- }
-}
-
-static void
-lockgroup (keypress_t key, group_t group, int flags)
-{
- debug_printf (">L: %d, g: %d\n", lgroup, group);
-
- keystate[key.keycode].oldgroup = lgroup;
- if (flags & groupAbsolute)
- lgroup = group;
- else
- lgroup += group;
-
- lgroup = wrapgroup (lgroup, 4);
-
- debug_printf ("<L: %d, g: %d\n", lgroup, group);
-
-}
-
-static void
-setcontrols (keypress_t key, boolctrls ctrls, int flags)
-{
- keystate[key.keycode].bool = ctrls & ~bboolctrls;
- bboolctrls |= ctrls;
-}
-
-static void
-clearcontrols (keypress_t key, boolctrls ctrls, int flags)
-{
- bboolctrls &= ~keystate[key.keycode].bool;
-}
-
-static void
-lockcontrols (keypress_t key, boolctrls ctrls, int flags)
-{
- /* XXX this needs a closer look. */
- if (!key.rel)
- {
- //setcontrols (key, boolctrls, flags);
- //if (!(flags & noLock))
- // lboolctrls |= boolctrls;
- }
- else
- {
- // clearcontrols (key, boolctrls, flags);
- /* This unlock behaviour doesn't work and sucks, just like the protocol
- specification where it was documented. */
- // if (!(flags & noUnlock))
- // lboolctrls &= ~keystate[key.keycode].bool;
- }
-
-}
-
-/* Not properly implemented, not very high priority for me. */
-/* static void */
-/* isolock (keypress_t key, group group, modmap_t mods, int flags) */
-/* { */
-/* if (!key.rel) */
-/* { */
-/* struct isolock *newiso; */
-
-/* if (flags & dfltIsGroup) */
-/* setgroup (key, group, flags & groupAbsolute); */
-/* else */
-/* setmods (key, mods, 0); */
-
-/* newiso = malloc (sizeof struct isolock); */
-/* if (!newiso) */
-/* ;// return error */
-/* active_isolocks.anchor */
-/* } */
-/* else */
-/* { */
-/* if (flags & dfltIsGroup) */
-/* { */
-/* cleargroup (key, group, flags & groupAbsolute); */
-/* if (bla) */
-/* lockgroup (key, group, flags & groupAbsolute); */
-/* } */
-/* else */
-/* { */
-/* clearmods (key, mods, 0); */
-/* if (bla) */
-/* { */
-/* lmods.rmods |= mods.rmods; */
-/* lmods.vmods |= mods.vmods; */
-/* } */
-/* } */
-/* } */
-/* } */
-
-/* Move the mousepointer relational to its current position. */
-static void
-mouse_x_move (int xdelta)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-
-/* Change the horizontal position of the mousepointer. */
-static void
-mouse_x_move_to (int x)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-
-/* Move the mousepointer relational to its current position. */
-static void
-mouse_y_move (int ydelta)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-
-/* Change the vertical position of the mousepointer. */
-static void
-mouse_y_move_to (int y)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-
-/* Simulate a mouse button press for button BUTTON. */
-static void
-mouse_button_press (int button)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-/* Simulate a mouse button press for button BUTTON. */
-static void
-mouse_button_release (int button)
-{
- /* XXX: Ofcouse this function has to do *something* :). */
-}
-
-
-
-/* Forward declaration for redirected keys. */
-static symbol handle_key (keypress_t);
-
-
-/* Execute an action bound to a key. When the action isn't supported
- or when the action doesn't consume the key return true, otherwise
- return false. */
-static int
-action_exec (xkb_action_t *action, keypress_t key)
-{
- if (!action)
- return KEYNOTCONSUMED;
-
- debug_printf ("EXEC: %d\n", action->type);
-
- switch (action->type)
- {
- /* LockMods: Lock/Unlock modifiers when the key is pressed. */
- case SA_LockMods:
- {
- action_setmods_t *setmodmap = (action_setmods_t *) action;
- modmap_t modm = setmodmap->modmap;
-
- /* UseModMap */
- if (setmodmap->flags & useModMap)
- {
- modm.rmods |= keys[key.keycode].mods.rmods;
- modm.vmods |= keys[key.keycode].mods.vmods;
- }
-
- setlocks (modm, key, setmodmap->flags);
- }
- break;
- /* SetMods: Set/Unset modifiers. Those modifier will be set as
- long the key is pressed. Keys like shift, alt and control are
- used here often. */
- case SA_SetMods:
- {
- action_setmods_t *setmodmap = (action_setmods_t *) action;
- modmap_t modm = setmodmap->modmap;
-
- /* UseModMapMods means: also use the real modifiers specified
- in the key's modmap. */
- if (setmodmap->flags & useModMap)
- {
- debug_printf ("Apply modmaps\n");
- modm.rmods |= keys[key.keycode].mods.rmods;
- modm.vmods |= keys[key.keycode].mods.vmods;
- }
-
- /* When the key is pressed set the modifiers. */
- if (!key.rel)
- setmods (modm, key);
- else /* When the key is released clear the modifiers. */
- clearmods (modm, key, setmodmap->flags);
-
- break;
- }
- /* Set the basegroup. When groupAbsolute isn't used add it
- to the basegroup. */
- case SA_LatchMods:
- {
- action_setmods_t *setmodmap = (action_setmods_t *) action;
-
- modmap_t modm = setmodmap->modmap;
-
- /* UseModMapMods means: also use the real modifiers specified
- in the key's modmap. */
- if (setmodmap->flags & useModMap)
- {
- modm.rmods |= keys[key.keycode].mods.rmods;
- modm.vmods |= keys[key.keycode].mods.vmods;
- }
-
- latchmods (modm, key, setmodmap->flags);
-
- break;
- }
- case SA_SetGroup:
- {
- action_setgroup_t *setgroupac = (action_setgroup_t *) action;
-
- setgroup (key, setgroupac->group, setgroupac->flags);
- break;
- }
- case SA_LockGroup:
- {
- action_setgroup_t *setgroupac = (action_setgroup_t *) action;
-
- if (!key.rel)
- lockgroup (key, setgroupac->group, setgroupac->flags);
- break;
- }
- case SA_LatchGroup:
- {
- action_setgroup_t *setgroupac = (action_setgroup_t *) action;
-
- latchgroup (key, setgroupac->group, setgroupac->flags);
- break;
- }
-
- case SA_PtrBtn:
- {
- action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action;
- int i;
- int button;
-
- if (!MouseKeys)
- return KEYNOTCONSUMED;
-
- if (ptrbtnac->flags & useDfltBtn)
- button = default_button;
- else
- button = ptrbtnac->button;
-
- if (ptrbtnac->count)
- for (i = 0; i < ptrbtnac->count; i++)
- {
- /* XXX: Should there be a delay? */
- mouse_button_press (button);
- mouse_button_release (button);
- }
- else if (!key.rel)
- mouse_button_press (button);
- else
- mouse_button_release (button);
- break;
- }
- case SA_LockPtrBtn:
- {
- action_ptrbtn_t *ptrbtnac = (action_ptrbtn_t *) action;
-
- int button;
-
- if (!MouseKeys)
- return KEYNOTCONSUMED;
-
- if (ptrbtnac->flags & useDfltBtn)
- button = default_button;
- else
- button = ptrbtnac->button;
-
- /* XXX: Do stuff. */
-
- break;
- }
- case SA_SetPtrDflt:
- {
- action_ptr_dflt_t *ptrdfltac = (action_ptr_dflt_t *) action;
-
- if (!MouseKeys)
- return KEYNOTCONSUMED;
-
- if (!key.rel)
- {
- if (ptrdfltac->flags & DfltBtnAbsolute)
- default_button = ptrdfltac->value;
- else
- default_button += ptrdfltac->value;
- }
-
- if (default_button < 0)
- default_button = 0;
-
- if (default_button > 5)
- default_button = 5;
-
- break;
- }
- case SA_TerminateServer:
- /* Zap! */
- console_exit ();
- break;
- case SA_SwitchScreen:
- {
- action_switchscrn_t *switchscrnac = (action_switchscrn_t *) action;
-
- if (key.rel)
- break;
-
- if (switchscrnac->flags & screenAbs)
- /* Switch to screen. */
- console_switch ((char) switchscrnac->screen, 0);
- else
- /* Move to next/prev. screen. */
- console_switch (0, (char) switchscrnac->screen);
- break;
- }
- case SA_RedirectKey:
- {
- action_redirkey_t *redirkeyac = (action_redirkey_t *) action;
-
- key.keycode = redirkeyac->newkey & (key.rel ? 0x80:0);
-
- /* For the redirected key other modifiers should be used. */
- emods.rmods = bmods.rmods | lmods.rmods | latchedmods.rmods;
- emods.vmods = bmods.vmods | lmods.vmods | latchedmods.vmods;
-
- emods.rmods &= ~redirkeyac->rmodsmask;
- emods.rmods |= redirkeyac->rmods;
- emods.vmods &= ~redirkeyac->vmods;
- emods.vmods |= redirkeyac->vmodsmask;
-
- /* XXX: calc group etc. */
-
- handle_key (key);
- break;
- }
- case SA_ConsScroll:
- {
- action_consscroll_t *scrollac = (action_consscroll_t *) action;
-
- if (key.rel)
- break;
-
- if (scrollac->flags & usePercentage)
- console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE,
- 100 - scrollac->percent);
-
- if (scrollac->screen)
- console_scrollback (CONS_SCROLL_DELTA_SCREENS, -scrollac->screen);
-
- if (scrollac->line)
- {
- int type = (scrollac->flags & lineAbs) ?
- CONS_SCROLL_ABSOLUTE_LINE : CONS_SCROLL_DELTA_LINES;
- console_scrollback (type, -scrollac->line);
- }
- break;
- }
- case SA_ActionMessage:
- case SA_DeviceBtn:
- case SA_LockDeviceBtn:
- case SA_DeviceValuator:
- return KEYNOTCONSUMED;
- case SA_MovePtr:
- {
- action_moveptr_t *moveptrac = (action_moveptr_t *) action;
-
- if (!MouseKeys)
- return KEYNOTCONSUMED;
-
- if (moveptrac->flags & MoveAbsoluteX)
- mouse_x_move_to (moveptrac->x);
- else
- mouse_x_move (moveptrac->x);
-
- if (moveptrac->flags & MoveAbsoluteY)
- mouse_y_move_to (moveptrac->y);
- else
- mouse_y_move (moveptrac->y);
- break;
- }
- case SA_SetControls:
- {
- action_setcontrols_t *controlsac = (action_setcontrols_t *) action;
- if (key.rel)
- clearcontrols (key, controlsac->controls, 0);
- else
- setcontrols (key, controlsac->controls, 0);
- break;
- }
- case SA_LockControls:
- {
- action_setcontrols_t *controlsac = (action_setcontrols_t *) action;
- lockcontrols (key, controlsac->controls, 0);
- break;
- }
- default:
- /* Preserve the keycode. */
- return KEYNOTCONSUMED;
- break;
- }
-
- /* Don't preserve the keycode because it was consumed. */
- return KEYCONSUMED;
-}
-
-
-
-/* Calculate the shift level for a specific key. */
static int
-calc_shift (keycode_t key)
+symtoctrlsym (xkb_keysym_t c)
{
- /* The keytype for this key. */
- struct keytype *keytype = keys[key].groups[egroup].keytype;
- struct typemap *map;
-
- /* XXX: Shouldn't happen, another way to fix this? */
- if (!keytype)
- return 0;
-
- /* Scan though all modifier to level maps of this keytype to search
- the level. */
- for (map = keytype->maps; map; map = map->next)
- /* Does this map meet our requirements? */
- if (map->mods.rmods == (emods.rmods & keytype->modmask.rmods) &&
- map->mods.vmods == (emods.vmods & keytype->modmask.vmods))
- {
- /* Preserve all modifiers specified in preserve for this map. */
- emods.rmods &= ~(map->mods.rmods & (~map->preserve.rmods));
- emods.vmods &= ~(map->mods.vmods & (~map->preserve.vmods));
- return map->level;
- }
-
- /* When no map is found use the default shift level and consume all
- modifiers. */
- emods.vmods &= ~keytype->modmask.vmods;
- emods.rmods &= ~keytype->modmask.rmods;
+ c = xkb_keysym_to_upper(c);
- return 0;
-}
-
-static symbol
-symtoctrlsym (symbol c)
-{
- c = toupper (c);
-
switch (c)
{
case 'A' ... 'Z':
@@ -1056,263 +105,276 @@ symtoctrlsym (symbol c)
break;
}
- return c;
+ return (int) c;
}
-
-/* Handle all actions, etc. bound to the key KEYCODE and return a XKB
- symbol if one is generated by this key. If redirected_key contains
- 1 this is keypress generated by the action SA_RedirectKey, don't
- change the effective modifiers because they exist and have been
- changed by SA_RedirectKey. */
-static symbol
-handle_key (keypress_t key)
+int
+execute_action(keycode_t keycode)
{
- int actioncompl = 0;
-
- modmap_t oldmods;
- group_t oldgroup = 0;
-
- /* The level for this key. */
- int level;
-
- /* The symbol this keypress generated. */
- symbol sym = 0;
-
- debug_printf ("groups\n");
- /* If the key does not have a group there is nothing to do. */
- if (keys[key.keycode].numgroups == 0)
- return -1;
- /* The effective group is the current group, but it can't be
- out of range. */
- egroup = wrapgroup (bgroup + lgroup,
- keys[key.keycode].numgroups);
-
- if (keys[key.keycode].groups[egroup].actions)
+ xkb_keysym_t keysym = xkb_state_key_get_one_sym (state, keycode);
+ /* if CTRL+ALT+Delete is pressed notify the caller */
+ if (keysym == XKB_KEY_Delete &&
+ xkb_state_mod_names_are_active (state, XKB_STATE_MODS_EFFECTIVE, XKB_STATE_MATCH_ALL, XKB_MOD_NAME_CTRL,
+ XKB_MOD_NAME_ALT) > 0)
{
- if (key.rel)
- {
- debug_printf ("action\n");
- if (!keystate[key.keycode].prevstate)
- /* Executing the inverse action of a never executed
- action... Stop! */
- return -1;
-
- keystate[key.keycode].prevstate = 0;
- emods = keystate[key.keycode].prevmods;
- egroup = wrapgroup (keystate[key.keycode].prevgroup,
- keys[key.keycode].numgroups);
- }
- else /* This is a keypress event. */
- {
- /* Calculate the effective modmap. */
- emods = bmods;
- emods.rmods |= lmods.rmods;
- emods.vmods |= lmods.vmods;
- emods.rmods |= latchedmods.rmods;
- emods.vmods |= latchedmods.vmods;
- }
-
- oldmods = emods;
- oldgroup = egroup;
-
- level = calc_shift (key.keycode);// %
-
- if (keys[key.keycode].groups[egroup].actionwidth >= level + 1
- && keys[key.keycode].groups[egroup].actions[level])
- {
- actioncompl = action_exec
- (keys[key.keycode].groups[egroup].actions[level], key);
- }
+ console_exit ();
+ return 1;
}
- if (actioncompl == KEYCONSUMED && !key.rel)
+ if (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0)
{
- /* An action was executed. Store the effective modifier this key
- so the reverse action can be called on key release. */
- keystate[key.keycode].prevstate = 1;
- keystate[key.keycode].prevmods = oldmods;
- keystate[key.keycode].prevgroup = oldgroup;
+ if (keysym >= XKB_KEY_F1 && keysym <= XKB_KEY_F35)
+ {
+ console_switch (keysym - XKB_KEY_F1 + 1, 0);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Right)
+ {
+ console_switch (0, 1);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Left)
+ {
+ console_switch (0, -1);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Up)
+ {
+ console_scrollback (CONS_SCROLL_DELTA_LINES, 1);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Down)
+ {
+ console_scrollback (CONS_SCROLL_DELTA_LINES, -1);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Page_Up)
+ {
+ console_scrollback (CONS_SCROLL_DELTA_SCREENS, -0.5);
+ return 1;
+ }
+ if (keysym == XKB_KEY_Page_Up)
+ {
+ console_scrollback (CONS_SCROLL_DELTA_SCREENS, 0.5);
+ return 1;
+
+ }
+ if (keysym == XKB_KEY_Home)
+ {
+ console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE, 100 - 0);
+ return 1;
+ }
+ if (keysym == XKB_KEY_End)
+ {
+ console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE, 100 - 100);
+ return 1;
+ }
}
- debug_printf ("consumed: %d - %d -%d\n", actioncompl, key.rel,
- !keys[key.keycode].groups[egroup].width);
- /* If the action comsumed the keycode, this is a key release event
- or if the key doesn't have any symbols bound to it there is no
- symbol returned. */
- if (actioncompl == KEYCONSUMED || key.rel ||
- !keys[key.keycode].groups[egroup].width)
- return -1;
-
- /* Calculate the effective modmap. */
- emods = bmods;
- emods.rmods |= lmods.rmods;
- emods.vmods |= lmods.vmods;
- emods.rmods |= latchedmods.rmods;
- emods.vmods |= latchedmods.vmods;
-
- level = calc_shift (key.keycode) % keys[key.keycode].groups[egroup].width;
-
- /* The latched modifier is used for a symbol, clear it. */
- latchedmods.rmods = latchedmods.vmods = 0;
-
- /* Search the symbol for this key in the keytable. Make sure the
- group and shift level exists. */
- sym = keys[key.keycode].groups[egroup].symbols[level];
-
- /* Convert keypad symbols to symbols. XXX: Is this the right place
- to do this? */
- if ((sym >= XK_KP_Multiply && sym <= XK_KP_Equal) || sym == XK_KP_Enter)
- sym &= ~0xFF80;
-
- /* Check if this keypress was a part of a compose sequence. */
- sym = compose_symbols (sym);
-
- return sym;
+ if (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_EFFECTIVE) > 0)
+ {
+ if (keysym == XKB_KEY_Home)
+ {
+ console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE, 100 - 25);
+ return 1;
+ }
+ if (keysym == XKB_KEY_End)
+ {
+ console_scrollback (CONS_SCROLL_ABSOLUTE_PERCENTAGE, 100 - 75);
+ return 1;
+ }
+ }
+ return 0;
}
-void
-xkb_input (keypress_t key)
+char*
+get_special_char_interpretation(xkb_keysym_t input)
{
- char buf[100];
- size_t size = 0;
- wchar_t input;
-
- debug_printf ("input: %d, rel: %d, rep: %d\n", key.keycode, key.rel, key.repeat);
-
- if (key.rel)
- keystate[key.keycode].lmods = lmods;
- input = handle_key (key);
-
- debug_printf ("handle: %d\n", input);
- if (input == -1)
- return;
-
- /* If the realmodifier MOD1 (AKA Alt) is set generate an ESC
- symbol. */
- if (emods.rmods & RMOD_MOD1)
- buf[size++] = '\e';
-
- buf[size] = '\0';
-
- if (!input)
- return;
-
/* Special key, generate escape sequence. */
char *escseq = NULL;
switch (input)
{
- case XK_Up: case XK_KP_Up:
+ case XKB_KEY_Up: case XKB_KEY_KP_Up:
escseq = CONS_KEY_UP;
break;
- case XK_Down: case XK_KP_Down:
+ case XKB_KEY_Down: case XKB_KEY_KP_Down:
escseq = CONS_KEY_DOWN;
break;
- case XK_Left: case XK_KP_Left:
+ case XKB_KEY_Left: case XKB_KEY_KP_Left:
escseq = CONS_KEY_LEFT;
break;
- case XK_Right: case XK_KP_Right:
+ case XKB_KEY_Right: case XKB_KEY_KP_Right:
escseq = CONS_KEY_RIGHT;
break;
- case XK_BackSpace:
+ case XKB_KEY_BackSpace:
escseq = CONS_KEY_BACKSPACE;
break;
- case XK_F1: case XK_KP_F1:
+ case XKB_KEY_F1: case XKB_KEY_KP_F1:
escseq = CONS_KEY_F1;
break;
- case XK_F2: case XK_KP_F2:
+ case XKB_KEY_F2: case XKB_KEY_KP_F2:
escseq = CONS_KEY_F2;
break;
- case XK_F3: case XK_KP_F3:
+ case XKB_KEY_F3: case XKB_KEY_KP_F3:
escseq = CONS_KEY_F3;
break;
- case XK_F4: case XK_KP_F4:
+ case XKB_KEY_F4: case XKB_KEY_KP_F4:
escseq = CONS_KEY_F4;
break;
- case XK_F5:
+ case XKB_KEY_F5:
escseq = CONS_KEY_F5;
break;
- case XK_F6:
+ case XKB_KEY_F6:
escseq = CONS_KEY_F6;
break;
- case XK_F7:
+ case XKB_KEY_F7:
escseq = CONS_KEY_F7;
break;
- case XK_F8:
+ case XKB_KEY_F8:
escseq = CONS_KEY_F8;
break;
- case XK_F9:
+ case XKB_KEY_F9:
escseq = CONS_KEY_F9;
break;
- case XK_F10:
+ case XKB_KEY_F10:
escseq = CONS_KEY_F10;
break;
- case XK_F11:
+ case XKB_KEY_F11:
escseq = CONS_KEY_F11;
break;
- case XK_F12:
+ case XKB_KEY_F12:
escseq = CONS_KEY_F12;
break;
- case XK_F13:
+ case XKB_KEY_F13:
escseq = CONS_KEY_F13;
break;
- case XK_F14:
+ case XKB_KEY_F14:
escseq = CONS_KEY_F14;
break;
- case XK_F15:
+ case XKB_KEY_F15:
escseq = CONS_KEY_F15;
break;
- case XK_F16:
+ case XKB_KEY_F16:
escseq = CONS_KEY_F16;
break;
- case XK_F17:
+ case XKB_KEY_F17:
escseq = CONS_KEY_F17;
break;
- case XK_F18:
+ case XKB_KEY_F18:
escseq = CONS_KEY_F18;
break;
- case XK_F19:
+ case XKB_KEY_F19:
escseq = CONS_KEY_F19;
break;
- case XK_F20:
+ case XKB_KEY_F20:
escseq = CONS_KEY_F20;
break;
- case XK_Home: case XK_KP_Home:
+ case XKB_KEY_Home: case XKB_KEY_KP_Home:
escseq = CONS_KEY_HOME;
break;
- case XK_Insert: case XK_KP_Insert:
+ case XKB_KEY_Insert: case XKB_KEY_KP_Insert:
escseq = CONS_KEY_IC;
break;
- case XK_Delete: case XK_KP_Delete:
+ case XKB_KEY_Delete: case XKB_KEY_KP_Delete:
escseq = CONS_KEY_DC;
break;
- case XK_End: case XK_KP_End:
+ case XKB_KEY_End: case XKB_KEY_KP_End:
escseq = CONS_KEY_END;
break;
- case XK_Page_Up: case XK_KP_Page_Up:
+ case XKB_KEY_Prior: case XKB_KEY_KP_Prior:
escseq = CONS_KEY_PPAGE;
break;
- case XK_Page_Down: case XK_KP_Page_Down:
+ case XKB_KEY_Next: case XKB_KEY_KP_Next:
escseq = CONS_KEY_NPAGE;
break;
- case XK_KP_Begin:
+ case XKB_KEY_KP_Begin:
escseq = CONS_KEY_B2;
break;
- case XK_ISO_Left_Tab:
+ case XKB_KEY_ISO_Left_Tab:
escseq = CONS_KEY_BTAB;
break;
- case XK_Return: case XK_KP_Enter:
+ case XKB_KEY_Return: case XKB_KEY_KP_Enter:
escseq = "\x0d";
break;
- case XK_Tab: case XK_KP_Tab:
+ case XKB_KEY_Tab: case XKB_KEY_KP_Tab:
escseq = "\t";
break;
- case XK_Escape:
+ case XKB_KEY_Escape:
escseq = "\e";
break;
}
+ return escseq;
+}
+
+void
+xkb_compose_update (keypress_t key)
+{
+ if (!key.rel)
+ xkb_compose_state_feed(compose_state, key.keycode);
+}
+
+void
+xkb_compose_update_fini (void)
+{
+ enum xkb_compose_status status = xkb_compose_state_get_status(compose_state);
+ if (status == XKB_COMPOSE_CANCELLED || status == XKB_COMPOSE_COMPOSED)
+ xkb_compose_state_reset(compose_state);
+}
+
+/* update the xkb state with the key event*/
+void
+xkb_state_update_input_key (keypress_t key)
+{
+ enum xkb_key_direction direction = key.rel ? XKB_KEY_UP : XKB_KEY_DOWN;
+ xkb_state_update_key (state, key.keycode, direction);
+}
+
+/* convert the keycode to a xkb keysym */
+static xkb_keysym_t
+get_keysym_from_keycode (keycode_t keycode)
+{
+ xkb_keysym_t sym;
+
+ sym = xkb_state_key_get_one_sym (state, keycode);
+ enum xkb_compose_status status = xkb_compose_state_get_status (compose_state);
+ if (status == XKB_COMPOSE_COMPOSING || status == XKB_COMPOSE_CANCELLED)
+ return XKB_KEYSYM_MAX + 1;
+
+ if (status == XKB_COMPOSE_COMPOSED) {
+ sym = xkb_compose_state_get_one_sym(compose_state);
+ }
+
+ return sym;
+}
+
+/* Take an input event and apply his effect, sending the result to the console */
+void
+process_keypress_event (keycode_t keycode)
+{
+ char buf[100];
+ size_t size = 0;
+ xkb_keysym_t input;
+
+ debug_printf ("input: %d\n", keycode);
+
+ if (execute_action (keycode)) // execute action if any
+ return;
+
+ input = get_keysym_from_keycode (keycode); // convert key to input
+
+ debug_printf ("handle: %d\n", input);
+ if (input > XKB_KEYSYM_MAX)
+ return;
+
+ /* If the real modifier MOD1 (AKA Alt) is set generate an ESC symbol. */
+ if(xkb_state_mod_name_is_active (state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_EFFECTIVE) > 0)
+ buf[size++] = '\e';
+
+ buf[size] = '\0';
+
+ char *escseq = get_special_char_interpretation (input);
if (escseq != NULL)
{
@@ -1323,60 +385,138 @@ xkb_input (keypress_t key)
{
char *buffer = &buf[size];
size_t left = sizeof (buf) - size;
- char *inbuf = (char *) &input;
- size_t inbufsize = sizeof (wchar_t);
- size_t nr;
+ int nr;
/* Control key behaviour. */
- if (bmods.rmods & RMOD_CTRL)
- input = symtoctrlsym (input);
-
- /* Convert the Keysym to a UCS4 characted. */
- input = KeySymToUcs4 (input);
- /* if (!input) */
- /* continue; */
-
- debug_printf ("UCS4: %d -- %c\n", (int) input, input);
-
- /* If CAPSLOCK is active capitalize the symbol. */
- if (emods.rmods & 2)
- input = towupper (input);
-
- nr = iconv (cd, &inbuf, &inbufsize, &buffer, &left);
- if (nr == (size_t) -1)
- {
- if (errno == E2BIG)
- console_error (L"Input buffer overflow");
- else if (errno == EILSEQ)
- console_error
- (L"Input contained invalid byte sequence");
- else if (errno == EINVAL)
- console_error
- (L"Input contained incomplete byte sequence");
- else
- console_error
- (L"Input caused unexpected error");
- }
- size = sizeof (buf) - left;
+ if (xkb_state_mod_name_is_active (state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE) > 0)
+ {
+ input = symtoctrlsym (input);
+ buffer[0] = input;
+ buffer[1] = '\0';
+ nr = 2;
+ size++;
+ }
+ else
+ {
+ nr = xkb_keysym_to_utf8 (input, buffer, left);
+ }
+
+ if (nr == -1)
+ {
+ console_error (L"Input buffer overflow");
+ size = 0;
+ }
+ else if (nr == 0)
+ size = 0;
+ else
+ size = nr - 1; // don’t include terminating byte
}
- if (size)
+ if (size > 0 && size <= sizeof(buf))
console_input (buf, size);
- size = 0;
}
-error_t parse_xkbconfig (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap);
+void
+process_input(keypress_t key)
+{
+ debug_printf ("keyboard event, keycode: %i, rel %i\n", key.keycode, key.rel);
+
+ /* update the compose state to be able to know the modifiers when retrieving the key */
+ xkb_compose_update (key);
+
+ /* activate timers */
+ if (key.rel || xkb_keymap_key_repeats (keymap, key.keycode))
+ xkb_timer_notify_input (key);
+ /* send input for key pressed */
+ if (!key.rel)
+ process_keypress_event (key.keycode);
+ /* clear compose if finished or canceled */
+ xkb_compose_update_fini ();
+ /* update the keyboard state for the next input */
+ xkb_state_update_input_key (key);
+}
+
error_t
-xkb_load_layout (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap)
+xkb_load_keymap (const char *rules, const char *model, const char *layout, const char *variant, const char* options)
{
- error_t err;
+ struct xkb_rule_names names = {
+ .rules = rules,
+ .model = model,
+ .layout = layout,
+ .variant = variant,
+ .options = options
+ };
+ keymap = xkb_keymap_new_from_names(ctx, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
- err = parse_xkbconfig (xkbdir, xkbkeymapfile, xkbkeymap);
- if (err)
- return err;
+ if (!keymap)
+ return ENOMEM;
- determine_keytypes ();
- interpret_all ();
return 0;
}
+
+error_t
+xkb_compose_init (const char *composefile) {
+ const char *locale;
+ FILE *cf;
+ locale = setlocale (LC_CTYPE, NULL);
+
+ if (composefile != NULL)
+ {
+ cf = fopen (composefile, "r");
+ if (cf == NULL)
+ return errno;
+ compose_table = xkb_compose_table_new_from_file (ctx, cf, locale, XKB_COMPOSE_FORMAT_TEXT_V1, XKB_COMPOSE_COMPILE_NO_FLAGS);
+ }
+ else
+ compose_table = xkb_compose_table_new_from_locale (ctx, locale, XKB_COMPOSE_COMPILE_NO_FLAGS);
+
+ if (!compose_table)
+ return ENOMEM;
+
+ compose_state = xkb_compose_state_new (compose_table, XKB_COMPOSE_STATE_NO_FLAGS);
+ if (!compose_state)
+ return ENOMEM;
+ return 0;
+}
+
+error_t
+xkb_context_init (const char *rules, const char *model, const char *layout, const char *variant, const char* options, const char *composefile)
+{
+ /* initialize a xka context */
+ ctx = xkb_context_new (XKB_CONTEXT_NO_FLAGS);
+ if (!ctx)
+ return ENOMEM;
+
+ xkb_load_keymap (rules, model, layout, variant, options);
+
+ /* load the state */
+ state = xkb_state_new (keymap);
+ if (!state)
+ return ENOMEM;
+
+ return xkb_compose_init (composefile);
+}
+
+void
+xkb_context_cleanup (void)
+{
+ /* compose cleanup */
+ xkb_compose_state_unref (compose_state);
+ xkb_compose_table_unref (compose_table);
+
+ /* state cleanup */
+ xkb_state_unref (state);
+
+ /* keymap cleanup */
+ xkb_keymap_unref (keymap);
+
+ /* context cleanup */
+ xkb_context_unref (ctx);
+}
+
+int
+get_min_keycode (void)
+{
+ return xkb_keymap_min_keycode (keymap);
+}
diff --git a/console-client/xkb/xkb.h b/console-client/xkb/xkb.h
index bfc93a53..4150e4a1 100644
--- a/console-client/xkb/xkb.h
+++ b/console-client/xkb/xkb.h
@@ -16,416 +16,29 @@
#include <errno.h>
#include <argp.h>
-#include <X11/Xlib.h>
+#include <xkbcommon/xkbcommon.h>
+
+extern struct xkb_context *ctx;
typedef int keycode_t;
typedef unsigned int scancode_t;
-typedef int symbol;
-typedef int group_t;
-typedef unsigned int boolctrls;
-
-#define KEYCONSUMED 1
-#define KEYNOTCONSUMED 0
-
-#define RedirectIntoRange 1
-#define ClampIntoRange 2
-#define WrapIntoRange 0
-
-typedef enum mergemode
- {
- augment,
- override,
- replace,
- alternate,
- defaultmm
- } mergemode;
-
-extern mergemode merge_mode;
-
-typedef unsigned long KeySym;
-
-/* Real modifiers. */
-#define RMOD_SHIFT 1 << 0
-#define RMOD_LOCK 1 << 1
-#define RMOD_CTRL 1 << 2
-#define RMOD_MOD1 1 << 3
-#define RMOD_MOD2 1 << 4
-#define RMOD_MOD3 1 << 5
-#define RMOD_MOD4 1 << 6
-#define RMOD_MOD5 1 << 7
-
-/* If set the key has action(s). */
-#define KEYHASACTION (1<<4)
-/* Normally the keytype will be calculated, but some keys like SYSRQ
- can't be calculated. For these keys the name for the keytypes will
- be given for every group fro whch the bit is set. */
-#define KEYHASTYPES 0xf
-#define KEYHASBEHAVIOUR (1<<5)
-/* Will the key be repeated when held down, or not. */
-#define KEYREPEAT (1<<6)
-#define KEYNOREPEAT (1<<7)
-
-/* The complete set of modifiers. */
-typedef struct modmap
-{
- /* Real modifiers. */
- int rmods;
- /* Virtual modifiers. */
- int vmods;
-} modmap_t;
-
-/* Modifier counter. */
-typedef struct modcount
-{
- int rmods[8];
- int vmods[16];
-} modcount_t;
-
-/* Map modifiers to a shift level. */
-typedef struct typemap
-{
- /* Shift level used when required modifiers match the active modifiers. */
- int level;
- modmap_t mods;
- modmap_t preserve;
- struct typemap *next;
-} typemap_t;
-
-/* The keypad symbol range. */
-#define KEYPAD_FIRST_KEY 0xFF80
-#define KEYPAD_LAST_KEY 0xFFB9
-#define KEYPAD_MASK 0xFF80
-
-/* Convert a keypad symbol to a ASCII symbol. */
-#define keypad_to_ascii(c) c = (c & (~KEYPAD_MASK))
-
-/* The default keytypes. These can be calculated. */
-#define KT_ONE_LEVEL 0
-#define KT_TWO_LEVEL 1
-#define KT_ALPHA 2
-#define KT_KEYPAD 3
-
-typedef struct keytype
-{
- /* Mask that determines which modifiers should be checked. */
- modmap_t modmask;
- /* Amount of levels. */
- int levels;
- /* The required set of modifiers for one specific level. */
- struct typemap *maps;
-
- char *name;
- struct keytype *hnext;
- struct keytype **prevp;
-} keytype_t;
-
-extern struct keytype *keytypes;
-extern int keytype_count;
-
-/* All Actions as described in the protocol specification. */
-typedef enum actiontype
- {
- SA_NoAction,
- SA_SetMods,
- SA_LatchMods,
- SA_LockMods,
- SA_SetGroup,
- SA_LatchGroup,
- SA_LockGroup,
- SA_MovePtr,
- SA_PtrBtn,
- SA_LockPtrBtn,
- SA_SetPtrDflt,
- SA_ISOLock,
- SA_TerminateServer,
- SA_SwitchScreen,
- SA_SetControls,
- SA_LockControls,
- SA_ActionMessage,
- SA_RedirectKey,
- SA_DeviceBtn,
- SA_LockDeviceBtn,
- SA_DeviceValuator,
- SA_ConsScroll
- } actiontype_t;
-
-typedef struct xkb_action
-{
- actiontype_t type;
- int data[15];
-} xkb_action_t;
-
-#define useModMap 4
-#define clearLocks 1
-#define latchToLock 2
-#define noLock 1
-#define noUnlock 2
-#define groupAbsolute 4
-#define NoAcceleration 1
-#define MoveAbsoluteX 2
-#define MoveAbsoluteY 4
-/* XXX: This flag is documentated and I've implemented it. Weird
- stuff. */
-#define useDfltBtn 0
-#define DfltBtnAbsolute 2
-#define AffectDfltBtn 1
-#define switchApp 1
-#define screenAbs 4
-#define lineAbs 2
-#define usePercentage 8
-
-/* Defines how symbols and rmods are interpreted. This is used to
- bound an action to a key that doesn't have an action bound to it,
- only a modifier or action describing symbol. */
-typedef struct xkb_interpret
-{
- symbol symbol;
- int rmods;
- int match;
- int vmod; /* XXX: Why does this field have a size of only 8 bits? */
- int flags;
- struct xkb_action action;
- struct xkb_interpret *next;
-} xkb_interpret_t;
-
-extern xkb_interpret_t *interpretations;
-extern int interpret_count;
-
-/* These are the parameter names that are used by the actions that
- control modifiers. (this is stored in the data field of
- xkb_action)*/
-typedef struct action_setmods
-{
- actiontype_t type;
- /* The flags configure the behaviour of the action. */
- int flags;
- /* XXX: The real modifiers that can be controlled by this action. */
- int modmask;
- /* The modifiers that are will be set/unset by this action. */
- modmap_t modmap;
-} action_setmods_t;
-
-typedef struct action_setgroup
-{
- actiontype_t type;
- int flags;
- int group;
-} action_setgroup_t;
-
-typedef struct action_moveptr
-{
- actiontype_t type;
- int flags;
- int x;
- int y;
-} action_moveptr_t;
-
-typedef struct action_ptrbtn
-{
- actiontype_t type;
- int flags;
- int count; /* Isn't used for LockPtrBtn. */
- int button;
-} action_ptrbtn_t;
-
-typedef struct action_ptr_dflt
-{
- actiontype_t type;
- int flags;
- int affect;
- int value;
-} action_ptr_dflt_t;
-
-typedef struct action_switchscrn
-{
- actiontype_t type;
- int flags;
- int screen;
-} action_switchscrn_t;
-
-typedef struct action_consscroll
-{
- actiontype_t type;
- int flags;
- double screen;
- int line;
- int percent;
-} action_consscroll_t;
-
-typedef struct action_redirkey
-{
- actiontype_t type;
- int newkey;
- int rmodsmask;
- int rmods;
- int vmodsmask;
- int vmods;
-} action_redirkey_t;
-
-typedef struct action_setcontrols
-{
- actiontype_t type;
- int controls;
-} action_setcontrols_t;
-
-/* Every key can have 4 groups, this is the information stored per
- group. */
-struct keygroup
-{
- /* All symbols for every available shift level and group. */
- symbol *symbols;
- /* All actions for every available shift level and group. */
- struct xkb_action **actions;
- /* The keytype of this key. The keytype determines the available
- shift levels and which modiers are used to set the shift level.
- */
- struct keytype *keytype;
- /* Amount of symbols held in this group of this key. */
- int width;
- int actionwidth;
-};
-
-/* A single key scancode stored in memory. */
-typedef struct key
-{
- /* The flags that can be set for this key (To change the behaviour
- of this key). */
- int flags;
- /* Every key has a maximum of 4 groups. (XXX: According to Ivan
- Pascal's documentation... I'm not really sure if that is true.) */
- struct keygroup groups[4];
- int numgroups;
- struct modmap mods;
-} keyinf_t;
-
-extern struct key *keys;
-extern int min_keys;
-extern int max_keys;
-
-/* The current state of every key. */
-typedef struct keystate
-{
- /* Key is pressed. */
- unsigned short keypressed:1;
- unsigned short prevstate:1;
- /* The key was disabled for bouncekeys. */
- unsigned short disabled:1;
- /* Information about locked modifiers at the time of the keypress,
- this information is required for unlocking when the key is released. */
- modmap_t lmods;
- /* The modifiers and group that were active at keypress, make them
- active again on keyrelease so the action will be undone. */
- modmap_t prevmods;
- boolctrls bool;
- group_t prevgroup;
- group_t oldgroup;
-} keystate_t;
-
-extern struct keystate keystate[255];
typedef struct keypress
{
keycode_t keycode;
- keycode_t prevkc;
- unsigned short repeat:1; /* It this a real keypress?. */
- unsigned short redir:1; /* This is not a real keypress. */
unsigned short rel; /* Key release. */
} keypress_t;
-/* Flags for indicators. */
-#define IM_NoExplicit 0x80
-#define IM_NoAutomatic 0x40
-#define IM_LEDDrivesKB 0x20
-
-#define IM_UseCompat 0x10
-#define IM_UseEffective 0x08
-#define IM_UseLocked 0x04
-#define IM_UseLatched 0x02
-#define IM_UseBase 0x01
-
-
-typedef struct xkb_indicator
-{
- int flags;
- int which_mods;
- modmap_t modmap;
- int which_groups;
- int groups;
- unsigned int ctrls;
-} xkb_indicator_t;
-
-unsigned int KeySymToUcs4(int keysym);
-symbol compose_symbols (symbol symbol);
-error_t read_composefile (char *);
-struct keytype *keytype_find (char *name);
-
-void key_set_action (struct key *key, group_t group, int level,
- xkb_action_t *action);
-
-
-/* Interfaces for xkbdata.c: */
-extern struct xkb_interpret default_interpretation;
-
-
-/* Assign the name KEYNAME to the keycode KEYCODE. */
-error_t keyname_add (char *keyname, int keycode);
-
-/* Find the numberic representation of the keycode with the name
- KEYNAME. */
-int keyname_find (char *keyname);
-
-/* Search the keytype with the name NAME. */
-struct keytype *keytype_find (char *name);
-
-/* Remove the keytype KT. */
-void keytype_delete (struct keytype *kt);
-
-/* Create a new keytype with the name NAME. */
-error_t keytype_new (char *name, struct keytype **new_kt);
-
-/* Add a level (LEVEL) to modifiers (MODS) mapping to the current
- keytype. */
-error_t keytype_mapadd (struct keytype *kt, modmap_t mods, int level);
-
-/* For the current keytype the modifiers PRESERVE should be preserved
- when the modifiers MODS are pressed. */
-error_t keytype_preserve_add (struct keytype *kt, modmap_t mods,
- modmap_t preserve);
-
-/* Add a new interpretation. */
-error_t interpret_new (xkb_interpret_t **new_interpret, symbol ks);
-
-/* Get the number assigned to the virtualmodifier with the name
- VMODNAME. */
-int vmod_find (char *vmodname);
-
-/* Give the virtualmodifier VMODNAME a number and add it to the
- hashtable. */
-error_t vmod_add (char *vmodname);
-
-/* Initialize the list for keysyms to realmodifiers mappings. */
-void ksrm_init (void);
-
-/* Add keysym to realmodifier mapping. */
-error_t ksrm_add (symbol ks, int rmod);
-
-/* Apply the rkms (realmods to keysyms) table to all keysyms. */
-void ksrm_apply (void);
-
-/* Set the current rmod for the key with keyname KEYNAME. */
-/* XXX: It shouldn't be applied immediately because the key can be
- replaced. */
-void set_rmod_keycode (char *keyname, int rmod);
/* Initialize XKB data structures. */
-error_t xkb_data_init (void);
+error_t xkb_context_init (const char *rules, const char *model, const char *layout, const char *variant, const char* options, const char *composefile);
+void xkb_context_cleanup (void);
-error_t xkb_input_key (int key);
+void process_input (keypress_t key);
+void process_keypress_event (keycode_t keycode);
+void xkb_timer_notify_input (keypress_t key);
+int get_min_keycode (void);
error_t xkb_init_repeat (int delay, int repeat);
-void xkb_input (keypress_t key);
-
int debug_printf (const char *f, ...);
-
-error_t xkb_load_layout (char *xkbdir, char *xkbkeymapfile, char *xkbkeymap);
diff --git a/console-client/xkb/xkbdata.c b/console-client/xkb/xkbdata.c
deleted file mode 100644
index 32a1b1f2..00000000
--- a/console-client/xkb/xkbdata.c
+++ /dev/null
@@ -1,464 +0,0 @@
-/* xkbdata.c -- Manage XKB datastructures.
-
- Copyright (C) 2003 Marco Gerards
-
- Written by Marco Gerards <marco@student.han.nl>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details. */
-
-/* Generate a key for the string S. XXX: There are many more efficient
- algorithms, this one should be replaced by one of those. */
-
-#include <stdlib.h>
-#include <string.h>
-#include <hurd/ihash.h>
-#include "xkb.h"
-
-static int
-name_hash (char *s)
-{
- int i = 0;
- while (*s)
- i += *(s++);
- return i;
-}
-
-
-/* A keyname with a keycode and realmodifier bound to it. */
-struct keyname
-{
- int keycode;
- int rmods;
-};
-
-static struct hurd_ihash kn_mapping;
-
-/* Initialize the keyname hashtable. */
-static void
-keyname_init (void)
-{
- hurd_ihash_init (&kn_mapping, HURD_IHASH_NO_LOCP);
- debug_printf ("Kn_mapping init");
- /* XXX: error. */
-}
-
-static inline int
-keyname_hash(char *keyname)
-{
- char tmp[4] = { 0 };
- strncpy(tmp, keyname, sizeof tmp);
- return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16) + (tmp[3] << 24);
-}
-
-/* Assign the name KEYNAME to the keycode KEYCODE. */
-error_t
-keyname_add (char *keyname, int keycode)
-{
- struct keyname *kn;
- int kn_int;
-
- kn = malloc (sizeof (struct keyname));
- if (!kn)
- return ENOMEM;
-
- /* XXX: 4 characters can be mapped into a int, it is safe to assume
- this will not be changed. */
- if (strlen (keyname) > 4)
- {
- debug_printf ("The keyname `%s' consist of more than 4 characters;"
- " 4 characters is the maximum.\n", keyname);
- /* XXX: Abort? */
- return 0;
- }
-
- kn->keycode = keycode;
- kn->rmods = 0;
-
- kn_int = keyname_hash(keyname);
- debug_printf ("add key %s(%d) hash: %d\n", keyname, keycode, kn_int);
- hurd_ihash_add (&kn_mapping, kn_int, kn);
-
- return 0;
-}
-
-/* Find the numberic representation of the keycode with the name
- KEYNAME. */
-int
-keyname_find (char *keyname)
-{
- struct keyname *kn;
- int kn_int;
-
- /* XXX: 4 characters can be mapped into a int, it is safe to assume
- this will not be changed. */
- if (strlen (keyname) > 4)
- {
- debug_printf ("The keyname `%s' consist of more than 4 characters;"
- " 4 characters is the maximum.\n", keyname);
- /* XXX: Abort? */
- return 0;
- }
- kn_int = keyname_hash(keyname);
-
- kn = hurd_ihash_find (&kn_mapping, kn_int);
- if (kn)
- return kn->keycode;
-/* int h = name_hash (keyname); */
-/* struct keyname *kn; */
-/* for (kn = knhash[KNHASH(h)]; kn; kn = kn->hnext) */
-/* { */
-/* if (strcmp (kn->keyname, keyname)) */
-/* continue; */
-
-/* return kn->keycode; */
-/* } */
-
- /* XXX: Is 0 an invalid keycode? */
- return 0;
-}
-
-
-/* Keytypes and keytype maps. */
-
-/* The dummy gets used when the original may not be overwritten. */
-static struct keytype dummy_keytype;
-
-#define KTHSZ 16
-#if ((KTHSZ&(KTHSZ-1)) == 0)
-#define KTHASH(ktttl) ((ktttl)&(KTHSZ-1))
-#else
-#define KTHASH(ktttl) (((unsigned)(kt))%KTHSZ)
-#endif
-
-/* All keytypes. */
-struct keytype *kthash[KTHSZ];
-
-/* Initialize the keytypes hashtable. */
-static void
-keytype_init (void)
-{
- int n;
- for (n = 0; n < KTHSZ; n++)
- kthash[n] = 0;
-}
-
-/* Search the keytype with the name NAME. */
-struct keytype *
-keytype_find (char *name)
-{
- int nhash = name_hash (name);
- struct keytype *kt;
-
- for (kt = kthash[KTHASH(nhash)]; kt; kt = kt->hnext)
- if (!strcmp (name, kt->name))
- return kt;
- return NULL;
-}
-
-/* Remove the keytype KT. */
-void
-keytype_delete (struct keytype *kt)
-{
- struct typemap *map;
-
-
- *kt->prevp = kt->hnext;
- if (kt->hnext)
- kt->hnext->prevp = kt->prevp;
-
- map = kt->maps;
- while (map)
- {
- struct typemap *nextmap = map->next;
- free (map);
- map = nextmap;
- }
-
-}
-
-/* Create a new keytype with the name NAME. */
-error_t
-keytype_new (char *name, struct keytype **new_kt)
-{
- struct keytype *kt;
- struct keytype *ktlist;
- int nhash;
-
- nhash = name_hash (name);
- debug_printf ("New: %s\n", name);
-
- kt = keytype_find (name);
-
- if (kt)
- {
- /* If the merge mode is augement don't replace it. */
- if (merge_mode == augment)
- {
- *new_kt = &dummy_keytype;
- return 0;
- }
- else /* This keytype should replace the old one, remove the old one. */
- keytype_delete (kt);
- }
-
- ktlist = kthash[KTHASH(nhash)];
- kt = calloc (1, sizeof (struct keytype));
- if (kt == NULL)
- return ENOMEM;
-
- kt->hnext = ktlist;
- kt->name = strdup (name);
- kt->prevp = &kthash[KTHASH(nhash)];
- kt->maps = NULL;
- if (kthash[KTHASH(nhash)])
- kthash[KTHASH(nhash)]->prevp = &(kt->hnext);
- kthash[KTHASH(nhash)] = kt;
-
- *new_kt = kt;
- return 0;
-}
-
-/* Add a level (LEVEL) to modifiers (MODS) mapping to the current
- keytype. */
-error_t
-keytype_mapadd (struct keytype *kt, modmap_t mods, int level)
-{
- struct typemap *map;
- modmap_t nulmap = {0, 0};
-
- map = malloc (sizeof (struct typemap));
- if (!map)
- return ENOMEM;
-
- map->level = level;
- map->mods = mods;
- map->preserve = nulmap;
- /* By default modifiers shouldn't be preserved. */
- map->next = kt->maps;
-
- kt->maps = map;
-
- return 0;
-}
-
-/* For the current keytype the modifiers PRESERVE should be preserved
- when the modifiers MODS are pressed. */
-error_t
-keytype_preserve_add (struct keytype *kt, modmap_t mods, modmap_t preserve)
-{
- error_t err;
- struct typemap *map;
-
- map = kt->maps;
- while (map)
- {
- if (mods.rmods == map->mods.rmods && mods.vmods == map->mods.vmods)
- {
- map->preserve = preserve;
- return 0;
- }
- map = map->next;
- }
-
- /* No map has been found, add the default map. */
- err = keytype_mapadd (kt, mods, 0);
- if (err)
- return err;
-
- keytype_preserve_add (kt, mods, preserve);
-
- return 0;
-}
-
-
-/* Interpretations. */
-
-struct xkb_interpret *last_interp;
-struct xkb_interpret default_interpretation;
-
-
-/* Add a new interpretation. */
-error_t
-interpret_new (xkb_interpret_t **new_interpret, symbol ks)
-{
- struct xkb_interpret *new_interp;
-
- new_interp = malloc (sizeof (struct xkb_interpret));
- if (!new_interp)
- return ENOMEM;
-
- memcpy (new_interp, &default_interpretation, sizeof (struct xkb_interpret));
- new_interp->symbol = ks;
-
- if (ks)
- {
- new_interp->next = interpretations;
- interpretations = new_interp;
-
- if (!last_interp)
- last_interp = new_interp;
- }
- else
- {
- if (last_interp)
- last_interp->next = new_interp;
-
- last_interp = new_interp;
-
- if (!interpretations)
- interpretations = new_interp;
- }
-
- *new_interpret = new_interp;
-
- return 0;
-}
-
-
-/* XXX: Dead code!? */
-/* Virtual modifiers name to number mapping. */
-/* Last number assigned to a virtual modifier. */
-static int lastvmod = 0;
-
-/* One virtual modifiername -> vmod number mapping. */
-struct vmodname
-{
- char *name;
- struct vmodname *next;
-};
-
-/* A list of virtualmodifier names and its numberic representation. */
-static struct vmodname *vmodnamel;
-
-/* Get the number assigned to the virtualmodifier with the name
- VMODNAME. */
-int
-vmod_find (char *vmodname)
-{
- int i = 0;
- struct vmodname *vmn = vmodnamel;
-
- while (vmn)
- {
- if (!strcmp (vmn->name, vmodname))
- return (lastvmod - i);
- vmn = vmn->next;
- i++;
- }
-
- return 0;
-}
-
-/* Give the virtualmodifier VMODNAME a number and add it to the
- hashtable. */
-error_t
-vmod_add (char *vmodname)
-{
- struct vmodname *vmn;
-
- if (vmod_find (vmodname))
- return 0;
-
- vmn = malloc (sizeof (struct vmodname));
- if (vmn == NULL)
- return ENOMEM;
-
- vmn->name = vmodname;
- vmn->next = vmodnamel;
- vmodnamel = vmn;
-
- lastvmod++;
- if (lastvmod > 16)
- debug_printf("warning: only sixteen virtual modifiers are supported, %s will not be functional.\n", vmodname);
-
- return 0;
-}
-
-
-/* XXX: Use this, no pointers. */
-struct ksrm
-{
- symbol ks;
-
- int rmods;
-};
-static struct hurd_ihash ksrm_mapping;
-
-/* Initialize the list for keysyms to realmodifiers mappings. */
-void
-ksrm_init (void)
-{
- hurd_ihash_init (&ksrm_mapping, HURD_IHASH_NO_LOCP);
- debug_printf ("KSRM MAP IHASH CREATED \n");
-}
-
-/* Add keysym to realmodifier mapping. */
-error_t
-ksrm_add (symbol ks, int rmod)
-{
- hurd_ihash_add (&ksrm_mapping, ks, (void *) rmod);
-
- return 0;
-}
-
-/* Apply the rkms (realmods to keysyms) table to all keysyms. */
-void
-ksrm_apply (void)
-{
- keycode_t kc;
- for (kc = 0; kc < max_keys; kc++)
- {
- int group;
- for (group = 0; group < 4; group++)
- {
- int cursym;
- for (cursym = 0; cursym < keys[kc].groups[group].width; cursym++)
- {
- symbol ks = keys[kc].groups[group].symbols[cursym];
- int rmods = (int) hurd_ihash_find (&ksrm_mapping, ks);
-
- if (rmods)
- {
- keys[kc].mods.rmods = rmods;
- }
- }
- }
- }
-}
-
-
-/* void */
-/* indicator_new (xkb_indicator_t **, */
-
-
-/* Keycode to realmodifier mapping. */
-
-/* Set the current rmod for the key with keyname KEYNAME. */
-/* XXX: It shouldn't be applied immediately because the key can be
- replaced. */
-void
-set_rmod_keycode (char *keyname, int rmod)
-{
- keycode_t kc = keyname_find (keyname);
- keys[kc].mods.rmods = rmod;
- debug_printf ("%s (kc %d) rmod: %d\n", keyname, kc, rmod);
-}
-
-/* Initialize XKB data structures. */
-error_t
-xkb_data_init (void)
-{
- keyname_init ();
- keytype_init ();
- ksrm_init ();
-
- return 0;
-}
diff --git a/console-client/xkb/xkbtimer.c b/console-client/xkb/xkbtimer.c
index 28e1c685..5021f564 100644
--- a/console-client/xkb/xkbtimer.c
+++ b/console-client/xkb/xkbtimer.c
@@ -56,30 +56,15 @@ static struct per_key_timer
/* Used for bouncekeys. */
struct timer_list disable_timer;
+
+ /* The key was disabled for bouncekeys. */
+ unsigned short disabled;
} per_key_timers[255];
/* The last pressed key. Only this key may generate keyrepeat events. */
static int lastkey = 0;
error_t
-xkb_handle_key (keycode_t kc)
-{
- static keycode_t prevkc = 0;
- keypress_t key;
-
- key.keycode = kc & 127;
- key.prevkc = prevkc;
- key.repeat = (prevkc == kc);
- key.redir = 0;
- key.rel = kc & 128;
- keystate[key.keycode & 127].keypressed = key.rel ? 0 : 1;
- debug_printf ("PRESSED: %d\n", !(key.rel));
- xkb_input (key);
- prevkc = key.keycode;
- return 0;
-}
-
-error_t
xkb_init_repeat (int delay, int repeat)
{
error_t err;
@@ -99,11 +84,22 @@ key_enable (void *handle)
int key = (int) handle;
/* Enable the key. */
- keystate[key].disabled = 0;
+ per_key_timers[key].disabled = 0;
return 0;
}
+error_t
+xkb_generate_event (keycode_t kc)
+{
+ static keycode_t prevkc = 0;
+
+ keycode_t keycode = kc & 127;
+ process_keypress_event (keycode);
+ prevkc = keycode;
+ return 0;
+}
+
/* Called by key timer. The global variable timer_status determines
the current control. */
static int
@@ -111,7 +107,7 @@ key_timing (void *handle)
{
int current_key = (int) handle;
- xkb_handle_key (current_key);
+ xkb_generate_event (current_key);
/* Another key was pressed after this key, stop repeating. */
if (lastkey != current_key)
@@ -130,16 +126,7 @@ key_timing (void *handle)
= fetch_jiffies () + key_delay;
lastkey = current_key;
- if (keys[current_key].flags & KEYNOREPEAT)
- {
- per_key_timers[current_key].enable_status = timer_stopped;
- /* Stop the timer. */
- return 0;
- }
- else
- {
- per_key_timers[current_key].enable_status = timer_repeat_delay;
- }
+ per_key_timers[current_key].enable_status = timer_repeat_delay;
break;
case timer_repeat_delay:
per_key_timers[current_key].enable_status = timer_repeating;
@@ -152,54 +139,38 @@ key_timing (void *handle)
return 1;
}
-error_t
-xkb_input_key (int key)
+void
+xkb_key_released(keycode_t keycode, keycode_t keyc)
{
- int pressed = !(key & 128);
- int keyc = key & 127;
-
- debug_printf ("KEYIN: %d\n", key);
+ /* Stop the timer for this released key. */
+ if (per_key_timers[keyc].enable_status != timer_stopped)
+ {
+ timer_remove (&per_key_timers[keyc].enable_timer);
+ per_key_timers[keyc].enable_status = timer_stopped;
+ }
- /* Filter out any double or disabled keys. */
- if (key == lastkey || keystate[keyc].disabled)
- return 0;
+ /* No more last key; it was released. */
+ if (keyc == lastkey)
+ lastkey = 0;
- /* Always handle keyrelease events. */
- if (!pressed)
+ /* If bouncekeys is active, disable the key. */
+ if (bouncekeys_active)
{
- /* Stop the timer for this released key. */
- if (per_key_timers[keyc].enable_status != timer_stopped)
- {
- timer_remove (&per_key_timers[keyc].enable_timer);
- per_key_timers[keyc].enable_status = timer_stopped;
- }
-
- /* No more last key; it was released. */
- if (keyc == lastkey)
- lastkey = 0;
-
- /* Make sure the key was pressed before releasing it, it might
- not have been accepted. */
- if (keystate[key & 127].keypressed)
- xkb_handle_key (key);
-
- /* If bouncekeys is active, disable the key. */
- if (bouncekeys_active)
- {
- keystate[keyc].disabled = 1;
-
- /* Setup a timer to enable the key. */
- timer_clear (&per_key_timers[keyc].disable_timer);
- per_key_timers[keyc].disable_timer.fnc = key_enable;
- per_key_timers[keyc].disable_timer.fnc_data = (void *) keyc;
- per_key_timers[keyc].disable_timer.expires
- = fetch_jiffies () + bouncekeys_delay;
- timer_add (&per_key_timers[keyc].disable_timer);
- }
-
- return 0;
+ per_key_timers[keyc].disabled = 1;
+
+ /* Setup a timer to enable the key. */
+ timer_clear (&per_key_timers[keyc].disable_timer);
+ per_key_timers[keyc].disable_timer.fnc = key_enable;
+ per_key_timers[keyc].disable_timer.fnc_data = (void *) keyc;
+ per_key_timers[keyc].disable_timer.expires
+ = fetch_jiffies () + bouncekeys_delay;
+ timer_add (&per_key_timers[keyc].disable_timer);
}
+}
+void
+xkb_key_pressed(keycode_t keyc)
+{
/* Setup the timer for slowkeys. */
timer_clear (&per_key_timers[keyc].enable_timer);
lastkey = keyc;
@@ -210,22 +181,29 @@ xkb_input_key (int key)
{
per_key_timers[keyc].enable_status = timer_slowkeys;
per_key_timers[keyc].enable_timer.expires
- = fetch_jiffies () + slowkeys_delay;
+ = fetch_jiffies () + slowkeys_delay;
}
else
{
- /* Immediately report the keypress. */
- xkb_handle_key (keyc);
-
- /* Check if this repeat is allowed for this keycode. */
- if (keys[keyc].flags & KEYNOREPEAT)
- return 0; /* Nope. */
-
per_key_timers[keyc].enable_status = timer_repeat_delay;
per_key_timers[keyc].enable_timer.expires
- = fetch_jiffies () + key_delay;
+ = fetch_jiffies () + key_delay;
}
timer_add (&per_key_timers[keyc].enable_timer);
+}
- return 0;
+void
+xkb_timer_notify_input (keypress_t key)
+{
+ int keyc = key.keycode & 127;
+
+ /* Filter out any double or disabled keys. */
+ if ((!key.rel && key.keycode == lastkey) || per_key_timers[keyc].disabled)
+ return;
+
+ /* Always handle key release events. */
+ if (key.rel)
+ xkb_key_released(key.keycode, keyc);
+ else
+ xkb_key_pressed(keyc);
}