Fix EEK_MODIFIER_BEHAVIOR_LATCH when pressing Shift twice.
This commit is contained in:
@ -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,10 +535,17 @@ 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) {
|
||||||
|
if (fallback_group < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (level >= priv->symbol_matrix->num_levels)
|
group = fallback_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (level >= priv->symbol_matrix->num_levels) {
|
||||||
|
if (fallback_level < 0)
|
||||||
return NULL;
|
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];
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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;
|
||||||
else if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_LOCK)
|
break;
|
||||||
|
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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user