X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fxkbcomp%2Fkeymap.c;h=087815927797ff406cfb5ff9fe79a3942e3d6ae4;hb=a83d745b62ea8ec89e939b00bb3754ad54280942;hp=acba662a83fe29d89170a2314eebe278d216d9b4;hpb=6b1cdee107caaf8009037763a3cc3cd51132a1dd;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/src/xkbcomp/keymap.c b/src/xkbcomp/keymap.c index acba662..0878159 100644 --- a/src/xkbcomp/keymap.c +++ b/src/xkbcomp/keymap.c @@ -27,20 +27,14 @@ * Ran Benita */ +#include "config.h" + #include "xkbcomp-priv.h" static void ComputeEffectiveMask(struct xkb_keymap *keymap, struct xkb_mods *mods) { - const struct xkb_mod *mod; - xkb_mod_index_t i; - - /* The effective mask is only real mods for now. */ - mods->mask = mods->mods & MOD_REAL_MASK_ALL; - - xkb_mods_enumerate(i, mod, &keymap->mods) - if (mods->mods & (1u << i)) - mods->mask |= mod->mapping; + mods->mask = mod_mask_get_effective(keymap, mods->mods); } static void @@ -115,7 +109,7 @@ FindInterpForKey(struct xkb_keymap *keymap, const struct xkb_key *key, found = (!mods || (interp->mods & mods)); break; case MATCH_ANY: - found = !!(interp->mods & mods); + found = (interp->mods & mods); break; case MATCH_ALL: found = ((interp->mods & mods) == interp->mods); @@ -144,7 +138,7 @@ ApplyInterpsToKey(struct xkb_keymap *keymap, struct xkb_key *key) return true; for (group = 0; group < key->num_groups; group++) { - for (level = 0; level < XkbKeyGroupWidth(key, group); level++) { + for (level = 0; level < XkbKeyNumLevels(key, group); level++) { const struct xkb_sym_interpret *interp; interp = FindInterpForKey(keymap, key, group, level); @@ -180,10 +174,10 @@ ApplyInterpsToKey(struct xkb_keymap *keymap, struct xkb_key *key) static bool UpdateDerivedKeymapFields(struct xkb_keymap *keymap) { + struct xkb_key *key; struct xkb_mod *mod; struct xkb_led *led; unsigned int i, j; - struct xkb_key *key; /* Find all the interprets for the key and bind them to actions, * which will also update the vmodmap. */ @@ -210,12 +204,12 @@ UpdateDerivedKeymapFields(struct xkb_keymap *keymap) /* Update action modifiers. */ xkb_keys_foreach(key, keymap) for (i = 0; i < key->num_groups; i++) - for (j = 0; j < XkbKeyGroupWidth(key, i); j++) + for (j = 0; j < XkbKeyNumLevels(key, i); j++) UpdateActionMods(keymap, &key->groups[i].levels[j].action, key->modmap); /* Update vmod -> led maps. */ - darray_foreach(led, keymap->leds) + xkb_leds_foreach(led, keymap) ComputeEffectiveMask(keymap, &led->mods); /* Find maximum number of groups out of all keys in the keymap. */ @@ -240,20 +234,23 @@ bool CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) { bool ok; - const char *main_name; XkbFile *files[LAST_KEYMAP_FILE_TYPE + 1] = { NULL }; enum xkb_file_type type; struct xkb_context *ctx = keymap->ctx; - main_name = file->name ? file->name : "(unnamed)"; - /* Collect section files and check for duplicates. */ for (file = (XkbFile *) file->defs; file; file = (XkbFile *) file->common.next) { if (file->file_type < FIRST_KEYMAP_FILE_TYPE || file->file_type > LAST_KEYMAP_FILE_TYPE) { - log_err(ctx, "Cannot define %s in a keymap file\n", - xkb_file_type_to_string(file->file_type)); + if (file->file_type == FILE_TYPE_GEOMETRY) { + log_vrb(ctx, 1, + XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION, + "Geometry sections are not supported; ignoring\n"); + } else { + log_err(ctx, "Cannot define %s in a keymap file\n", + xkb_file_type_to_string(file->file_type)); + } continue; } @@ -265,11 +262,6 @@ CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) continue; } - if (!file->topName) { - free(file->topName); - file->topName = strdup(main_name); - } - files[file->file_type] = file; } @@ -295,7 +287,7 @@ CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) type <= LAST_KEYMAP_FILE_TYPE; type++) { log_dbg(ctx, "Compiling %s \"%s\"\n", - xkb_file_type_to_string(type), files[type]->topName); + xkb_file_type_to_string(type), files[type]->name); ok = compile_file_fns[type](files[type], keymap, merge); if (!ok) {