#include <X11/Xfuncproto.h>
#include <X11/extensions/XKB.h>
-#ifndef X_PROTOCOL
-typedef unsigned char KeyCode;
-#endif
+typedef uint8_t xkb_keycode_t;
+
+#define XKB_KEYCODE_MAX 255
+#define xkb_keycode_is_legal_ext(kc) (kc <= XKB_KEYCODE_MAX)
+#define xkb_keycode_is_legal_x11(kc) (kc <= XKB_KEYCODE_MAX)
+#define xkb_keymap_keycode_range_is_legal(xkb) \
+ (xkb->max_key_code > 0 && \
+ xkb->max_key_code > xkb->min_key_code && \
+ xkb_keycode_is_legal_ext(xkb->min_key_code) && \
+ xkb_keycode_is_legal_ext(xkb->max_key_code))
/* Duplicate the modifier mask defines so libxkcommon can be used
* without X.h */
struct xkb_redirect_key_action {
uint8_t type;
- uint8_t new_key;
+ xkb_keycode_t new_key;
uint8_t mods_mask;
uint8_t mods;
uint16_t vmods_mask;
unsigned char num_types;
struct xkb_key_type * types;
- unsigned short size_syms;
- unsigned short num_syms;
+ uint32_t size_syms;
+ uint32_t num_syms;
uint32_t *syms;
struct xkb_sym_map * key_sym_map;
uint32_t *radio_groups;
uint32_t phys_symbols;
- unsigned char num_keys;
- unsigned char num_key_aliases;
+ xkb_keycode_t num_keys;
+ xkb_keycode_t num_key_aliases;
unsigned short num_rg;
};
unsigned short axt_opts_values;
unsigned int axt_ctrls_mask;
unsigned int axt_ctrls_values;
- unsigned char per_key_repeat[XkbPerKeyBitArraySize];
+ unsigned char *per_key_repeat;
};
/* Common keyboard description structure */
unsigned int defined;
unsigned short flags;
unsigned short device_spec;
- KeyCode min_key_code;
- KeyCode max_key_code;
+ xkb_keycode_t min_key_code;
+ xkb_keycode_t max_key_code;
struct xkb_controls * ctrls;
struct xkb_server_map * server;
struct xkb_map_changes {
unsigned short changed;
- KeyCode min_key_code;
- KeyCode max_key_code;
+ xkb_keycode_t min_key_code;
+ xkb_keycode_t max_key_code;
unsigned char first_type;
unsigned char num_types;
- KeyCode first_key_sym;
- unsigned char num_key_syms;
- KeyCode first_key_act;
- unsigned char num_key_acts;
- KeyCode first_key_behavior;
- unsigned char num_key_behaviors;
- KeyCode first_key_explicit;
- unsigned char num_key_explicit;
- KeyCode first_modmap_key;
- unsigned char num_modmap_keys;
- KeyCode first_vmodmap_key;
- unsigned char num_vmodmap_keys;
- unsigned char pad;
+ xkb_keycode_t first_key_sym;
+ xkb_keycode_t num_key_syms;
+ xkb_keycode_t first_key_act;
+ xkb_keycode_t num_key_acts;
+ xkb_keycode_t first_key_behavior;
+ xkb_keycode_t num_key_behaviors;
+ xkb_keycode_t first_key_explicit;
+ xkb_keycode_t num_key_explicit;
+ xkb_keycode_t first_modmap_key;
+ xkb_keycode_t num_modmap_keys;
+ xkb_keycode_t first_vmodmap_key;
+ xkb_keycode_t num_vmodmap_keys;
unsigned short vmods;
};
unsigned char num_types;
unsigned char first_lvl;
unsigned char num_lvls;
- unsigned char num_aliases;
+ xkb_keycode_t num_aliases;
unsigned char num_rg;
- unsigned char first_key;
- unsigned char num_keys;
+ xkb_keycode_t first_key;
+ xkb_keycode_t num_keys;
unsigned short changed_vmods;
unsigned long changed_indicators;
unsigned char changed_groups;
}
if ((which & XkbKeyNamesMask) && !names->keys) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
- return BadValue;
+ if (!xkb_keymap_keycode_range_is_legal(xkb))
+ return BadMatch;
names->keys = _XkbTypedCalloc(xkb->max_key_code + 1, struct xkb_key_name);
if (!names->keys)
return BadAlloc;
}
+ if (!xkb->ctrls->per_key_repeat) {
+ xkb->ctrls->per_key_repeat = _XkbTypedCalloc(xkb->max_key_code << 3,
+ unsigned char);
+ if (!xkb->ctrls->per_key_repeat)
+ return BadAlloc;
+ }
+
return Success;
}
if (!xkb || ((nTotalTypes > 0) && (nTotalTypes < XkbNumRequiredTypes)))
return BadValue;
- if ((which & XkbKeySymsMask) &&
- ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))) {
+ if ((which & XkbKeySymsMask) && !xkb_keymap_keycode_range_is_legal(xkb)) {
#ifdef DEBUG
fprintf(stderr, "bad keycode (%d,%d) in XkbAllocClientMap\n",
xkb->min_key_code, xkb->max_key_code);
}
if (which & XkbModifierMapMask) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
+ if (!xkb_keymap_keycode_range_is_legal(xkb))
return BadMatch;
if (!map->modmap) {
else
map = xkb->server;
- if (which & XkbExplicitComponentsMask) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
- return BadMatch;
+ if (!which)
+ return Success;
+
+ if (!xkb_keymap_keycode_range_is_legal(xkb))
+ return BadMatch;
+ if (which & XkbExplicitComponentsMask) {
if (!map->explicit) {
i = xkb->max_key_code + 1;
map->explicit = _XkbTypedCalloc(i, unsigned char);
}
if (which&XkbKeyActionsMask) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
- return BadMatch;
-
if (nNewActions < 1)
nNewActions = 1;
}
if (which & XkbKeyBehaviorsMask) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
- return BadMatch;
-
if (!map->behaviors) {
i = xkb->max_key_code + 1;
map->behaviors = _XkbTypedCalloc(i, struct xkb_behavior);
}
if (which & XkbVirtualModMapMask) {
- if ((!XkbIsLegalKeycode(xkb->min_key_code)) ||
- (!XkbIsLegalKeycode(xkb->max_key_code)) ||
- (xkb->max_key_code < xkb->min_key_code))
- return BadMatch;
-
if (!map->vmodmap) {
i = xkb->max_key_code + 1;
map->vmodmap = _XkbTypedCalloc(i, uint32_t);
}
uint32_t *
-XkbcResizeKeySyms(struct xkb_desc * xkb, int key, int needed)
+XkbcResizeKeySyms(struct xkb_desc * xkb, xkb_keycode_t key,
+ unsigned int needed)
{
- int i, nSyms, nKeySyms;
- unsigned nOldSyms;
+ uint32_t i, nSyms, nKeySyms;
+ uint32_t nOldSyms;
uint32_t *newSyms;
if (needed == 0) {
}
nOldSyms = XkbKeyNumSyms(xkb, key);
- if (nOldSyms >= (unsigned)needed)
+ if (nOldSyms >= needed)
return XkbKeySymsPtr(xkb, key);
- if (xkb->map->size_syms - xkb->map->num_syms >= (unsigned)needed) {
+ if (xkb->map->size_syms - xkb->map->num_syms >= needed) {
if (nOldSyms > 0)
memcpy(&xkb->map->syms[xkb->map->num_syms],
XkbKeySymsPtr(xkb, key), nOldSyms * sizeof(uint32_t));
}
union xkb_action *
-XkbcResizeKeyActions(struct xkb_desc * xkb, int key, int needed)
+XkbcResizeKeyActions(struct xkb_desc * xkb, xkb_keycode_t key, int needed)
{
- int i, nActs;
+ xkb_keycode_t i, nActs;
union xkb_action *newActs;
if (needed == 0) {
nActs = 1;
for (i = xkb->min_key_code; i <= xkb->max_key_code; i++) {
- int nKeyActs, nCopy;
+ xkb_keycode_t nKeyActs, nCopy;
if ((xkb->server->key_acts[i] == 0) && (i != key))
continue;
XkbcCopyKeyType(struct xkb_key_type * from, struct xkb_key_type *into);
extern uint32_t *
-XkbcResizeKeySyms(struct xkb_desc * xkb, int key, int needed);
+XkbcResizeKeySyms(struct xkb_desc * xkb, xkb_keycode_t key, uint32_t needed);
extern union xkb_action *
-XkbcResizeKeyActions(struct xkb_desc * xkb, int key, int needed);
+XkbcResizeKeyActions(struct xkb_desc * xkb, xkb_keycode_t key, int needed);
extern void
XkbcFreeClientMap(struct xkb_desc * xkb, unsigned what, Bool freeMap);
ExprResult rtrn;
struct xkb_redirect_key_action *act;
unsigned t1, t2;
+ xkb_keycode_t kc;
unsigned long tmp;
if (array_ndx != NULL)
if (!ExprResolveKeyName(value, &rtrn, NULL, NULL))
return ReportMismatch(action->type, field, "key name");
tmp = KeyNameToLong(rtrn.keyName.name);
- if (!FindNamedKey(xkb, tmp, &t1, True, CreateKeyNames(xkb), 0))
+ if (!FindNamedKey(xkb, tmp, &kc, True, CreateKeyNames(xkb), 0))
{
return ReportNotFound(action->type, field, "Key",
XkbcKeyNameText(rtrn.keyName.name));
}
- act->new_key = t1;
+ act->new_key = kc;
return True;
case F_ModsToClear:
case F_Modifiers:
info = (AliasInfo *) info->def.next)
{
unsigned long lname;
- unsigned int kc;
+ xkb_keycode_t kc;
lname = KeyNameToLong(info->real);
if (!FindNamedKey(xkb, lname, &kc, False, CreateKeyNames(xkb), 0))
}
int
+ExprResolveKeyCode(ExprDef * expr,
+ ExprResult * val_rtrn)
+{
+ ExprResult leftRtrn, rightRtrn;
+ ExprDef *left, *right;
+
+ switch (expr->op)
+ {
+ case ExprValue:
+ if (expr->type != TypeInt)
+ {
+ ERROR
+ ("Found constant of type %s where an int was expected\n",
+ exprTypeText(expr->type));
+ return False;
+ }
+ val_rtrn->uval = expr->value.uval;
+ return True;
+ case OpAdd:
+ case OpSubtract:
+ case OpMultiply:
+ case OpDivide:
+ left = expr->value.binary.left;
+ right = expr->value.binary.right;
+ if (ExprResolveKeyCode(left, &leftRtrn) &&
+ ExprResolveKeyCode(right, &rightRtrn))
+ {
+ switch (expr->op)
+ {
+ case OpAdd:
+ val_rtrn->uval = leftRtrn.uval + rightRtrn.uval;
+ break;
+ case OpSubtract:
+ val_rtrn->uval = leftRtrn.uval - rightRtrn.uval;
+ break;
+ case OpMultiply:
+ val_rtrn->uval = leftRtrn.uval * rightRtrn.uval;
+ break;
+ case OpDivide:
+ val_rtrn->uval = leftRtrn.uval / rightRtrn.uval;
+ break;
+ }
+ return True;
+ }
+ return False;
+ case OpNegate:
+ left = expr->value.child;
+ if (ExprResolveKeyCode(left, &leftRtrn))
+ {
+ val_rtrn->uval = ~leftRtrn.uval;
+ return True;
+ }
+ return False;
+ case OpUnaryPlus:
+ left = expr->value.child;
+ return ExprResolveKeyCode(left, val_rtrn);
+ default:
+ WSGO("Unknown operator %d in ResolveInteger\n", expr->op);
+ break;
+ }
+ return False;
+}
+int
ExprResolveInteger(ExprDef * expr,
ExprResult * val_rtrn,
IdentLookupFunc lookup, char * lookupPriv)
char * /* lookupPriv */
);
+extern int ExprResolveKeyCode(ExprDef * /* expr */ ,
+ ExprResult * /* val_rtrn */
+ );
+
extern int ExprResolveInteger(ExprDef * /* expr */ ,
ExprResult * /* val_rtrn */ ,
IdentLookupFunc /* lookup */ ,
int errorCount;
unsigned fileID;
unsigned merge;
- int computedMin; /* lowest keycode stored */
- int computedMax; /* highest keycode stored */
- int explicitMin;
- int explicitMax;
- int effectiveMin;
- int effectiveMax;
- unsigned long names[XkbMaxLegalKeyCode + 1]; /* 4-letter name of key, keycode is the index */
- unsigned files[XkbMaxLegalKeyCode + 1];
- unsigned char has_alt_forms[XkbMaxLegalKeyCode + 1];
+ xkb_keycode_t computedMin; /* lowest keycode stored */
+ xkb_keycode_t computedMax; /* highest keycode stored */
+ xkb_keycode_t explicitMin;
+ xkb_keycode_t explicitMax;
+ xkb_keycode_t arraySize;
+ unsigned long *names;
+ unsigned *files;
+ unsigned char *has_alt_forms;
IndicatorNameInfo *leds;
AliasInfo *aliases;
} KeyNamesInfo;
unsigned merge,
KeyNamesInfo * info);
+static int
+ResizeKeyNameArrays(KeyNamesInfo *info, int newMax)
+{
+ void *tmp;
+ int i;
+
+ tmp = _XkbTypedRealloc(info->names, newMax + 1, unsigned long);
+ if (!tmp) {
+ ERROR
+ ("Couldn't reallocate for larger maximum keycode (%d)\n",
+ newMax);
+ ACTION("Maximum key value not changed\n");
+ return 0;
+ }
+ info->names = tmp;
+ for (i = info->arraySize + 1; i <= newMax; i++)
+ info->names[i] = 0;
+
+ tmp = _XkbTypedRealloc(info->files, newMax + 1, unsigned);
+ if (!tmp) {
+ ERROR
+ ("Couldn't reallocate for larger maximum keycode (%d)\n",
+ newMax);
+ ACTION("Maximum key value not changed\n");
+ return 0;
+ }
+ info->files = tmp;
+ for (i = info->arraySize + 1; i <= newMax; i++)
+ info->files[i] = 0;
+
+ tmp = _XkbTypedRealloc(info->has_alt_forms, newMax + 1, unsigned char);
+ if (!tmp) {
+ ERROR
+ ("Couldn't reallocate for larger maximum keycode (%d)\n",
+ newMax);
+ ACTION("Maximum key value not changed\n");
+ return 0;
+ }
+ info->has_alt_forms = tmp;
+ for (i = info->arraySize + 1; i <= newMax; i++)
+ info->has_alt_forms[i] = 0;
+
+ info->arraySize = newMax;
+
+ return 1;
+}
+
static void
InitIndicatorNameInfo(IndicatorNameInfo * ii, KeyNamesInfo * info)
{
if (info->name != NULL)
free(info->name);
info->name = NULL;
- info->computedMax = info->explicitMax = info->explicitMin = -1;
- info->computedMin = 256;
- info->effectiveMin = 8;
- info->effectiveMax = 255;
- bzero((char *) info->names, sizeof(info->names));
- bzero((char *) info->files, sizeof(info->files));
- bzero((char *) info->has_alt_forms, sizeof(info->has_alt_forms));
+ info->computedMax = info->explicitMax = info->explicitMin = 0;
+ info->computedMin = XKB_KEYCODE_MAX;
+ info->arraySize = 0;
+ free(info->names);
+ info->names = NULL;
+ free(info->files);
+ info->files = NULL;
+ free(info->has_alt_forms);
+ info->has_alt_forms = NULL;
if (info->leds)
ClearIndicatorNameInfo(info->leds, info);
if (info->aliases)
info->name = NULL;
info->leds = NULL;
info->aliases = NULL;
+ info->names = NULL;
+ info->files = NULL;
+ info->has_alt_forms = NULL;
ClearKeyNamesInfo(info);
info->errorCount = 0;
return;
{
register int i;
- for (i = info->effectiveMin; i <= info->effectiveMax; i++)
+ for (i = info->computedMin; i <= info->computedMax; i++)
{
if (info->names[i] == name)
return i;
*/
static Bool
AddKeyName(KeyNamesInfo * info,
- int kc,
+ xkb_keycode_t kc,
char *name, unsigned merge, unsigned fileID, Bool reportCollisions)
{
int old;
unsigned long lval;
- if ((kc < info->effectiveMin) || (kc > info->effectiveMax))
- {
- ERROR("Illegal keycode %d for name <%s>\n", kc, name);
- ACTION("Must be in the range %d-%d inclusive\n",
- info->effectiveMin, info->effectiveMax);
+ if (kc > info->arraySize && !ResizeKeyNameArrays(info, kc)) {
+ ERROR("Couldn't resize KeyNames arrays for keycode %d\n", kc);
+ ACTION("Ignoring key %d\n", kc);
return False;
}
if (kc < info->computedMin)
into->name = from->name;
from->name = NULL;
}
+ if (from->computedMax > into->arraySize &&
+ !ResizeKeyNameArrays(into, from->computedMax)) {
+ ERROR("Couldn't resize KeyNames arrays for key %d\n",
+ from->computedMax);
+ ACTION("Ignoring include file %s\n", from->name);
+ into->errorCount += 10;
+ return;
+ }
for (i = from->computedMin; i <= from->computedMax; i++)
{
unsigned thisMerge;
}
if (!MergeAliases(&into->aliases, &from->aliases, merge))
into->errorCount++;
- if (from->explicitMin > 0)
+ if (from->explicitMin != 0)
{
if ((into->explicitMin < 0)
|| (into->explicitMin > from->explicitMin))
- into->effectiveMin = into->explicitMin = from->explicitMin;
+ into->explicitMin = from->explicitMin;
}
if (from->explicitMax > 0)
{
if ((into->explicitMax < 0)
|| (into->explicitMax < from->explicitMax))
- into->effectiveMax = into->explicitMax = from->explicitMax;
+ into->explicitMax = from->explicitMax;
}
return;
}
else if (strcmp(stmt->file, "computed") == 0)
{
xkb->flags |= AutoKeyNames;
- info->explicitMin = XkbMinLegalKeyCode;
- info->explicitMax = XkbMaxLegalKeyCode;
+ info->explicitMin = 0;
+ info->explicitMax = XKB_KEYCODE_MAX;
return (info->errorCount == 0);
} /* parse file, store returned info in the xkb struct */
else if (ProcessIncludeFile(stmt, XkmKeyNamesIndex, &rtrn, &newMerge))
int code;
ExprResult result;
- if (!ExprResolveInteger(stmt->value, &result, NULL, NULL))
+ if (!ExprResolveKeyCode(stmt->value, &result))
{
ACTION("No value keycode assigned to name <%s>\n", stmt->name);
return 0;
}
- code = result.ival;
- if ((code < info->effectiveMin) || (code > info->effectiveMax))
+ code = result.uval;
+ if ((info->explicitMin != 0 && code < info->explicitMin) ||
+ (info->explicitMax != 0 && code > info->explicitMax))
{
ERROR("Illegal keycode %d for name <%s>\n", code, stmt->name);
ACTION("Must be in the range %d-%d inclusive\n",
- info->effectiveMin, info->effectiveMax);
+ info->explicitMin,
+ info->explicitMax ? info->explicitMax : XKB_KEYCODE_MAX);
return 0;
}
if (stmt->merge != MergeDefault)
/**
* Handle the minimum/maximum statement of the xkb file.
- * Sets explicitMin/Max and effectiveMin/Max of the info struct.
+ * Sets explicitMin/Max of the info struct.
*
* @return 1 on success, 0 otherwise.
*/
return 0;
}
- if (ExprResolveInteger(stmt->value, &tmp, NULL, NULL) == 0)
+ if (ExprResolveKeyCode(stmt->value, &tmp) == 0)
{
ACTION("Assignment to field %s ignored\n", field.str);
return 0;
}
- if ((tmp.ival < XkbMinLegalKeyCode) || (tmp.ival > XkbMaxLegalKeyCode))
+ if (tmp.uval > XKB_KEYCODE_MAX)
{
ERROR
("Illegal keycode %d (must be in the range %d-%d inclusive)\n",
- tmp.ival, XkbMinLegalKeyCode, XkbMaxLegalKeyCode);
+ tmp.uval, 0, XKB_KEYCODE_MAX);
ACTION("Value of \"%s\" not changed\n", field.str);
return 0;
}
if (which == MIN_KEYCODE_DEF)
{
- if ((info->explicitMax > 0) && (info->explicitMax < tmp.ival))
+ if ((info->explicitMax > 0) && (info->explicitMax < tmp.uval))
{
ERROR
("Minimum key code (%d) must be <= maximum key code (%d)\n",
- tmp.ival, info->explicitMax);
+ tmp.uval, info->explicitMax);
ACTION("Minimum key code value not changed\n");
return 0;
}
- if ((info->computedMax > 0) && (info->computedMin < tmp.ival))
+ if ((info->computedMax > 0) && (info->computedMin < tmp.uval))
{
ERROR
("Minimum key code (%d) must be <= lowest defined key (%d)\n",
- tmp.ival, info->computedMin);
+ tmp.uval, info->computedMin);
ACTION("Minimum key code value not changed\n");
return 0;
}
- info->explicitMin = tmp.ival;
- info->effectiveMin = tmp.ival;
+ info->explicitMin = tmp.uval;
}
if (which == MAX_KEYCODE_DEF)
{
- if ((info->explicitMin > 0) && (info->explicitMin > tmp.ival))
+ if ((info->explicitMin > 0) && (info->explicitMin > tmp.uval))
{
ERROR("Maximum code (%d) must be >= minimum key code (%d)\n",
- tmp.ival, info->explicitMin);
+ tmp.uval, info->explicitMin);
ACTION("Maximum code value not changed\n");
return 0;
}
- if ((info->computedMax > 0) && (info->computedMax > tmp.ival))
+ if ((info->computedMax > 0) && (info->computedMax > tmp.uval))
{
ERROR
("Maximum code (%d) must be >= highest defined key (%d)\n",
- tmp.ival, info->computedMax);
+ tmp.uval, info->computedMax);
ACTION("Maximum code value not changed\n");
return 0;
}
- info->explicitMax = tmp.ival;
- info->effectiveMax = tmp.ival;
+ info->explicitMax = tmp.uval;
}
return 1;
}
if (info.errorCount == 0)
{
if (info.explicitMin > 0) /* if "minimum" statement was present */
- xkb->min_key_code = info.effectiveMin;
+ xkb->min_key_code = info.explicitMin;
else
xkb->min_key_code = info.computedMin;
if (info.explicitMax > 0) /* if "maximum" statement was present */
- xkb->max_key_code = info.effectiveMax;
+ xkb->max_key_code = info.explicitMax;
else
xkb->max_key_code = info.computedMax;
if (XkbcAllocNames(xkb, XkbKeyNamesMask | XkbIndicatorNamesMask, 0, 0)
Bool
FindNamedKey(struct xkb_desc * xkb,
unsigned long name,
- unsigned int *kc_rtrn,
+ xkb_keycode_t *kc_rtrn,
Bool use_aliases, Bool create, int start_from)
{
register unsigned n;
{
if ((!xkb->names) || (!xkb->names->keys))
{
- if (xkb->min_key_code < XkbMinLegalKeyCode)
- {
- xkb->min_key_code = XkbMinLegalKeyCode;
- xkb->max_key_code = XkbMaxLegalKeyCode;
- }
if (XkbcAllocNames(xkb, XkbKeyNamesMask, 0, 0) != Success)
{
if (warningLevel > 0)
extern Bool FindNamedKey(struct xkb_desc * /* xkb */ ,
unsigned long /* name */ ,
- unsigned int * /* kc_rtrn */ ,
+ xkb_keycode_t * /* kc_rtrn */ ,
Bool /* use_aliases */ ,
Bool /* create */ ,
int /* start_from */
}
static Bool
-FindKeyForSymbol(struct xkb_desc * xkb, uint32_t sym, unsigned int *kc_rtrn)
+FindKeyForSymbol(struct xkb_desc * xkb, uint32_t sym, xkb_keycode_t *kc_rtrn)
{
register int i, j;
register Bool gotOne;
CopySymbolsDef(struct xkb_desc * xkb, KeyInfo *key, int start_from)
{
register int i;
- unsigned okc, kc, width, tmp, nGroups;
+ xkb_keycode_t okc, kc;
+ unsigned width, tmp, nGroups;
struct xkb_key_type * type;
Bool haveActions, autoType, useAlias;
uint32_t *outSyms;
static Bool
CopyModMapDef(struct xkb_desc * xkb, ModMapEntry *entry)
{
- unsigned kc;
+ xkb_keycode_t kc;
if ((!entry->haveSymbol)
&&
}
%type <ival> Number Integer Float SignedNumber
%type <uval> XkbCompositeType FileType MergeMode OptMergeMode
-%type <uval> DoodadType Flag Flags OptFlags
+%type <uval> DoodadType Flag Flags OptFlags KeyCode
%type <str> KeyName MapName OptMapName KeySym
%type <sval> FieldSpec Ident Element String
%type <any> DeclList Decl
{ $$= BoolVarCreate($2,0); }
;
-KeyNameDecl : KeyName EQUALS Expr SEMI
+KeyNameDecl : KeyName EQUALS KeyCode SEMI
{
KeycodeDef *def;
free($1);
$$= expr;
}
+ | KeyCode
+ {
+ ExprDef *expr;
+ expr= ExprCreate(ExprValue,TypeKeyCode);
+ expr->value.uval= $1;
+ $$= expr;
+ }
;
OptKeySymList : KeySymList { $$= $1; }
Integer : INTEGER { $$= scanInt; }
;
+KeyCode : INTEGER { $$= scanULong; }
+ ;
+
KeyName : KEYNAME { $$= strdup(scanBuf); }
;
int lineNum = 0;
int scanInt;
+unsigned long scanULong;
static char *s;
char scanBuf[1024];
[0-9]+ {
char *end;
scanInt = strtol(yytext, &end, 0);
+ scanULong = strtoul(yytext, &end, 0);
return INTEGER;
}
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+us" };
- xkb_geometry { include "pc(pc105)" };
};