static bool
write_keysyms(struct xkb_keymap *keymap, char **buf, size_t *size,
- size_t *offset, struct xkb_key *key, unsigned int group)
+ size_t *offset, struct xkb_key *key, xkb_group_index_t group)
{
const xkb_keysym_t *syms;
int num_syms, level;
size_t *offset)
{
struct xkb_key *key;
- int group, tmp;
+ xkb_group_index_t group, tmp;
bool showActions;
if (keymap->symbols_section_name)
continue;
type = XkbKeyTypeIndex(key, group);
write_buf(keymap, buf, size, offset,
- "\n\t\t\ttype[group%d]= \"%s\",",
+ "\n\t\t\ttype[group%u]= \"%s\",",
group + 1,
darray_item(keymap->types, type).name);
}
case XkbRedirectIntoRange:
write_buf(keymap, buf, size, offset,
- "\n\t\t\tgroupsRedirect= Group%d,",
+ "\n\t\t\tgroupsRedirect= Group%u,",
key->out_of_range_group_number + 1);
break;
}
if (group != 0)
write_buf(keymap, buf, size, offset, ",");
write_buf(keymap, buf, size, offset,
- "\n\t\t\tsymbols[Group%d]= [ ", group + 1);
+ "\n\t\t\tsymbols[Group%u]= [ ", group + 1);
if (!write_keysyms(keymap, buf, size, offset, key, group))
return false;
write_buf(keymap, buf, size, offset, " ]");
if (showActions) {
write_buf(keymap, buf, size, offset,
- ",\n\t\t\tactions[Group%d]= [ ", group + 1);
+ ",\n\t\t\tactions[Group%u]= [ ", group + 1);
for (level = 0;
level < XkbKeyGroupWidth(keymap, key, group);
level++) {
*/
unsigned int
xkb_key_get_level(struct xkb_state *state, xkb_keycode_t kc,
- unsigned int group)
+ xkb_group_index_t group)
{
struct xkb_keymap *keymap = xkb_state_get_map(state);
struct xkb_key_type *type;
* Returns the group to use for the given key and state, taking
* wrapping/clamping/etc into account.
*/
-unsigned int
+xkb_group_index_t
xkb_key_get_group(struct xkb_state *state, xkb_keycode_t kc)
{
struct xkb_keymap *keymap = xkb_state_get_map(state);
- unsigned int ret = xkb_state_serialize_group(state, XKB_STATE_EFFECTIVE);
+ xkb_group_index_t ret = xkb_state_serialize_group(state,
+ XKB_STATE_EFFECTIVE);
struct xkb_key *key;
if (!XkbKeycodeInRange(keymap, kc))
*/
int
xkb_key_get_syms_by_level(struct xkb_keymap *keymap, struct xkb_key *key,
- unsigned int group, unsigned int level,
+ xkb_group_index_t group, unsigned int level,
const xkb_keysym_t **syms_out)
{
int num_syms;
{
struct xkb_keymap *keymap = xkb_state_get_map(state);
struct xkb_key *key;
- int group, level;
+ xkb_group_index_t group;
+ unsigned int level;
if (!state || !XkbKeycodeInRange(keymap, kc))
return -1;
static union xkb_action *
xkb_key_get_action(struct xkb_state *state, xkb_keycode_t kc)
{
- unsigned int group, level;
+ xkb_group_index_t group;
+ unsigned int level;
struct xkb_key *key = NULL;
if (XkbKeycodeInRange(state->keymap, kc))
struct xkb_group_action {
uint8_t type;
uint8_t flags;
- int16_t group;
+ int32_t group;
};
struct xkb_iso_action {
uint8_t flags;
uint8_t mask;
uint8_t real_mods;
- uint8_t group;
+ int32_t group;
uint8_t affect;
uint16_t vmods;
};
struct xkb_indicator_map {
unsigned char flags;
unsigned char which_groups;
- unsigned char groups;
+ uint32_t groups;
unsigned char which_mods;
struct xkb_mods mods;
unsigned int ctrls;
unsigned char kt_index[XkbNumKbdGroups];
- unsigned int num_groups;
+ xkb_group_index_t num_groups;
/* How many levels the largest group has. */
unsigned char width;
uint8_t out_of_range_group_action;
- uint8_t out_of_range_group_number;
+ xkb_group_index_t out_of_range_group_number;
/* per level/group index into 'syms' */
int *sym_index;
xkb_foreach_key_from(iter, keymap, keymap->min_key_code)
static inline unsigned char
-XkbKeyTypeIndex(struct xkb_key *key, unsigned int group)
+XkbKeyTypeIndex(struct xkb_key *key, xkb_group_index_t group)
{
return key->kt_index[group & 0x3];
}
static inline struct xkb_key_type *
-XkbKeyType(struct xkb_keymap *keymap, struct xkb_key *key, unsigned int group)
+XkbKeyType(struct xkb_keymap *keymap, struct xkb_key *key,
+ xkb_group_index_t group)
{
return &darray_item(keymap->types, XkbKeyTypeIndex(key, group));
}
static inline uint16_t
XkbKeyGroupWidth(struct xkb_keymap *keymap, struct xkb_key *key,
- unsigned int group)
+ xkb_group_index_t group)
{
return XkbKeyType(keymap, key, group)->num_levels;
}
static inline unsigned int
-XkbKeyNumSyms(struct xkb_key *key, unsigned int group, unsigned int level)
+XkbKeyNumSyms(struct xkb_key *key, xkb_group_index_t group, unsigned int level)
{
return key->num_syms[group * key->width + level];
}
}
static inline int
-XkbKeySymOffset(struct xkb_key *key, unsigned group, unsigned int level)
+XkbKeySymOffset(struct xkb_key *key, xkb_group_index_t group,
+ unsigned int level)
{
return key->sym_index[group * key->width + level];
}
static inline xkb_keysym_t *
-XkbKeySymEntry(struct xkb_key *key, unsigned group, unsigned int level)
+XkbKeySymEntry(struct xkb_key *key, xkb_group_index_t group, unsigned int level)
{
return XkbKeySym(key, XkbKeySymOffset(key, group, level));
}
return key->acts_index != 0;
}
-static inline unsigned char
+static inline unsigned int
XkbKeyNumActions(struct xkb_key *key)
{
if (XkbKeyHasActions(key))
static inline union xkb_action *
XkbKeyActionEntry(struct xkb_keymap *keymap, struct xkb_key *key,
- unsigned int group, unsigned int level)
+ xkb_group_index_t group, unsigned int level)
{
if (XkbKeyHasActions(key))
return &XkbKeyActionsPtr(keymap, key)[key->width * group + level];
extern unsigned int
xkb_key_get_level(struct xkb_state *state, xkb_keycode_t kc,
- unsigned int group);
+ xkb_group_index_t group);
extern int
xkb_key_get_syms_by_level(struct xkb_keymap *keymap, struct xkb_key *key,
- unsigned int group, unsigned int level,
+ xkb_group_index_t group, unsigned int level,
const xkb_keysym_t **syms_out);
/**
static bool
CheckGroupField(struct xkb_keymap *keymap, unsigned action,
- ExprDef * value, unsigned *flags_inout, int *grp_rtrn)
+ ExprDef * value, unsigned *flags_inout,
+ xkb_group_index_t *grp_rtrn)
{
ExprDef *spec;
ExprResult rtrn;
struct xkb_group_action *act;
unsigned rtrn;
unsigned t1;
- int t2;
+ xkb_group_index_t t2;
act = (struct xkb_group_action *) action;
if (array_ndx != NULL) {
{
struct xkb_group_action *act;
unsigned t1;
- int t2;
+ xkb_group_index_t t2;
act = (struct xkb_group_action *) action;
if ((array_ndx != NULL) && (field == F_Group))
ExprResult rtrn;
struct xkb_iso_action *act;
unsigned flags, mods;
- int group;
+ xkb_group_index_t group;
act = (struct xkb_iso_action *) action;
switch (field) {
unsigned char real_mods;
unsigned short vmods;
unsigned char which_groups;
- unsigned char groups;
+ uint32_t groups;
unsigned int ctrls;
} LEDInfo;
}
static bool
-AddGroupCompat(CompatInfo * info, unsigned group, GroupCompatInfo * newGC)
+AddGroupCompat(CompatInfo *info, xkb_group_index_t group, GroupCompatInfo *new)
{
GroupCompatInfo *gc;
- enum merge_mode merge;
- merge = newGC->merge;
gc = &info->groupCompat[group];
- if (((gc->real_mods == newGC->real_mods) &&
- (gc->vmods == newGC->vmods))) {
+ if (gc->real_mods == new->real_mods && gc->vmods == new->vmods)
return true;
- }
- if (((gc->file_id == newGC->file_id) && (warningLevel > 0))
- || (warningLevel > 9)) {
- WARN("Compat map for group %d redefined\n", group + 1);
+
+ if ((gc->file_id == new->file_id && warningLevel > 0) ||
+ warningLevel > 9) {
+ WARN("Compat map for group %u redefined\n", group + 1);
ACTION("Using %s definition\n",
- (merge == MERGE_AUGMENT ? "old" : "new"));
+ (new->merge == MERGE_AUGMENT ? "old" : "new"));
}
- if (newGC->defined && (merge != MERGE_AUGMENT || !gc->defined))
- *gc = *newGC;
+
+ if (new->defined && (new->merge != MERGE_AUGMENT || !gc->defined))
+ *gc = *new;
+
return true;
}
SymInterpInfo *si;
LEDInfo *led, *rtrn, *next;
GroupCompatInfo *gcm;
- int i;
+ xkb_group_index_t i;
if (from->errorCount > 0) {
into->errorCount += from->errorCount;
if (def->merge != MERGE_DEFAULT)
merge = def->merge;
- if (!XkbIsLegalGroup(def->group - 1)) {
- ERROR("Keyboard group must be in the range 1..%d\n",
- XkbNumKbdGroups + 1);
- ACTION("Compatibility map for illegal group %d ignored\n",
- def->group);
+ if (def->group < 1 || def->group > XkbNumKbdGroups) {
+ ERROR("Keyboard group must be in the range 1..%u\n",
+ XkbNumKbdGroups);
+ ACTION("Compatibility map for illegal group %u ignored\n", def->group);
return false;
}
tmp.file_id = info->file_id;
tmp.merge = merge;
if (!ExprResolveVModMask(def->def, &val, keymap)) {
ERROR("Expected a modifier mask in group compatibility definition\n");
- ACTION("Ignoring illegal compatibility map for group %d\n",
+ ACTION("Ignoring illegal compatibility map for group %u\n",
def->group);
return false;
}
CompileCompatMap(XkbFile *file, struct xkb_keymap *keymap,
enum merge_mode merge)
{
- int i;
+ xkb_group_index_t i;
CompatInfo info;
GroupCompatInfo *gcm;
*/
static struct xkb_sym_interpret *
FindInterpForKey(struct xkb_keymap *keymap, struct xkb_key *key,
- uint32_t group, uint32_t level)
+ xkb_group_index_t group, uint32_t level)
{
struct xkb_sym_interpret *ret = NULL;
struct xkb_sym_interpret *interp;
union xkb_action *acts;
uint32_t vmodmask = 0;
int num_acts = 0;
- int group, level;
+ xkb_group_index_t group;
+ int level;
int i;
/* If we've been told not to bind interps to this key, then don't. */
return ret;
if (val_rtrn->uval == 0 || val_rtrn->uval > XkbNumKbdGroups) {
- ERROR("Group index %d is out of range (1..%d)\n",
+ ERROR("Group index %u is out of range (1..%d)\n",
val_rtrn->uval, XkbNumKbdGroups);
return false;
}
xkb_atom_t dfltType;
uint8_t out_of_range_group_action;
- uint8_t out_of_range_group_number;
+ xkb_group_index_t out_of_range_group_number;
} KeyInfo;
/**
static void
InitKeyInfo(KeyInfo *keyi, unsigned file_id)
{
- int i;
+ xkb_group_index_t i;
static const char dflt[4] = "*";
keyi->defined = 0;
static void
FreeKeyInfo(KeyInfo *keyi)
{
- int i;
+ xkb_group_index_t i;
for (i = 0; i < XkbNumKbdGroups; i++) {
darray_free(keyi->syms[i]);
static bool
CopyKeyInfo(KeyInfo * old, KeyInfo * new, bool clearOld)
{
- int i;
+ xkb_group_index_t i;
*new = *old;
int errorCount;
unsigned file_id;
enum merge_mode merge;
- unsigned explicit_group;
+ xkb_group_index_t explicit_group;
darray(KeyInfo) keys;
KeyInfo dflt;
VModInfo vmods;
InitSymbolsInfo(SymbolsInfo * info, struct xkb_keymap *keymap,
unsigned file_id)
{
- int i;
+ xkb_group_index_t i;
info->name = NULL;
info->explicit_group = 0;
}
static bool
-ResizeKeyGroup(KeyInfo *keyi, unsigned int group, unsigned int numLevels,
+ResizeKeyGroup(KeyInfo *keyi, xkb_group_index_t group, unsigned int numLevels,
unsigned sizeSyms, bool forceActions)
{
int i;
static bool
MergeKeyGroups(SymbolsInfo * info,
- KeyInfo * into, KeyInfo * from, unsigned group)
+ KeyInfo * into, KeyInfo * from, xkb_group_index_t group)
{
darray_xkb_keysym_t resultSyms;
enum key_group_selector using = NONE;
}
if (report) {
WARN
- ("Multiple actions for level %d/group %d on key %s\n",
+ ("Multiple actions for level %d/group %u on key %s\n",
i + 1, group + 1, longText(into->name));
ACTION("Using %s, ignoring %s\n",
XkbcActionTypeText(use->type),
use = TO;
if (toSize && fromSize && report) {
- INFO("Multiple symbols for group %d, level %d on key %s\n",
+ INFO("Multiple symbols for group %u, level %d on key %s\n",
group + 1, i + 1, longText(into->name));
ACTION("Using %s, ignoring %s\n",
(use == FROM ? "from" : "to"),
MergeKeys(SymbolsInfo *info, struct xkb_keymap *keymap,
KeyInfo *into, KeyInfo *from)
{
- int i;
+ xkb_group_index_t i;
unsigned collide = 0;
bool report;
static bool
GetGroupIndex(KeyInfo *keyi, struct xkb_keymap *keymap,
- ExprDef * arrayNdx, unsigned what, unsigned *ndx_rtrn)
+ ExprDef *arrayNdx, unsigned what, xkb_group_index_t *ndx_rtrn)
{
const char *name;
ExprResult tmp;
name = "actions";
if (arrayNdx == NULL) {
- int i;
+ xkb_group_index_t i;
unsigned defined;
if (what == SYMBOLS)
defined = keyi->symsDefined;
return true;
}
}
- ERROR("Too many groups of %s for key %s (max %d)\n", name,
+ ERROR("Too many groups of %s for key %s (max %u)\n", name,
longText(keyi->name), XkbNumKbdGroups + 1);
ACTION("Ignoring %s defined for extra groups\n", name);
return false;
AddSymbolsToKey(KeyInfo *keyi, struct xkb_keymap *keymap,
ExprDef *arrayNdx, ExprDef *value, SymbolsInfo *info)
{
- unsigned ndx, nSyms, nLevels;
- unsigned int i;
- long j;
+ xkb_group_index_t ndx;
+ size_t nSyms, nLevels;
+ size_t i, j;
if (!GetGroupIndex(keyi, keymap, arrayNdx, SYMBOLS, &ndx))
return false;
}
if (value->op != ExprKeysymList) {
ERROR("Expected a list of symbols, found %s\n", exprOpText(value->op));
- ACTION("Ignoring symbols for group %d of %s\n", ndx + 1,
+ ACTION("Ignoring symbols for group %u of %s\n", ndx + 1,
longText(keyi->name));
return false;
}
if (!darray_empty(keyi->syms[ndx])) {
- ERROR("Symbols for key %s, group %d already defined\n",
- longText(keyi->name), ndx + 1);
+ ERROR("Symbols for key %s, group %u already defined\n",
+ longText(keyi->name), ndx + 1);
ACTION("Ignoring duplicate definition\n");
return false;
}
nLevels = darray_size(value->value.list.symsMapIndex);
if ((keyi->numLevels[ndx] < nSyms || darray_empty(keyi->syms[ndx])) &&
(!ResizeKeyGroup(keyi, ndx, nLevels, nSyms, false))) {
- WSGO("Could not resize group %d of key %s to contain %d levels\n",
+ WSGO("Could not resize group %u of key %s to contain %zu levels\n",
ndx + 1, longText(keyi->name), nSyms);
ACTION("Symbols lost\n");
return false;
darray_item(keyi->symsMapIndex[ndx],
i) + j))) {
WARN(
- "Could not resolve keysym %s for key %s, group %d (%s), level %d\n",
+ "Could not resolve keysym %s for key %s, group %u (%s), level %zu\n",
darray_item(value->value.list.syms, i),
longText(keyi->name),
ndx + 1,
AddActionsToKey(KeyInfo *keyi, struct xkb_keymap *keymap, ExprDef *arrayNdx,
ExprDef *value, SymbolsInfo *info)
{
- unsigned int i;
- unsigned ndx, nActs;
+ size_t i;
+ xkb_group_index_t ndx;
+ size_t nActs;
ExprDef *act;
struct xkb_any_action *toAct;
}
if (value->op != ExprActionList) {
WSGO("Bad expression type (%d) for action list value\n", value->op);
- ACTION("Ignoring actions for group %d of %s\n", ndx,
+ ACTION("Ignoring actions for group %u of %s\n", ndx,
longText(keyi->name));
return false;
}
if (!darray_empty(keyi->acts[ndx])) {
- WSGO("Actions for key %s, group %d already defined\n",
- longText(keyi->name), ndx);
+ WSGO("Actions for key %s, group %u already defined\n",
+ longText(keyi->name), ndx);
return false;
}
for (nActs = 0, act = value->value.child; act != NULL; nActs++) {
}
if ((keyi->numLevels[ndx] < nActs || darray_empty(keyi->acts[ndx])) &&
!ResizeKeyGroup(keyi, ndx, nActs, nActs, true)) {
- WSGO("Could not resize group %d of key %s\n", ndx,
+ WSGO("Could not resize group %u of key %s\n", ndx,
longText(keyi->name));
ACTION("Actions lost\n");
return false;
if (!HandleActionDef(act, keymap, toAct, info->action)) {
ERROR("Illegal action definition for %s\n",
longText(keyi->name));
- ACTION("Action for group %d/level %d ignored\n", ndx + 1, i + 1);
+ ACTION("Action for group %u/level %zu ignored\n", ndx + 1, i + 1);
}
act = (ExprDef *) act->common.next;
}
static bool
SetExplicitGroup(SymbolsInfo *info, KeyInfo *keyi)
{
- unsigned group = info->explicit_group;
+ xkb_group_index_t group = info->explicit_group;
if (group == 0)
return true;
if ((keyi->typesDefined | keyi->symsDefined | keyi->actsDefined) & ~1) {
- int i;
+ xkb_group_index_t i;
WARN("For the map %s an explicit group specified\n", info->name);
WARN("but key %s has more than one group defined\n",
longText(keyi->name));
FindKeyForSymbol(struct xkb_keymap *keymap, xkb_keysym_t sym)
{
struct xkb_key *key, *ret = NULL;
- unsigned int group, level, min_group = UINT_MAX, min_level = UINT_MAX;
+ xkb_group_index_t group, min_group = UINT_MAX;
+ unsigned int level, min_level = UINT_MAX;
xkb_foreach_key(key, keymap) {
for (group = 0; group < key->num_groups; group++) {
static void
PrepareKeyDef(KeyInfo *keyi)
{
- int i, j, width, defined, lastGroup;
+ xkb_group_index_t i, lastGroup;
+ int j, width, defined;
bool identical;
defined = keyi->symsDefined | keyi->actsDefined | keyi->typesDefined;
* This function recurses.
*/
static bool
-CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi, int start_from)
+CopySymbolsDef(struct xkb_keymap *keymap, KeyInfo *keyi,
+ xkb_keycode_t start_from)
{
- unsigned int i;
xkb_keycode_t kc;
struct xkb_key *key;
- unsigned int sizeSyms = 0;
- unsigned width, tmp, nGroups;
+ size_t sizeSyms = 0;
+ xkb_group_index_t i, nGroups;
+ unsigned width, tmp;
struct xkb_key_type * type;
bool haveActions, autoType, useAlias;
unsigned types[XkbNumKbdGroups];
kc = XkbKeyGetKeycode(keymap, key);
haveActions = false;
- for (i = width = nGroups = 0; i < XkbNumKbdGroups; i++) {
+ width = 0;
+ for (i = nGroups = 0; i < XkbNumKbdGroups; i++) {
if (((i + 1) > nGroups)
&& (((keyi->symsDefined | keyi->actsDefined) & (1 << i))
|| (keyi->typesDefined) & (1 << i)))
else {
if (warningLevel >= 5) {
WARN("No automatic type for %d symbols\n",
- (unsigned int) keyi->numLevels[i]);
+ keyi->numLevels[i]);
ACTION("Using %s for the %s key (keycode %d)\n",
xkb_atom_text(keymap->ctx, keyi->types[i]),
longText(keyi->name), kc);
CompileSymbols(XkbFile *file, struct xkb_keymap *keymap,
enum merge_mode merge)
{
- int i;
+ xkb_group_index_t i;
struct xkb_key *key;
SymbolsInfo info;
KeyInfo *keyi;