diff options
author | Ran Benita <ran234@gmail.com> | 2014-02-16 18:32:44 +0200 |
---|---|---|
committer | Ran Benita <ran234@gmail.com> | 2014-02-16 18:39:31 +0200 |
commit | 1fa7d6d3ab5b10e5b399f190245248ec50c94af7 (patch) | |
tree | e291516e46391730e507aa033dd63385372c09eb /src/xkbcomp | |
parent | af75353a88b07d13aed15ff93ee7859ab3416b60 (diff) | |
download | libxkbcommon-1fa7d6d3ab5b10e5b399f190245248ec50c94af7.tar.gz libxkbcommon-1fa7d6d3ab5b10e5b399f190245248ec50c94af7.tar.bz2 libxkbcommon-1fa7d6d3ab5b10e5b399f190245248ec50c94af7.zip |
action: unify SetLatch and Lock handler functions
This is a little shorter and follows easier from the spec flag
description table.
Also a few were too permissive (like allowing LatchToLock in SetMods).
Signed-off-by: Ran Benita <ran234@gmail.com>
Diffstat (limited to 'src/xkbcomp')
-rw-r--r-- | src/xkbcomp/action.c | 87 |
1 files changed, 33 insertions, 54 deletions
diff --git a/src/xkbcomp/action.c b/src/xkbcomp/action.c index dbb57a9..eb3d37f 100644 --- a/src/xkbcomp/action.c +++ b/src/xkbcomp/action.c @@ -278,28 +278,6 @@ CheckModifierField(struct xkb_keymap *keymap, enum xkb_action_type action, return true; } -static bool -HandleSetLatchMods(struct xkb_keymap *keymap, union xkb_action *action, - enum action_field field, const ExprDef *array_ndx, - const ExprDef *value) -{ - struct xkb_mod_action *act = &action->mods; - - if (field == ACTION_FIELD_CLEAR_LOCKS) - return CheckBooleanFlag(keymap->ctx, action->type, field, - ACTION_LOCK_CLEAR, array_ndx, value, - &act->flags); - if (field == ACTION_FIELD_LATCH_TO_LOCK) - return CheckBooleanFlag(keymap->ctx, action->type, field, - ACTION_LATCH_TO_LOCK, array_ndx, value, - &act->flags); - if (field == ACTION_FIELD_MODIFIERS) - return CheckModifierField(keymap, action->type, array_ndx, value, - &act->flags, &act->mods.mods); - - return ReportIllegal(keymap->ctx, action->type, field); -} - static const LookupEntry lockWhich[] = { { "both", 0 }, { "lock", ACTION_LOCK_NO_UNLOCK }, @@ -328,16 +306,28 @@ CheckAffectField(struct xkb_context *ctx, enum xkb_action_type action, } static bool -HandleLockMods(struct xkb_keymap *keymap, union xkb_action *action, - enum action_field field, const ExprDef *array_ndx, - const ExprDef *value) +HandleSetLatchLockMods(struct xkb_keymap *keymap, union xkb_action *action, + enum action_field field, const ExprDef *array_ndx, + const ExprDef *value) { struct xkb_mod_action *act = &action->mods; + const enum xkb_action_type type = action->type; if (field == ACTION_FIELD_MODIFIERS) return CheckModifierField(keymap, action->type, array_ndx, value, &act->flags, &act->mods.mods); - else if (field == ACTION_FIELD_AFFECT) + if ((type == ACTION_TYPE_MOD_SET || type == ACTION_TYPE_MOD_LATCH) && + field == ACTION_FIELD_CLEAR_LOCKS) + return CheckBooleanFlag(keymap->ctx, action->type, field, + ACTION_LOCK_CLEAR, array_ndx, value, + &act->flags); + if (type == ACTION_TYPE_MOD_LATCH && + field == ACTION_FIELD_LATCH_TO_LOCK) + return CheckBooleanFlag(keymap->ctx, action->type, field, + ACTION_LATCH_TO_LOCK, array_ndx, value, + &act->flags); + if (type == ACTION_TYPE_MOD_LOCK && + field == ACTION_FIELD_AFFECT) return CheckAffectField(keymap->ctx, action->type, array_ndx, value, &act->flags); @@ -383,37 +373,26 @@ CheckGroupField(struct xkb_context *ctx, unsigned action, } static bool -HandleSetLatchGroup(struct xkb_keymap *keymap, union xkb_action *action, - enum action_field field, const ExprDef *array_ndx, - const ExprDef *value) +HandleSetLatchLockGroup(struct xkb_keymap *keymap, union xkb_action *action, + enum action_field field, const ExprDef *array_ndx, + const ExprDef *value) { struct xkb_group_action *act = &action->group; + const enum xkb_action_type type = action->type; - if (field == ACTION_FIELD_CLEAR_LOCKS) + if (field == ACTION_FIELD_GROUP) + return CheckGroupField(keymap->ctx, action->type, array_ndx, value, + &act->flags, &act->group); + if ((type == ACTION_TYPE_GROUP_SET || type == ACTION_TYPE_GROUP_LATCH) && + field == ACTION_FIELD_CLEAR_LOCKS) return CheckBooleanFlag(keymap->ctx, action->type, field, ACTION_LOCK_CLEAR, array_ndx, value, &act->flags); - if (field == ACTION_FIELD_LATCH_TO_LOCK) + if (type == ACTION_TYPE_GROUP_LATCH && + field == ACTION_FIELD_LATCH_TO_LOCK) return CheckBooleanFlag(keymap->ctx, action->type, field, ACTION_LATCH_TO_LOCK, array_ndx, value, &act->flags); - if (field == ACTION_FIELD_GROUP) - return CheckGroupField(keymap->ctx, action->type, array_ndx, value, - &act->flags, &act->group); - - return ReportIllegal(keymap->ctx, action->type, field); -} - -static bool -HandleLockGroup(struct xkb_keymap *keymap, union xkb_action *action, - enum action_field field, const ExprDef *array_ndx, - const ExprDef *value) -{ - struct xkb_group_action *act = &action->group; - - if (field == ACTION_FIELD_GROUP) - return CheckGroupField(keymap->ctx, action->type, array_ndx, value, - &act->flags, &act->group); return ReportIllegal(keymap->ctx, action->type, field); } @@ -772,12 +751,12 @@ typedef bool (*actionHandler)(struct xkb_keymap *keymap, static const actionHandler handleAction[_ACTION_TYPE_NUM_ENTRIES] = { [ACTION_TYPE_NONE] = HandleNoAction, - [ACTION_TYPE_MOD_SET] = HandleSetLatchMods, - [ACTION_TYPE_MOD_LATCH] = HandleSetLatchMods, - [ACTION_TYPE_MOD_LOCK] = HandleLockMods, - [ACTION_TYPE_GROUP_SET] = HandleSetLatchGroup, - [ACTION_TYPE_GROUP_LATCH] = HandleSetLatchGroup, - [ACTION_TYPE_GROUP_LOCK] = HandleLockGroup, + [ACTION_TYPE_MOD_SET] = HandleSetLatchLockMods, + [ACTION_TYPE_MOD_LATCH] = HandleSetLatchLockMods, + [ACTION_TYPE_MOD_LOCK] = HandleSetLatchLockMods, + [ACTION_TYPE_GROUP_SET] = HandleSetLatchLockGroup, + [ACTION_TYPE_GROUP_LATCH] = HandleSetLatchLockGroup, + [ACTION_TYPE_GROUP_LOCK] = HandleSetLatchLockGroup, [ACTION_TYPE_PTR_MOVE] = HandleMovePtr, [ACTION_TYPE_PTR_BUTTON] = HandlePtrBtn, [ACTION_TYPE_PTR_LOCK] = HandlePtrBtn, |