Move level change logic from key-pressed to key-released handler.

This commit is contained in:
Daiki Ueno
2011-03-07 14:39:35 +09:00
parent dd86b132ce
commit d57ae91995
2 changed files with 40 additions and 39 deletions

View File

@ -332,18 +332,10 @@ eek_keyboard_real_key_pressed (EekKeyboard *self,
return; return;
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
switch (priv->modifier_behavior) { if (priv->modifier_behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
case EEK_MODIFIER_BEHAVIOR_NONE:
priv->modifiers |= modifier; priv->modifiers |= modifier;
break; set_level_from_modifiers (self);
case EEK_MODIFIER_BEHAVIOR_LOCK:
priv->modifiers ^= modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LATCH:
priv->modifiers = (priv->modifiers ^ modifier) & modifier;
break;
} }
set_level_from_modifiers (self);
} }
static void static void
@ -359,9 +351,16 @@ eek_keyboard_real_key_released (EekKeyboard *self,
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->modifiers &= ~modifier; priv->modifiers &= ~modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LOCK:
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);
} }

View File

@ -266,6 +266,21 @@ eek_section_real_find_key_by_keycode (EekSection *self,
(gpointer)(long)keycode); (gpointer)(long)keycode);
} }
static void
set_level_from_modifiers (EekSection *self)
{
EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
EekKeyboard *keyboard;
EekModifierType num_lock_mask;
gint level = -1;
keyboard = EEK_KEYBOARD(eek_element_get_parent (EEK_ELEMENT(self)));
num_lock_mask = eek_keyboard_get_num_lock_mask (keyboard);
if (priv->modifiers & num_lock_mask)
level = 1;
eek_element_set_level (EEK_ELEMENT(self), level);
}
static void static void
eek_section_real_key_pressed (EekSection *self, EekKey *key) eek_section_real_key_pressed (EekSection *self, EekKey *key)
{ {
@ -274,8 +289,6 @@ eek_section_real_key_pressed (EekSection *self, EekKey *key)
EekKeyboard *keyboard; EekKeyboard *keyboard;
EekModifierBehavior behavior; EekModifierBehavior behavior;
EekModifierType modifier; EekModifierType modifier;
EekModifierType num_lock_mask;
gint level = -1;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (!symbol) if (!symbol)
@ -284,22 +297,10 @@ eek_section_real_key_pressed (EekSection *self, EekKey *key)
keyboard = EEK_KEYBOARD(eek_element_get_parent (EEK_ELEMENT(self))); keyboard = EEK_KEYBOARD(eek_element_get_parent (EEK_ELEMENT(self)));
behavior = eek_keyboard_get_modifier_behavior (keyboard); behavior = eek_keyboard_get_modifier_behavior (keyboard);
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
switch (behavior) { if (behavior == EEK_MODIFIER_BEHAVIOR_NONE) {
case EEK_MODIFIER_BEHAVIOR_NONE:
priv->modifiers |= modifier; priv->modifiers |= modifier;
break; set_level_from_modifiers (self);
case EEK_MODIFIER_BEHAVIOR_LOCK:
priv->modifiers ^= modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LATCH:
priv->modifiers = (priv->modifiers ^ modifier) & modifier;
break;
} }
num_lock_mask = eek_keyboard_get_num_lock_mask (keyboard);
if (priv->modifiers & num_lock_mask)
level = 1;
eek_element_set_level (EEK_ELEMENT(self), level);
} }
static void static void
@ -310,8 +311,6 @@ eek_section_real_key_released (EekSection *self, EekKey *key)
EekKeyboard *keyboard; EekKeyboard *keyboard;
EekModifierBehavior behavior; EekModifierBehavior behavior;
EekModifierType modifier; EekModifierType modifier;
EekModifierType num_lock_mask;
gint level = -1;
symbol = eek_key_get_symbol_with_fallback (key, 0, 0); symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
if (!symbol) if (!symbol)
@ -320,15 +319,18 @@ eek_section_real_key_released (EekSection *self, EekKey *key)
keyboard = EEK_KEYBOARD(eek_element_get_parent (EEK_ELEMENT(self))); keyboard = EEK_KEYBOARD(eek_element_get_parent (EEK_ELEMENT(self)));
behavior = eek_keyboard_get_modifier_behavior (keyboard); behavior = eek_keyboard_get_modifier_behavior (keyboard);
modifier = eek_symbol_get_modifier_mask (symbol); modifier = eek_symbol_get_modifier_mask (symbol);
if (modifier != 0) { switch (behavior) {
if (behavior == EEK_MODIFIER_BEHAVIOR_NONE) case EEK_MODIFIER_BEHAVIOR_NONE:
priv->modifiers &= ~modifier; priv->modifiers &= ~modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LOCK:
priv->modifiers ^= modifier;
break;
case EEK_MODIFIER_BEHAVIOR_LATCH:
priv->modifiers = (priv->modifiers ^ modifier) & modifier;
break;
} }
set_level_from_modifiers (self);
num_lock_mask = eek_keyboard_get_num_lock_mask (keyboard);
if (priv->modifiers & num_lock_mask)
level = 1;
eek_element_set_level (EEK_ELEMENT(self), level);
} }
static void static void