Move indicators.c code into compat.c
authorRan Benita <ran234@gmail.com>
Mon, 16 Jul 2012 19:45:16 +0000 (22:45 +0300)
committerRan Benita <ran234@gmail.com>
Wed, 18 Jul 2012 11:07:02 +0000 (14:07 +0300)
It is only used there. Allows some refactoring.

Signed-off-by: Ran Benita <ran234@gmail.com>
Makefile.am
src/xkbcomp/compat.c
src/xkbcomp/indicators.c [deleted file]
src/xkbcomp/indicators.h [deleted file]

index 5ca617b..d5ead73 100644 (file)
@@ -45,8 +45,6 @@ libxkbcommon_la_SOURCES = \
        src/xkbcomp/compat.c \
        src/xkbcomp/expr.c \
        src/xkbcomp/expr.h \
-       src/xkbcomp/indicators.c \
-       src/xkbcomp/indicators.h \
        src/xkbcomp/keycodes.c \
        src/xkbcomp/keytypes.c \
        src/xkbcomp/misc.c \
index 2c40dc2..7f74c8a 100644 (file)
@@ -27,7 +27,6 @@
 #include "xkbcomp-priv.h"
 #include "parseutils.h"
 #include "action.h"
-#include "indicators.h"
 #include "vmod.h"
 
 typedef struct _SymInterpInfo {
@@ -41,6 +40,29 @@ typedef struct _SymInterpInfo {
 #define _SI_LockingKey   (1 << 3)
 #define _SI_LevelOneOnly (1 << 4)
 
+typedef struct _LEDInfo {
+    CommonInfo defs;
+    xkb_atom_t name;
+    unsigned char indicator;
+    unsigned char flags;
+    unsigned char which_mods;
+    unsigned char real_mods;
+    unsigned short vmods;
+    unsigned char which_groups;
+    unsigned char groups;
+    unsigned int ctrls;
+} LEDInfo;
+
+#define _LED_Index      (1 << 0)
+#define _LED_Mods       (1 << 1)
+#define _LED_Groups     (1 << 2)
+#define _LED_Ctrls      (1 << 3)
+#define _LED_Explicit   (1 << 4)
+#define _LED_Automatic  (1 << 5)
+#define _LED_DrivesKbd  (1 << 6)
+
+#define _LED_NotBound   255
+
 typedef struct _GroupCompatInfo {
     unsigned file_id;
     enum merge_mode merge;
@@ -95,6 +117,33 @@ ReportSIBadType(SymInterpInfo *si, const char *field, const char *wanted,
                          wanted);
 }
 
+static inline bool
+ReportIndicatorBadType(struct xkb_keymap *keymap, LEDInfo *led,
+                       const char *field, const char *wanted)
+{
+    return ReportBadType("indicator map", field,
+                         xkb_atom_text(keymap->ctx, led->name), wanted);
+}
+
+static inline bool
+ReportIndicatorNotArray(struct xkb_keymap *keymap, LEDInfo *led,
+                        const char *field)
+{
+    return ReportNotArray("indicator map", field,
+                          xkb_atom_text(keymap->ctx, led->name));
+}
+
+static void
+ClearIndicatorMapInfo(struct xkb_context *ctx, LEDInfo * info)
+{
+    info->name = xkb_atom_intern(ctx, "default");
+    info->indicator = _LED_NotBound;
+    info->flags = info->which_mods = info->real_mods = 0;
+    info->vmods = 0;
+    info->which_groups = info->groups = 0;
+    info->ctrls = 0;
+}
+
 static void
 InitCompatInfo(CompatInfo *info, struct xkb_keymap *keymap, unsigned file_id)
 {
@@ -321,6 +370,106 @@ ResolveStateAndPredicate(ExprDef * expr,
 
 /***====================================================================***/
 
+static LEDInfo *
+AddIndicatorMap(struct xkb_keymap *keymap, LEDInfo *oldLEDs, LEDInfo *new)
+{
+    LEDInfo *old, *last;
+    unsigned collide;
+
+    last = NULL;
+    for (old = oldLEDs; old != NULL; old = (LEDInfo *) old->defs.next) {
+        if (old->name == new->name) {
+            if ((old->real_mods == new->real_mods) &&
+                (old->vmods == new->vmods) &&
+                (old->groups == new->groups) &&
+                (old->ctrls == new->ctrls) &&
+                (old->which_mods == new->which_mods) &&
+                (old->which_groups == new->which_groups)) {
+                old->defs.defined |= new->defs.defined;
+                return oldLEDs;
+            }
+
+            if (new->defs.merge == MERGE_REPLACE) {
+                CommonInfo *next = old->defs.next;
+                if (((old->defs.file_id == new->defs.file_id)
+                     && (warningLevel > 0)) || (warningLevel > 9)) {
+                    WARN("Map for indicator %s redefined\n",
+                          xkb_atom_text(keymap->ctx, old->name));
+                    ACTION("Earlier definition ignored\n");
+                }
+                *old = *new;
+                old->defs.next = next;
+                return oldLEDs;
+            }
+
+            collide = 0;
+            if (UseNewField(_LED_Index, &old->defs, &new->defs, &collide)) {
+                old->indicator = new->indicator;
+                old->defs.defined |= _LED_Index;
+            }
+            if (UseNewField(_LED_Mods, &old->defs, &new->defs, &collide)) {
+                old->which_mods = new->which_mods;
+                old->real_mods = new->real_mods;
+                old->vmods = new->vmods;
+                old->defs.defined |= _LED_Mods;
+            }
+            if (UseNewField(_LED_Groups, &old->defs, &new->defs, &collide)) {
+                old->which_groups = new->which_groups;
+                old->groups = new->groups;
+                old->defs.defined |= _LED_Groups;
+            }
+            if (UseNewField(_LED_Ctrls, &old->defs, &new->defs, &collide)) {
+                old->ctrls = new->ctrls;
+                old->defs.defined |= _LED_Ctrls;
+            }
+            if (UseNewField(_LED_Explicit, &old->defs, &new->defs, &collide)) {
+                old->flags &= ~XkbIM_NoExplicit;
+                old->flags |= (new->flags & XkbIM_NoExplicit);
+                old->defs.defined |= _LED_Explicit;
+            }
+            if (UseNewField(_LED_Automatic, &old->defs, &new->defs, &collide)) {
+                old->flags &= ~XkbIM_NoAutomatic;
+                old->flags |= (new->flags & XkbIM_NoAutomatic);
+                old->defs.defined |= _LED_Automatic;
+            }
+            if (UseNewField(_LED_DrivesKbd, &old->defs, &new->defs, &collide)) {
+                old->flags &= ~XkbIM_LEDDrivesKB;
+                old->flags |= (new->flags & XkbIM_LEDDrivesKB);
+                old->defs.defined |= _LED_DrivesKbd;
+            }
+
+            if (collide) {
+                WARN("Map for indicator %s redefined\n",
+                     xkb_atom_text(keymap->ctx, old->name));
+                ACTION("Using %s definition for duplicate fields\n",
+                        (new->defs.merge == MERGE_AUGMENT ? "first" : "last"));
+            }
+
+            return oldLEDs;
+        }
+
+        if (old->defs.next == NULL)
+            last = old;
+    }
+
+    /* new definition */
+    old = uTypedAlloc(LEDInfo);
+    if (!old) {
+        WSGO("Couldn't allocate indicator map\n");
+        ACTION("Map for indicator %s not compiled\n",
+                xkb_atom_text(keymap->ctx, new->name));
+        return NULL;
+    }
+    *old = *new;
+    old->defs.next = NULL;
+    if (last) {
+        last->defs.next = &old->defs;
+        return oldLEDs;
+    }
+
+    return old;
+}
+
 static void
 MergeIncludedCompatMaps(CompatInfo * into, CompatInfo * from,
                         enum merge_mode merge)
@@ -530,6 +679,161 @@ SetInterpField(SymInterpInfo *si, struct xkb_keymap *keymap, char *field,
     return ok;
 }
 
+static const LookupEntry modComponentNames[] = {
+    {"base", XkbIM_UseBase},
+    {"latched", XkbIM_UseLatched},
+    {"locked", XkbIM_UseLocked},
+    {"effective", XkbIM_UseEffective},
+    {"compat", XkbIM_UseCompat},
+    {"any", XkbIM_UseAnyMods},
+    {"none", 0},
+    {NULL, 0}
+};
+static const LookupEntry groupComponentNames[] = {
+    {"base", XkbIM_UseBase},
+    {"latched", XkbIM_UseLatched},
+    {"locked", XkbIM_UseLocked},
+    {"effective", XkbIM_UseEffective},
+    {"any", XkbIM_UseAnyGroup},
+    {"none", 0},
+    {NULL, 0}
+};
+
+static const LookupEntry groupNames[] = {
+    {"group1", 0x01},
+    {"group2", 0x02},
+    {"group3", 0x04},
+    {"group4", 0x08},
+    {"group5", 0x10},
+    {"group6", 0x20},
+    {"group7", 0x40},
+    {"group8", 0x80},
+    {"none", 0x00},
+    {"all", 0xff},
+    {NULL, 0}
+};
+
+static int
+SetIndicatorMapField(LEDInfo *led, struct xkb_keymap *keymap,
+                     char *field, ExprDef *arrayNdx, ExprDef *value)
+{
+    ExprResult rtrn;
+    bool ok = true;
+
+    if (strcasecmp(field, "modifiers") == 0 || strcasecmp(field, "mods") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveVModMask(value, &rtrn, keymap))
+            return ReportIndicatorBadType(keymap, led, field, "modifier mask");
+
+        led->real_mods = rtrn.uval & 0xff;
+        led->vmods = (rtrn.uval >> 8) & 0xff;
+        led->defs.defined |= _LED_Mods;
+    }
+    else if (strcasecmp(field, "groups") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveMask(keymap->ctx, value, &rtrn, groupNames))
+            return ReportIndicatorBadType(keymap, led, field, "group mask");
+
+        led->groups = rtrn.uval;
+        led->defs.defined |= _LED_Groups;
+    }
+    else if (strcasecmp(field, "controls") == 0 ||
+             strcasecmp(field, "ctrls") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveMask(keymap->ctx, value, &rtrn, ctrlNames))
+            return ReportIndicatorBadType(keymap, led, field,
+                                          "controls mask");
+
+        led->ctrls = rtrn.uval;
+        led->defs.defined |= _LED_Ctrls;
+    }
+    else if (strcasecmp(field, "allowexplicit") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+            return ReportIndicatorBadType(keymap, led, field, "boolean");
+
+        if (rtrn.uval)
+            led->flags &= ~XkbIM_NoExplicit;
+        else
+            led->flags |= XkbIM_NoExplicit;
+        led->defs.defined |= _LED_Explicit;
+    }
+    else if (strcasecmp(field, "whichmodstate") == 0 ||
+             strcasecmp(field, "whichmodifierstate") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveMask(keymap->ctx, value, &rtrn, modComponentNames))
+            return ReportIndicatorBadType(keymap, led, field,
+                                          "mask of modifier state components");
+
+        led->which_mods = rtrn.uval;
+    }
+    else if (strcasecmp(field, "whichgroupstate") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveMask(keymap->ctx, value, &rtrn, groupComponentNames))
+            return ReportIndicatorBadType(keymap, led, field,
+                                          "mask of group state components");
+
+        led->which_groups = rtrn.uval;
+    }
+    else if (strcasecmp(field, "driveskbd") == 0 ||
+             strcasecmp(field, "driveskeyboard") == 0 ||
+             strcasecmp(field, "leddriveskbd") == 0 ||
+             strcasecmp(field, "leddriveskeyboard") == 0 ||
+             strcasecmp(field, "indicatordriveskbd") == 0 ||
+             strcasecmp(field, "indicatordriveskeyboard") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
+            return ReportIndicatorBadType(keymap, led, field, "boolean");
+
+        if (rtrn.uval)
+            led->flags |= XkbIM_LEDDrivesKB;
+        else
+            led->flags &= ~XkbIM_LEDDrivesKB;
+        led->defs.defined |= _LED_DrivesKbd;
+    }
+    else if (strcasecmp(field, "index") == 0) {
+        if (arrayNdx != NULL)
+            return ReportIndicatorNotArray(keymap, led, field);
+
+        if (!ExprResolveInteger(keymap->ctx, value, &rtrn))
+            return ReportIndicatorBadType(keymap, led, field,
+                                          "indicator index");
+
+        if (rtrn.uval < 1 || rtrn.uval > 32) {
+            ERROR("Illegal indicator index %d (range 1..%d)\n",
+                   rtrn.uval, XkbNumIndicators);
+            ACTION("Index definition for %s indicator ignored\n",
+                    xkb_atom_text(keymap->ctx, led->name));
+            return false;
+        }
+
+        led->indicator = rtrn.uval;
+        led->defs.defined |= _LED_Index;
+    }
+    else {
+        ERROR("Unknown field %s in map for %s indicator\n", field,
+               xkb_atom_text(keymap->ctx, led->name));
+        ACTION("Definition ignored\n");
+        ok = false;
+    }
+
+    return ok;
+}
+
 static int
 HandleInterpVar(VarDef * stmt, struct xkb_keymap *keymap, CompatInfo * info)
 {
@@ -643,6 +947,52 @@ HandleGroupCompatDef(GroupCompatDef *def, struct xkb_keymap *keymap,
     return AddGroupCompat(info, def->group - 1, &tmp);
 }
 
+static LEDInfo *
+HandleIndicatorMapDef(IndicatorMapDef *def, struct xkb_keymap *keymap,
+                      LEDInfo *dflt, LEDInfo *oldLEDs, enum merge_mode merge)
+{
+    LEDInfo led, *rtrn;
+    VarDef *var;
+    bool ok;
+
+    if (def->merge != MERGE_DEFAULT)
+        merge = def->merge;
+
+    led = *dflt;
+    led.defs.merge = merge;
+    led.name = def->name;
+
+    ok = true;
+    for (var = def->body; var != NULL; var = (VarDef *) var->common.next) {
+        ExprResult elem, field;
+        ExprDef *arrayNdx;
+        if (!ExprResolveLhs(keymap, var->name, &elem, &field, &arrayNdx)) {
+            ok = false;
+            continue;
+        }
+
+        if (elem.str != NULL) {
+            ERROR("Cannot set defaults for \"%s\" element in indicator map\n",
+                  elem.str);
+            ACTION("Assignment to %s.%s ignored\n", elem.str, field.str);
+            ok = false;
+        }
+        else {
+            ok = SetIndicatorMapField(&led, keymap, field.str, arrayNdx,
+                                      var->value) && ok;
+        }
+        free(elem.str);
+        free(field.str);
+    }
+
+    if (ok) {
+        rtrn = AddIndicatorMap(keymap, oldLEDs, &led);
+        return rtrn;
+    }
+
+    return NULL;
+}
+
 static void
 HandleCompatMapFile(XkbFile *file, struct xkb_keymap *keymap,
                     enum merge_mode merge,
@@ -724,6 +1074,138 @@ CopyInterps(CompatInfo *info, struct xkb_keymap *keymap,
     }
 }
 
+static void
+BindIndicators(struct xkb_keymap *keymap, LEDInfo *unbound)
+{
+    int i;
+    LEDInfo *led, *next, *last;
+
+    for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) {
+        if (led->indicator == _LED_NotBound) {
+            for (i = 0; i < XkbNumIndicators; i++) {
+                if (keymap->indicator_names[i] &&
+                    strcmp(keymap->indicator_names[i],
+                           xkb_atom_text(keymap->ctx, led->name)) == 0) {
+                    led->indicator = i + 1;
+                    break;
+                }
+            }
+        }
+    }
+
+    for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) {
+        if (led->indicator == _LED_NotBound) {
+            for (i = 0; i < XkbNumIndicators; i++) {
+                if (keymap->indicator_names[i] == NULL) {
+                    keymap->indicator_names[i] =
+                        xkb_atom_strdup(keymap->ctx, led->name);
+                    led->indicator = i + 1;
+                    break;
+                }
+            }
+
+            if (led->indicator == _LED_NotBound) {
+                ERROR("No unnamed indicators found\n");
+                ACTION("Virtual indicator map \"%s\" not bound\n",
+                       xkb_atom_text(keymap->ctx, led->name));
+                continue;
+            }
+        }
+    }
+
+    for (last = NULL, led = unbound; led != NULL; led = next) {
+        next = (LEDInfo *) led->defs.next;
+        if (led->indicator == _LED_NotBound) {
+            unbound = next;
+            free(led);
+        }
+        else {
+            if (strcmp(keymap->indicator_names[led->indicator - 1],
+                       xkb_atom_text(keymap->ctx, led->name)) != 0) {
+                const char *old = keymap->indicator_names[led->indicator - 1];
+                ERROR("Multiple names bound to indicator %d\n",
+                       (unsigned int) led->indicator);
+                ACTION("Using %s, ignoring %s\n", old,
+                       xkb_atom_text(keymap->ctx, led->name));
+                led->indicator = _LED_NotBound;
+                unbound = next;
+                free(led);
+            }
+            else {
+                struct xkb_indicator_map * map;
+                map = &keymap->indicators[led->indicator - 1];
+                map->flags = led->flags;
+                map->which_groups = led->which_groups;
+                map->groups = led->groups;
+                map->which_mods = led->which_mods;
+                map->mods.mask = led->real_mods;
+                map->mods.real_mods = led->real_mods;
+                map->mods.vmods = led->vmods;
+                map->ctrls = led->ctrls;
+                if (last)
+                    last->defs.next = &next->defs;
+                else
+                    unbound = next;
+                led->defs.next = NULL;
+                free(led);
+            }
+        }
+    }
+
+    for (led = unbound; led != NULL; led = next) {
+        next = led ? (LEDInfo *) led->defs.next : NULL;
+        free(led);
+    }
+}
+
+static bool
+CopyIndicatorMapDefs(struct xkb_keymap *keymap, LEDInfo *leds)
+{
+    LEDInfo *led, *next;
+    LEDInfo *unbound = NULL, *last = NULL;
+
+    for (led = leds; led != NULL; led = next) {
+        next = (LEDInfo *) led->defs.next;
+
+        if (led->groups != 0 && led->which_groups == 0)
+            led->which_groups = XkbIM_UseEffective;
+
+        if (led->which_mods == 0 && (led->real_mods || led->vmods))
+            led->which_mods = XkbIM_UseEffective;
+
+        if (led->indicator == _LED_NotBound || !keymap->indicators) {
+            led->defs.next = NULL;
+            if (last != NULL)
+                last->defs.next = (CommonInfo *) led;
+            else
+                unbound = led;
+            last = led;
+        }
+        else
+        {
+            struct xkb_indicator_map *im;
+            im = &keymap->indicators[led->indicator - 1];
+            im->flags = led->flags;
+            im->which_groups = led->which_groups;
+            im->groups = led->groups;
+            im->which_mods = led->which_mods;
+            im->mods.mask = led->real_mods;
+            im->mods.real_mods = led->real_mods;
+            im->mods.vmods = led->vmods;
+            im->ctrls = led->ctrls;
+            free(keymap->indicator_names[led->indicator - 1]);
+            keymap->indicator_names[led->indicator-1] =
+                xkb_atom_strdup(keymap->ctx, led->name);
+            free(led);
+        }
+    }
+
+    if (unbound)
+        BindIndicators(keymap, unbound);
+
+    return true;
+}
+
 bool
 CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap,
                  enum merge_mode merge)
diff --git a/src/xkbcomp/indicators.c b/src/xkbcomp/indicators.c
deleted file mode 100644 (file)
index 09ef851..0000000
+++ /dev/null
@@ -1,468 +0,0 @@
-/************************************************************
- * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of Silicon Graphics not be
- * used in advertising or publicity pertaining to distribution
- * of the software without specific prior written permission.
- * Silicon Graphics makes no representation about the suitability
- * of this software for any purpose. It is provided "as is"
- * without any express or implied warranty.
- *
- * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
- * THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- ********************************************************/
-
-#include "indicators.h"
-#include "expr.h"
-#include "action.h"
-
-/***====================================================================***/
-
-static inline bool
-ReportIndicatorBadType(struct xkb_keymap *keymap, LEDInfo *led,
-                       const char *field, const char *wanted)
-{
-    return ReportBadType("indicator map", field,
-                         xkb_atom_text(keymap->ctx, led->name), wanted);
-}
-
-static inline bool
-ReportIndicatorNotArray(struct xkb_keymap *keymap, LEDInfo *led,
-                        const char *field)
-{
-    return ReportNotArray("indicator map", field,
-                          xkb_atom_text(keymap->ctx, led->name));
-}
-
-/***====================================================================***/
-
-void
-ClearIndicatorMapInfo(struct xkb_context *ctx, LEDInfo * info)
-{
-    info->name = xkb_atom_intern(ctx, "default");
-    info->indicator = _LED_NotBound;
-    info->flags = info->which_mods = info->real_mods = 0;
-    info->vmods = 0;
-    info->which_groups = info->groups = 0;
-    info->ctrls = 0;
-}
-
-LEDInfo *
-AddIndicatorMap(struct xkb_keymap *keymap, LEDInfo *oldLEDs, LEDInfo *new)
-{
-    LEDInfo *old, *last;
-    unsigned collide;
-
-    last = NULL;
-    for (old = oldLEDs; old != NULL; old = (LEDInfo *) old->defs.next) {
-        if (old->name == new->name) {
-            if ((old->real_mods == new->real_mods) &&
-                (old->vmods == new->vmods) &&
-                (old->groups == new->groups) &&
-                (old->ctrls == new->ctrls) &&
-                (old->which_mods == new->which_mods) &&
-                (old->which_groups == new->which_groups)) {
-                old->defs.defined |= new->defs.defined;
-                return oldLEDs;
-            }
-            if (new->defs.merge == MERGE_REPLACE) {
-                CommonInfo *next = old->defs.next;
-                if (((old->defs.file_id == new->defs.file_id)
-                     && (warningLevel > 0)) || (warningLevel > 9)) {
-                    WARN("Map for indicator %s redefined\n",
-                         xkb_atom_text(keymap->ctx, old->name));
-                    ACTION("Earlier definition ignored\n");
-                }
-                *old = *new;
-                old->defs.next = next;
-                return oldLEDs;
-            }
-            collide = 0;
-            if (UseNewField(_LED_Index, &old->defs, &new->defs, &collide)) {
-                old->indicator = new->indicator;
-                old->defs.defined |= _LED_Index;
-            }
-            if (UseNewField(_LED_Mods, &old->defs, &new->defs, &collide)) {
-                old->which_mods = new->which_mods;
-                old->real_mods = new->real_mods;
-                old->vmods = new->vmods;
-                old->defs.defined |= _LED_Mods;
-            }
-            if (UseNewField(_LED_Groups, &old->defs, &new->defs, &collide)) {
-                old->which_groups = new->which_groups;
-                old->groups = new->groups;
-                old->defs.defined |= _LED_Groups;
-            }
-            if (UseNewField(_LED_Ctrls, &old->defs, &new->defs, &collide)) {
-                old->ctrls = new->ctrls;
-                old->defs.defined |= _LED_Ctrls;
-            }
-            if (UseNewField(_LED_Explicit, &old->defs, &new->defs,
-                            &collide)) {
-                old->flags &= ~XkbIM_NoExplicit;
-                old->flags |= (new->flags & XkbIM_NoExplicit);
-                old->defs.defined |= _LED_Explicit;
-            }
-            if (UseNewField(_LED_Automatic, &old->defs, &new->defs,
-                            &collide)) {
-                old->flags &= ~XkbIM_NoAutomatic;
-                old->flags |= (new->flags & XkbIM_NoAutomatic);
-                old->defs.defined |= _LED_Automatic;
-            }
-            if (UseNewField(_LED_DrivesKbd, &old->defs, &new->defs,
-                            &collide)) {
-                old->flags &= ~XkbIM_LEDDrivesKB;
-                old->flags |= (new->flags & XkbIM_LEDDrivesKB);
-                old->defs.defined |= _LED_DrivesKbd;
-            }
-            if (collide) {
-                WARN("Map for indicator %s redefined\n",
-                     xkb_atom_text(keymap->ctx, old->name));
-                ACTION("Using %s definition for duplicate fields\n",
-                       (new->defs.merge == MERGE_AUGMENT ? "first" : "last"));
-            }
-            return oldLEDs;
-        }
-        if (old->defs.next == NULL)
-            last = old;
-    }
-    /* new definition */
-    old = uTypedAlloc(LEDInfo);
-    if (!old) {
-        WSGO("Couldn't allocate indicator map\n");
-        ACTION("Map for indicator %s not compiled\n",
-               xkb_atom_text(keymap->ctx, new->name));
-        return NULL;
-    }
-    *old = *new;
-    old->defs.next = NULL;
-    if (last) {
-        last->defs.next = &old->defs;
-        return oldLEDs;
-    }
-    return old;
-}
-
-static const LookupEntry modComponentNames[] = {
-    { "base", XkbIM_UseBase },
-    { "latched", XkbIM_UseLatched },
-    { "locked", XkbIM_UseLocked },
-    { "effective", XkbIM_UseEffective },
-    { "compat", XkbIM_UseCompat },
-    { "any", XkbIM_UseAnyMods },
-    { "none", 0 },
-    { NULL, 0 }
-};
-static const LookupEntry groupComponentNames[] = {
-    { "base", XkbIM_UseBase },
-    { "latched", XkbIM_UseLatched },
-    { "locked", XkbIM_UseLocked },
-    { "effective", XkbIM_UseEffective },
-    { "any", XkbIM_UseAnyGroup },
-    { "none", 0 },
-    { NULL, 0 }
-};
-
-static const LookupEntry groupNames[] = {
-    { "group1", 0x01 },
-    { "group2", 0x02 },
-    { "group3", 0x04 },
-    { "group4", 0x08 },
-    { "group5", 0x10 },
-    { "group6", 0x20 },
-    { "group7", 0x40 },
-    { "group8", 0x80 },
-    { "none", 0x00 },
-    { "all", 0xff },
-    { NULL, 0 }
-};
-
-int
-SetIndicatorMapField(LEDInfo *led, struct xkb_keymap *keymap,
-                     char *field, ExprDef *arrayNdx, ExprDef *value)
-{
-    ExprResult rtrn;
-    bool ok;
-
-    ok = true;
-    if ((strcasecmp(field, "modifiers") == 0) ||
-        (strcasecmp(field, "mods") == 0)) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveVModMask(value, &rtrn, keymap))
-            return ReportIndicatorBadType(keymap, led, field, "modifier mask");
-        led->real_mods = rtrn.uval & 0xff;
-        led->vmods = (rtrn.uval >> 8) & 0xff;
-        led->defs.defined |= _LED_Mods;
-    }
-    else if (strcasecmp(field, "groups") == 0) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveMask(keymap->ctx, value, &rtrn, groupNames))
-            return ReportIndicatorBadType(keymap, led, field, "group mask");
-        led->groups = rtrn.uval;
-        led->defs.defined |= _LED_Groups;
-    }
-    else if ((strcasecmp(field, "controls") == 0) ||
-             (strcasecmp(field, "ctrls") == 0)) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveMask(keymap->ctx, value, &rtrn, ctrlNames))
-            return ReportIndicatorBadType(keymap, led, field,
-                                          "controls mask");
-        led->ctrls = rtrn.uval;
-        led->defs.defined |= _LED_Ctrls;
-    }
-    else if (strcasecmp(field, "allowexplicit") == 0) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
-            return ReportIndicatorBadType(keymap, led, field, "boolean");
-        if (rtrn.uval)
-            led->flags &= ~XkbIM_NoExplicit;
-        else
-            led->flags |= XkbIM_NoExplicit;
-        led->defs.defined |= _LED_Explicit;
-    }
-    else if ((strcasecmp(field, "whichmodstate") == 0) ||
-             (strcasecmp(field, "whichmodifierstate") == 0)) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveMask(keymap->ctx, value, &rtrn, modComponentNames)) {
-            return ReportIndicatorBadType(keymap, led, field,
-                                          "mask of modifier state components");
-        }
-        led->which_mods = rtrn.uval;
-    }
-    else if (strcasecmp(field, "whichgroupstate") == 0) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveMask(keymap->ctx, value, &rtrn,
-                             groupComponentNames)) {
-            return ReportIndicatorBadType(keymap, led, field,
-                                          "mask of group state components");
-        }
-        led->which_groups = rtrn.uval;
-    }
-    else if ((strcasecmp(field, "driveskbd") == 0) ||
-             (strcasecmp(field, "driveskeyboard") == 0) ||
-             (strcasecmp(field, "leddriveskbd") == 0) ||
-             (strcasecmp(field, "leddriveskeyboard") == 0) ||
-             (strcasecmp(field, "indicatordriveskbd") == 0) ||
-             (strcasecmp(field, "indicatordriveskeyboard") == 0)) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveBoolean(keymap->ctx, value, &rtrn))
-            return ReportIndicatorBadType(keymap, led, field, "boolean");
-        if (rtrn.uval)
-            led->flags |= XkbIM_LEDDrivesKB;
-        else
-            led->flags &= ~XkbIM_LEDDrivesKB;
-        led->defs.defined |= _LED_DrivesKbd;
-    }
-    else if (strcasecmp(field, "index") == 0) {
-        if (arrayNdx != NULL)
-            return ReportIndicatorNotArray(keymap, led, field);
-        if (!ExprResolveInteger(keymap->ctx, value, &rtrn))
-            return ReportIndicatorBadType(keymap, led, field,
-                                          "indicator index");
-        if ((rtrn.uval < 1) || (rtrn.uval > 32)) {
-            ERROR("Illegal indicator index %d (range 1..%d)\n",
-                  rtrn.uval, XkbNumIndicators);
-            ACTION("Index definition for %s indicator ignored\n",
-                   xkb_atom_text(keymap->ctx, led->name));
-            return false;
-        }
-        led->indicator = rtrn.uval;
-        led->defs.defined |= _LED_Index;
-    }
-    else {
-        ERROR("Unknown field %s in map for %s indicator\n", field,
-              xkb_atom_text(keymap->ctx, led->name));
-        ACTION("Definition ignored\n");
-        ok = false;
-    }
-    return ok;
-}
-
-LEDInfo *
-HandleIndicatorMapDef(IndicatorMapDef *def, struct xkb_keymap *keymap,
-                      LEDInfo *dflt, LEDInfo *oldLEDs, enum merge_mode merge)
-{
-    LEDInfo led, *rtrn;
-    VarDef *var;
-    bool ok;
-
-    if (def->merge != MERGE_DEFAULT)
-        merge = def->merge;
-
-    led = *dflt;
-    led.defs.merge = merge;
-    led.name = def->name;
-
-    ok = true;
-    for (var = def->body; var != NULL; var = (VarDef *) var->common.next) {
-        ExprResult elem, field;
-        ExprDef *arrayNdx;
-        if (!ExprResolveLhs(keymap, var->name, &elem, &field, &arrayNdx)) {
-            ok = false;
-            continue;
-        }
-        if (elem.str != NULL) {
-            ERROR
-                ("Cannot set defaults for \"%s\" element in indicator map\n",
-                elem.str);
-            ACTION("Assignment to %s.%s ignored\n", elem.str, field.str);
-            ok = false;
-        }
-        else {
-            ok = SetIndicatorMapField(&led, keymap, field.str, arrayNdx,
-                                      var->value) && ok;
-        }
-        free(elem.str);
-        free(field.str);
-    }
-    if (ok) {
-        rtrn = AddIndicatorMap(keymap, oldLEDs, &led);
-        return rtrn;
-    }
-    return NULL;
-}
-
-static void
-BindIndicators(struct xkb_keymap *keymap, LEDInfo *unbound)
-{
-    int i;
-    LEDInfo *led, *next, *last;
-
-    for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) {
-        if (led->indicator == _LED_NotBound) {
-            for (i = 0; i < XkbNumIndicators; i++) {
-                if (keymap->indicator_names[i] &&
-                    strcmp(keymap->indicator_names[i],
-                           xkb_atom_text(keymap->ctx, led->name)) == 0) {
-                    led->indicator = i + 1;
-                    break;
-                }
-            }
-        }
-    }
-
-    for (led = unbound; led != NULL; led = (LEDInfo *) led->defs.next) {
-        if (led->indicator == _LED_NotBound) {
-            for (i = 0; i < XkbNumIndicators; i++) {
-                if (keymap->indicator_names[i] == NULL) {
-                    keymap->indicator_names[i] =
-                        xkb_atom_strdup(keymap->ctx, led->name);
-                    led->indicator = i + 1;
-                    break;
-                }
-            }
-            if (led->indicator == _LED_NotBound) {
-                ERROR("No unnamed indicators found\n");
-                ACTION("Virtual indicator map \"%s\" not bound\n",
-                       xkb_atom_text(keymap->ctx, led->name));
-                continue;
-            }
-        }
-    }
-    for (last = NULL, led = unbound; led != NULL; led = next) {
-        next = (LEDInfo *) led->defs.next;
-        if (led->indicator == _LED_NotBound) {
-            unbound = next;
-            free(led);
-        }
-        else {
-            if (strcmp(keymap->indicator_names[led->indicator - 1],
-                       xkb_atom_text(keymap->ctx, led->name)) != 0) {
-                const char *old = keymap->indicator_names[led->indicator - 1];
-                ERROR("Multiple names bound to indicator %d\n",
-                      (unsigned int) led->indicator);
-                ACTION("Using %s, ignoring %s\n", old,
-                       xkb_atom_text(keymap->ctx, led->name));
-                led->indicator = _LED_NotBound;
-                unbound = next;
-                free(led);
-            }
-            else {
-                struct xkb_indicator_map * map;
-                map = &keymap->indicators[led->indicator - 1];
-                map->flags = led->flags;
-                map->which_groups = led->which_groups;
-                map->groups = led->groups;
-                map->which_mods = led->which_mods;
-                map->mods.mask = led->real_mods;
-                map->mods.real_mods = led->real_mods;
-                map->mods.vmods = led->vmods;
-                map->ctrls = led->ctrls;
-                if (last)
-                    last->defs.next = &next->defs;
-                else
-                    unbound = next;
-                led->defs.next = NULL;
-                free(led);
-            }
-        }
-    }
-
-    for (led = unbound; led != NULL; led = next) {
-        next = led ? (LEDInfo *) led->defs.next : NULL;
-        free(led);
-    }
-}
-
-bool
-CopyIndicatorMapDefs(struct xkb_keymap *keymap, LEDInfo *leds)
-{
-    LEDInfo *led, *next;
-    LEDInfo *unbound = NULL, *last = NULL;
-
-    for (led = leds; led != NULL; led = next) {
-        next = (LEDInfo *) led->defs.next;
-        if ((led->groups != 0) && (led->which_groups == 0))
-            led->which_groups = XkbIM_UseEffective;
-        if ((led->which_mods == 0) && ((led->real_mods) || (led->vmods)))
-            led->which_mods = XkbIM_UseEffective;
-        if ((led->indicator == _LED_NotBound) || (!keymap->indicators)) {
-            led->defs.next = NULL;
-            if (last != NULL)
-                last->defs.next = (CommonInfo *) led;
-            else
-                unbound = led;
-            last = led;
-        }
-        else {
-            struct xkb_indicator_map * im;
-            im = &keymap->indicators[led->indicator - 1];
-            im->flags = led->flags;
-            im->which_groups = led->which_groups;
-            im->groups = led->groups;
-            im->which_mods = led->which_mods;
-            im->mods.mask = led->real_mods;
-            im->mods.real_mods = led->real_mods;
-            im->mods.vmods = led->vmods;
-            im->ctrls = led->ctrls;
-            free(keymap->indicator_names[led->indicator - 1]);
-            keymap->indicator_names[led->indicator - 1] =
-                xkb_atom_strdup(keymap->ctx, led->name);
-            free(led);
-        }
-    }
-
-    if (unbound)
-        BindIndicators(keymap, unbound);
-
-    return true;
-}
diff --git a/src/xkbcomp/indicators.h b/src/xkbcomp/indicators.h
deleted file mode 100644 (file)
index 707096c..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/************************************************************
- * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting
- * documentation, and that the name of Silicon Graphics not be
- * used in advertising or publicity pertaining to distribution
- * of the software without specific prior written permission.
- * Silicon Graphics makes no representation about the suitability
- * of this software for any purpose. It is provided "as is"
- * without any express or implied warranty.
- *
- * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
- * THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- ********************************************************/
-
-#ifndef INDICATORS_H
-#define INDICATORS_H 1
-
-#include "xkbcomp-priv.h"
-
-#define _LED_Index     (1 << 0)
-#define _LED_Mods      (1 << 1)
-#define _LED_Groups    (1 << 2)
-#define _LED_Ctrls     (1 << 3)
-#define _LED_Explicit  (1 << 4)
-#define _LED_Automatic (1 << 5)
-#define _LED_DrivesKbd (1 << 6)
-
-#define _LED_NotBound  255
-
-typedef struct _LEDInfo {
-    CommonInfo defs;
-    xkb_atom_t name;
-    unsigned char indicator;
-    unsigned char flags;
-    unsigned char which_mods;
-    unsigned char real_mods;
-    unsigned short vmods;
-    unsigned char which_groups;
-    unsigned char groups;
-    unsigned int ctrls;
-} LEDInfo;
-
-extern void
-ClearIndicatorMapInfo(struct xkb_context *ctx, LEDInfo *info);
-
-extern LEDInfo *
-AddIndicatorMap(struct xkb_keymap *keymap, LEDInfo *oldLEDs, LEDInfo *newLED);
-
-extern int
-SetIndicatorMapField(LEDInfo *led, struct xkb_keymap *keymap, char *field,
-                     ExprDef *arrayNdx,
-                     ExprDef *value);
-
-extern LEDInfo *
-HandleIndicatorMapDef(IndicatorMapDef *stmt, struct xkb_keymap *keymap,
-                      LEDInfo *dflt, LEDInfo *oldLEDs,
-                      enum merge_mode mergeMode);
-
-extern bool
-CopyIndicatorMapDefs(struct xkb_keymap *keymap, LEDInfo *leds);
-#endif /* INDICATORS_H */