Fix EEK_MODIFIER_BEHAVIOR_LATCH when pressing Shift twice.

This commit is contained in:
Daiki Ueno
2011-01-28 16:55:01 +09:00
parent e6df7d90fe
commit b004a92e8a
5 changed files with 78 additions and 23 deletions

View File

@ -469,6 +469,23 @@ get_keyboard (EekKey *key)
*/ */
EekSymbol * EekSymbol *
eek_key_get_symbol (EekKey *key) eek_key_get_symbol (EekKey *key)
{
return eek_key_get_symbol_with_fallback (key, -1, -1);
}
/**
* eek_key_get_symbol_with_fallback:
* @key: an #EekKey
* @fallback_group: fallback group index
* @fallback_level: fallback level index
*
* Get the current symbol of @key.
* Returns: an #EekSymbol or %NULL on failure
*/
EekSymbol *
eek_key_get_symbol_with_fallback (EekKey *key,
gint fallback_group,
gint fallback_level)
{ {
gint group, level; gint group, level;
EekKeyboard *keyboard; EekKeyboard *keyboard;
@ -479,8 +496,11 @@ eek_key_get_symbol (EekKey *key)
g_return_val_if_fail (keyboard, NULL); g_return_val_if_fail (keyboard, NULL);
eek_keyboard_get_symbol_index (keyboard, &group, &level); eek_keyboard_get_symbol_index (keyboard, &group, &level);
return eek_key_get_symbol_at_index (key,
return eek_key_get_symbol_at_index (key, group, level); group,
level,
fallback_group,
fallback_level);
} }
/** /**
@ -488,6 +508,8 @@ eek_key_get_symbol (EekKey *key)
* @key: an #EekKey * @key: an #EekKey
* @group: group index of the symbol matrix * @group: group index of the symbol matrix
* @level: level index of the symbol matrix * @level: level index of the symbol matrix
* @fallback_group: fallback group index
* @fallback_level: fallback level index
* *
* Get the symbol at (@group, @level) in the symbol matrix of @key. * Get the symbol at (@group, @level) in the symbol matrix of @key.
* Returns: an #EekSymbol or %NULL on failure * Returns: an #EekSymbol or %NULL on failure
@ -495,11 +517,16 @@ eek_key_get_symbol (EekKey *key)
EekSymbol * EekSymbol *
eek_key_get_symbol_at_index (EekKey *key, eek_key_get_symbol_at_index (EekKey *key,
gint group, gint group,
gint level) gint level,
gint fallback_group,
gint fallback_level)
{ {
EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(key); EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(key);
gint num_symbols; gint num_symbols;
g_return_val_if_fail (group >= 0, NULL);
g_return_val_if_fail (level >= 0, NULL);
if (!priv->symbol_matrix) if (!priv->symbol_matrix)
return NULL; return NULL;
@ -508,13 +535,20 @@ eek_key_get_symbol_at_index (EekKey *key,
if (num_symbols == 0) if (num_symbols == 0)
return NULL; return NULL;
if (group >= priv->symbol_matrix->num_groups) if (group >= priv->symbol_matrix->num_groups) {
return NULL; if (fallback_group < 0)
if (level >= priv->symbol_matrix->num_levels) return NULL;
return NULL; group = fallback_group;
}
if (level >= priv->symbol_matrix->num_levels) {
if (fallback_level < 0)
return NULL;
level = fallback_level;
}
return priv->symbol_matrix->data[group * priv->symbol_matrix->num_levels + return priv->symbol_matrix->data[group * priv->symbol_matrix->num_levels +
level]; level];
} }
/** /**

View File

@ -104,9 +104,15 @@ void eek_key_set_symbol_matrix (EekKey *key,
EekSymbolMatrix *matrix); EekSymbolMatrix *matrix);
EekSymbolMatrix *eek_key_get_symbol_matrix (EekKey *key); EekSymbolMatrix *eek_key_get_symbol_matrix (EekKey *key);
EekSymbol *eek_key_get_symbol (EekKey *key); EekSymbol *eek_key_get_symbol (EekKey *key);
EekSymbol * eek_key_get_symbol_with_fallback
(EekKey *key,
gint fallback_group,
gint fallback_level);
EekSymbol *eek_key_get_symbol_at_index (EekKey *key, EekSymbol *eek_key_get_symbol_at_index (EekKey *key,
gint group, gint group,
gint level); gint level,
gint fallback_group,
gint fallback_level);
void eek_key_set_index (EekKey *key, void eek_key_set_index (EekKey *key,
gint column, gint column,

View File

@ -258,20 +258,25 @@ eek_keyboard_real_key_pressed (EekKeyboard *self,
EekSymbol *symbol; EekSymbol *symbol;
EekModifierType modifier; EekModifierType modifier;
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LATCH) symbol = eek_key_get_symbol_at_index (key,
priv->modifiers = 0; priv->group,
priv->level,
symbol = eek_key_get_symbol_at_index (key, priv->group, priv->level); -1,
0);
if (!symbol) if (!symbol)
return; return;
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
if (modifier != 0) { switch (priv->modifier_behavior) {
if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE || case EEK_MODIFIER_BEHAVIOR_NONE:
priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LATCH) priv->modifiers |= modifier;
priv->modifiers |= modifier; break;
else if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LOCK) case EEK_MODIFIER_BEHAVIOR_LOCK:
priv->modifiers ^= modifier; priv->modifiers ^= modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LATCH:
priv->modifiers = (priv->modifiers ^ modifier) & modifier;
break;
} }
set_level_from_modifiers (self); set_level_from_modifiers (self);
} }
@ -284,7 +289,11 @@ eek_keyboard_real_key_released (EekKeyboard *self,
EekSymbol *symbol; EekSymbol *symbol;
EekModifierType modifier; EekModifierType modifier;
symbol = eek_key_get_symbol_at_index (key, priv->group, priv->level); symbol = eek_key_get_symbol_at_index (key,
priv->group,
priv->level,
-1,
0);
if (!symbol) if (!symbol)
return; return;

View File

@ -442,7 +442,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
gdouble size, scale; gdouble size, scale;
gint i; gint i;
symbol = eek_key_get_symbol (key); symbol = eek_key_get_symbol_with_fallback (key, -1, 0);
if (!symbol) if (!symbol)
return; return;

View File

@ -399,7 +399,10 @@ a11y_keystroke_listener (const AccessibleKeystroke *stroke,
/* XXX: Ignore modifier keys since there is no way to receive /* XXX: Ignore modifier keys since there is no way to receive
SPI_KEY_RELEASED event for them. */ SPI_KEY_RELEASED event for them. */
symbol = eek_key_get_symbol (key); symbol = eek_key_get_symbol_with_fallback (key, -1, 0);
if (!symbol)
return FALSE;
for (i = 0; i < G_N_ELEMENTS(ignored_keysyms); i++) for (i = 0; i < G_N_ELEMENTS(ignored_keysyms); i++)
if (EEK_IS_KEYSYM(symbol) && if (EEK_IS_KEYSYM(symbol) &&
eek_keysym_get_xkeysym (EEK_KEYSYM(symbol)) == ignored_keysyms[i]) eek_keysym_get_xkeysym (EEK_KEYSYM(symbol)) == ignored_keysyms[i])
@ -434,7 +437,10 @@ on_key_pressed (EekKeyboard *keyboard,
Eekboard *eekboard = user_data; Eekboard *eekboard = user_data;
EekSymbol *symbol; EekSymbol *symbol;
symbol = eek_key_get_symbol (key); symbol = eek_key_get_symbol_with_fallback (key, -1, 0);
if (!symbol)
return;
EEKBOARD_NOTE("%s %X", EEKBOARD_NOTE("%s %X",
eek_symbol_get_name (symbol), eek_symbol_get_name (symbol),
eek_keyboard_get_modifiers (keyboard)); eek_keyboard_get_modifiers (keyboard));