X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fkeymap.h;h=f7ea5bdf1f6b28014293dd23e6f7766e659b5a46;hb=e73599ee0ee7a5ee16cbdbac664872d0aa0cf2df;hp=5f514ec77907651dd47a4d5ee3c9193d49cff05e;hpb=7210497c634c8a6a380bba6db934e3ac0d1d98d8;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/src/keymap.h b/src/keymap.h index 5f514ec..f7ea5bd 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -109,6 +109,9 @@ /* Don't allow more leds than we can hold in xkb_led_mask_t. */ #define XKB_MAX_LEDS ((xkb_led_index_t) (sizeof(xkb_led_mask_t) * 8)) +/* Special value to handle modMap None {…} */ +#define XKB_MOD_NONE 0xffffffffU + /* These should all go away. */ enum mod_type { MOD_REAL = (1 << 0), @@ -146,7 +149,7 @@ enum xkb_action_flags { ACTION_ABSOLUTE_SWITCH = (1 << 5), ACTION_ABSOLUTE_X = (1 << 6), ACTION_ABSOLUTE_Y = (1 << 7), - ACTION_NO_ACCEL = (1 << 8), + ACTION_ACCEL = (1 << 8), ACTION_SAME_SCREEN = (1 << 9), }; @@ -223,12 +226,11 @@ struct xkb_pointer_button_action { enum xkb_action_type type; enum xkb_action_flags flags; uint8_t count; - int8_t button; + uint8_t button; }; struct xkb_private_action { enum xkb_action_type type; - enum xkb_action_flags flags; uint8_t data[7]; }; @@ -254,6 +256,7 @@ struct xkb_key_type { xkb_atom_t name; struct xkb_mods mods; xkb_level_index_t num_levels; + unsigned int num_level_names; xkb_atom_t *level_names; unsigned int num_entries; struct xkb_key_type_entry *entries; @@ -262,10 +265,10 @@ struct xkb_key_type { struct xkb_sym_interpret { xkb_keysym_t sym; enum xkb_match_operation match; - bool level_one_only; xkb_mod_mask_t mods; xkb_mod_index_t virtual_mod; union xkb_action action; + bool level_one_only; bool repeat; }; @@ -325,7 +328,7 @@ struct xkb_group { bool explicit_type; /* Points to a type in keymap->types. */ const struct xkb_key_type *type; - /* Use XkbKeyGroupWidth for the number of levels. */ + /* Use XkbKeyNumLevels for the number of levels. */ struct xkb_level *levels; }; @@ -353,6 +356,11 @@ struct xkb_mod { xkb_mod_mask_t mapping; /* vmod -> real mod mapping */ }; +struct xkb_mod_set { + struct xkb_mod mods[XKB_MAX_MODS]; + unsigned int num_mods; +}; + /* Common keyboard description structure */ struct xkb_keymap { struct xkb_context *ctx; @@ -377,7 +385,7 @@ struct xkb_keymap { unsigned int num_sym_interprets; struct xkb_sym_interpret *sym_interprets; - darray(struct xkb_mod) mods; + struct xkb_mod_set mods; /* Number of groups in the key with the most groups. */ xkb_layout_index_t num_groups; @@ -385,7 +393,8 @@ struct xkb_keymap { xkb_layout_index_t num_group_names; xkb_atom_t *group_names; - darray(struct xkb_led) leds; + struct xkb_led leds[XKB_MAX_LEDS]; + unsigned int num_leds; char *keycodes_section_name; char *symbols_section_name; @@ -393,10 +402,30 @@ struct xkb_keymap { char *compat_section_name; }; -#define xkb_foreach_key(iter, keymap) \ - for (iter = keymap->keys + keymap->min_key_code; \ - iter <= keymap->keys + keymap->max_key_code; \ - iter++) +#define xkb_keys_foreach(iter, keymap) \ + for ((iter) = (keymap)->keys + (keymap)->min_key_code; \ + (iter) <= (keymap)->keys + (keymap)->max_key_code; \ + (iter)++) + +#define xkb_mods_foreach(iter, mods_) \ + for ((iter) = (mods_)->mods; \ + (iter) < (mods_)->mods + (mods_)->num_mods; \ + (iter)++) + +#define xkb_mods_enumerate(idx, iter, mods_) \ + for ((idx) = 0, (iter) = (mods_)->mods; \ + (idx) < (mods_)->num_mods; \ + (idx)++, (iter)++) + +#define xkb_leds_foreach(iter, keymap) \ + for ((iter) = (keymap)->leds; \ + (iter) < (keymap)->leds + (keymap)->num_leds; \ + (iter)++) + +#define xkb_leds_enumerate(idx, iter, keymap) \ + for ((idx) = 0, (iter) = (keymap)->leds; \ + (idx) < (keymap)->num_leds; \ + (idx)++, (iter)++) static inline const struct xkb_key * XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) @@ -407,11 +436,22 @@ XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) } static inline xkb_level_index_t -XkbKeyGroupWidth(const struct xkb_key *key, xkb_layout_index_t layout) +XkbKeyNumLevels(const struct xkb_key *key, xkb_layout_index_t layout) { return key->groups[layout].type->num_levels; } +/* + * If the virtual modifiers are not bound to anything, the entry + * is not active and should be skipped. xserver does this with + * cached entry->active field. + */ +static inline bool +entry_is_active(const struct xkb_key_type_entry *entry) +{ + return entry->mods.mods == 0 || entry->mods.mask != 0; +} + struct xkb_keymap * xkb_keymap_new(struct xkb_context *ctx, enum xkb_keymap_format format, @@ -421,17 +461,27 @@ struct xkb_key * XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases); xkb_atom_t -XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name); +XkbResolveKeyAlias(const struct xkb_keymap *keymap, xkb_atom_t name); void XkbEscapeMapName(char *name); +xkb_mod_index_t +XkbModNameToIndex(const struct xkb_mod_set *mods, xkb_atom_t name, + enum mod_type type); + +bool +XkbLevelsSameSyms(const struct xkb_level *a, const struct xkb_level *b); + xkb_layout_index_t -wrap_group_into_range(int32_t group, +XkbWrapGroupIntoRange(int32_t group, xkb_layout_index_t num_groups, enum xkb_range_exceed_type out_of_range_group_action, xkb_layout_index_t out_of_range_group_number); +xkb_mod_mask_t +mod_mask_get_effective(struct xkb_keymap *keymap, xkb_mod_mask_t mods); + struct xkb_keymap_format_ops { bool (*keymap_new_from_names)(struct xkb_keymap *keymap, const struct xkb_rule_names *names);