[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2] console-client: use xkbcommon instead of x11 for xkb exte
From: |
Samuel Thibault |
Subject: |
Re: [PATCH v2] console-client: use xkbcommon instead of x11 for xkb extended support |
Date: |
Sun, 10 Mar 2024 17:03:12 +0100 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
Applied, thanks a lot for this cleanup which actually improves keyboard
layout coverage a lot! :D
Etienne Brateau, le dim. 10 mars 2024 00:48:38 +0100, a ecrit:
> 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.
> ---
> config.make.in | 12 +-
> configure.ac | 60 +-
> console-client/Makefile | 39 +-
> console-client/pc-kbd.c | 111 +-
> console-client/xkb/MISSING-FEATURES | 6 -
> console-client/xkb/README | 27 +-
> console-client/xkb/TODO | 3 -
> console-client/xkb/compose.c | 592 --------
> console-client/xkb/kstoucs.c | 58 -
> console-client/xkb/kstoucs_map.sh | 20 -
> console-client/xkb/lex.l | 386 ------
> console-client/xkb/parser.y | 1605 ----------------------
> console-client/xkb/xkb-data/keymap/hurd | 660 ---------
> console-client/xkb/xkb-data/symbols/hurd | 125 --
> console-client/xkb/xkb-data/types/hurd | 17 -
> console-client/xkb/xkb.c | 1560 +++++----------------
> console-client/xkb/xkb.h | 405 +-----
> console-client/xkb/xkbdata.c | 464 -------
> console-client/xkb/xkbtimer.c | 142 +-
> 19 files changed, 488 insertions(+), 5804 deletions(-)
> delete mode 100644 console-client/xkb/compose.c
> delete mode 100644 console-client/xkb/kstoucs.c
> delete mode 100644 console-client/xkb/kstoucs_map.sh
> delete mode 100644 console-client/xkb/lex.l
> delete mode 100644 console-client/xkb/parser.y
> delete mode 100644 console-client/xkb/xkb-data/keymap/hurd
> delete mode 100644 console-client/xkb/xkb-data/symbols/hurd
> delete mode 100644 console-client/xkb/xkb-data/types/hurd
> delete mode 100644 console-client/xkb/xkbdata.c
>
> 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, ¤t_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 (¤t_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 (¤t_interpretation, $3);
> - current_interpretation->match |= 1;
> - }
> - }
> - '{' interprets '}' ';'
> -| compatsect "interpret" symbol '+' rmod
> - {
> - if ($3 != -1)
> - {
> - interpret_new (¤t_interpretation, $3);
> - current_interpretation->rmods = $5;
> - current_interpretation->match |= 4;
> - }
> - }
> - '{' interprets '}' ';'
> -| compatsect "interpret" symbol '+' "any"
> - {
> - if ($3 != -1)
> - {
> - interpret_new (¤t_interpretation, $3);
> - current_interpretation->rmods = 255;
> - current_interpretation->match |= 2;
> - }
> - }
> - '{' interprets '}' ';'
> -| compatsect "interpret" symbol '+' INTERPMATCH '(' mods ')'
> - {
> - if ($3 != -1)
> - {
> - interpret_new (¤t_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, ¤t_action))
> - YYABORT;
> - }
> - '(' setmodsparams ')' { $$ = current_action; }
> -| "latchmods"
> - {
> - if (set_default_action (&default_latchmods, ¤t_action))
> - YYABORT;
> - }
> - '(' setmodsparams ')' { $$ = current_action; }
> -| "lockmods"
> - {
> - if (set_default_action (&default_lockmods, ¤t_action))
> - YYABORT;
> - }
> - '(' setmodsparams ')' { $$ = current_action; }
> -| "setgroup"
> - {
> - if (set_default_action (&default_setgroup, ¤t_action))
> - YYABORT;
> - }
> - '(' setgroupparams ')' { $$ = current_action; }
> -| "latchgroup"
> - {
> - if (set_default_action (&default_latchgroup, ¤t_action))
> - YYABORT;
> - }
> - '(' setgroupparams ')' { $$ = current_action; }
> -| "lockgroup"
> - {
> - if (set_default_action (&default_lockgroup, ¤t_action))
> - YYABORT;
> - }
> - '(' setgroupparams ')' { $$ = current_action; }
> -| "moveptr"
> - {
> - if (set_default_action (&default_moveptr, ¤t_action))
> - YYABORT;
> - }
> - '(' moveptrparams ')' { $$ = current_action; }
> -| "ptrbtn"
> - {
> - if (set_default_action (&default_ptrbtn, ¤t_action))
> - YYABORT;
> - }
> - '(' ptrbtnparams ')' { $$ = current_action; }
> -| "lockptrbtn"
> - {
> - if (set_default_action (&default_lockptrbtn, ¤t_action))
> - YYABORT;
> - }
> - '(' ptrbtnparams ')' { $$ = current_action; }
> -| "setptrdflt"
> - {
> - if (set_default_action (&default_ptrdflt, ¤t_action))
> - YYABORT;
> - }
> - '(' ptrdfltparams ')' { $$ = current_action; }
> -| "setcontrols"
> - {
> - if (set_default_action (&default_setcontrols, ¤t_action))
> - YYABORT;
> - }
> - '(' ctrlparams ')' { $$ = current_action; }
> -| "lockcontrols"
> - {
> - if (set_default_action (&default_lockcontrols, ¤t_action))
> - YYABORT;
> - }
> - '(' ctrlparams ')' { $$ = current_action; }
> -| "terminate" '(' ')'
> - { $$ = calloc (1, sizeof (xkb_action_t)); $$->type = SA_TerminateServer; }
> -| "switchscreen"
> - {
> - if (set_default_action (&default_switchscrn, ¤t_action))
> - YYABORT;
> - }
> -'(' switchscrnparams ')' { $$ = current_action; }
> -| "consscroll"
> - {
> - if (set_default_action (&default_consscroll, ¤t_action))
> - YYABORT;
> - }
> - '(' consscrollparams ')' { $$ = current_action; }
> -| "isolock"
> - {
> - if (set_default_action (&default_isolock, ¤t_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..dcd4baf3 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_F10)
> + {
> + 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:
> - escseq = CONS_KEY_UP;
> + case XKB_KEY_Up: case XKB_KEY_KP_Up:
> + escseq = CONS_KEY_UP;
> break;
> - case XK_Down: case XK_KP_Down:
> - escseq = CONS_KEY_DOWN;
> + case XKB_KEY_Down: case XKB_KEY_KP_Down:
> + escseq = CONS_KEY_DOWN;
> break;
> - case XK_Left: case XK_KP_Left:
> - escseq = CONS_KEY_LEFT;
> + case XKB_KEY_Left: case XKB_KEY_KP_Left:
> + escseq = CONS_KEY_LEFT;
> break;
> - case XK_Right: case XK_KP_Right:
> - escseq = CONS_KEY_RIGHT;
> + case XKB_KEY_Right: case XKB_KEY_KP_Right:
> + escseq = CONS_KEY_RIGHT;
> break;
> - case XK_BackSpace:
> - escseq = CONS_KEY_BACKSPACE;
> + case XKB_KEY_BackSpace:
> + escseq = CONS_KEY_BACKSPACE;
> break;
> - case XK_F1: case XK_KP_F1:
> - escseq = CONS_KEY_F1;
> + case XKB_KEY_F1: case XKB_KEY_KP_F1:
> + escseq = CONS_KEY_F1;
> break;
> - case XK_F2: case XK_KP_F2:
> - escseq = CONS_KEY_F2;
> + case XKB_KEY_F2: case XKB_KEY_KP_F2:
> + escseq = CONS_KEY_F2;
> break;
> - case XK_F3: case XK_KP_F3:
> - escseq = CONS_KEY_F3;
> + case XKB_KEY_F3: case XKB_KEY_KP_F3:
> + escseq = CONS_KEY_F3;
> break;
> - case XK_F4: case XK_KP_F4:
> - escseq = CONS_KEY_F4;
> + case XKB_KEY_F4: case XKB_KEY_KP_F4:
> + escseq = CONS_KEY_F4;
> break;
> - case XK_F5:
> - escseq = CONS_KEY_F5;
> + case XKB_KEY_F5:
> + escseq = CONS_KEY_F5;
> break;
> - case XK_F6:
> - escseq = CONS_KEY_F6;
> + case XKB_KEY_F6:
> + escseq = CONS_KEY_F6;
> break;
> - case XK_F7:
> - escseq = CONS_KEY_F7;
> + case XKB_KEY_F7:
> + escseq = CONS_KEY_F7;
> break;
> - case XK_F8:
> - escseq = CONS_KEY_F8;
> + case XKB_KEY_F8:
> + escseq = CONS_KEY_F8;
> break;
> - case XK_F9:
> - escseq = CONS_KEY_F9;
> + case XKB_KEY_F9:
> + escseq = CONS_KEY_F9;
> break;
> - case XK_F10:
> - escseq = CONS_KEY_F10;
> + case XKB_KEY_F10:
> + escseq = CONS_KEY_F10;
> break;
> - case XK_F11:
> - escseq = CONS_KEY_F11;
> + case XKB_KEY_F11:
> + escseq = CONS_KEY_F11;
> break;
> - case XK_F12:
> - escseq = CONS_KEY_F12;
> + case XKB_KEY_F12:
> + escseq = CONS_KEY_F12;
> break;
> - case XK_F13:
> - escseq = CONS_KEY_F13;
> + case XKB_KEY_F13:
> + escseq = CONS_KEY_F13;
> break;
> - case XK_F14:
> - escseq = CONS_KEY_F14;
> + case XKB_KEY_F14:
> + escseq = CONS_KEY_F14;
> break;
> - case XK_F15:
> - escseq = CONS_KEY_F15;
> + case XKB_KEY_F15:
> + escseq = CONS_KEY_F15;
> break;
> - case XK_F16:
> - escseq = CONS_KEY_F16;
> + case XKB_KEY_F16:
> + escseq = CONS_KEY_F16;
> break;
> - case XK_F17:
> - escseq = CONS_KEY_F17;
> + case XKB_KEY_F17:
> + escseq = CONS_KEY_F17;
> break;
> - case XK_F18:
> - escseq = CONS_KEY_F18;
> + case XKB_KEY_F18:
> + escseq = CONS_KEY_F18;
> break;
> - case XK_F19:
> - escseq = CONS_KEY_F19;
> + case XKB_KEY_F19:
> + escseq = CONS_KEY_F19;
> break;
> - case XK_F20:
> - escseq = CONS_KEY_F20;
> + case XKB_KEY_F20:
> + escseq = CONS_KEY_F20;
> break;
> - case XK_Home: case XK_KP_Home:
> - escseq = CONS_KEY_HOME;
> + case XKB_KEY_Home: case XKB_KEY_KP_Home:
> + escseq = CONS_KEY_HOME;
> break;
> - case XK_Insert: case XK_KP_Insert:
> - escseq = CONS_KEY_IC;
> + case XKB_KEY_Insert: case XKB_KEY_KP_Insert:
> + escseq = CONS_KEY_IC;
> break;
> - case XK_Delete: case XK_KP_Delete:
> - escseq = CONS_KEY_DC;
> + case XKB_KEY_Delete: case XKB_KEY_KP_Delete:
> + escseq = CONS_KEY_DC;
> break;
> - case XK_End: case XK_KP_End:
> - escseq = CONS_KEY_END;
> + case XKB_KEY_End: case XKB_KEY_KP_End:
> + escseq = CONS_KEY_END;
> break;
> - case XK_Page_Up: case XK_KP_Page_Up:
> - escseq = CONS_KEY_PPAGE;
> + case XKB_KEY_Prior: case XKB_KEY_KP_Prior:
> + escseq = CONS_KEY_PPAGE;
> break;
> - case XK_Page_Down: case XK_KP_Page_Down:
> - escseq = CONS_KEY_NPAGE;
> + case XKB_KEY_Next: case XKB_KEY_KP_Next:
> + escseq = CONS_KEY_NPAGE;
> break;
> - case XK_KP_Begin:
> - escseq = CONS_KEY_B2;
> + case XKB_KEY_KP_Begin:
> + escseq = CONS_KEY_B2;
> break;
> - case XK_ISO_Left_Tab:
> - escseq = CONS_KEY_BTAB;
> + case XKB_KEY_ISO_Left_Tab:
> + escseq = CONS_KEY_BTAB;
> break;
> - case XK_Return: case XK_KP_Enter:
> - escseq = "\x0d";
> + case XKB_KEY_Return: case XKB_KEY_KP_Enter:
> + escseq = "\x0d";
> break;
> - case XK_Tab: case XK_KP_Tab:
> - escseq = "\t";
> + case XKB_KEY_Tab: case XKB_KEY_KP_Tab:
> + escseq = "\t";
> break;
> - case XK_Escape:
> - escseq = "\e";
> + 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,29 +56,14 @@ 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)
> {
> @@ -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);
> }
> --
> 2.44.0
>
>
>
>
--
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.