--- orig/hildon-input-method-framework-2.1.41/src/hildon-im-context.c 2009-11-23 16:06:15.000000000 +0200 +++ hildon-input-method-framework-2.1.41/src/hildon-im-context.c 2010-02-24 14:41:23.000000000 +0200 @@ -40,6 +40,11 @@ #include "hildon-im-gtk.h" #include "hildon-im-common.h" +#include +#include +#include +#include + #define HILDON_IM_DEFAULT_LAUNCH_DELAY 70 #define COMPOSE_KEY GDK_Multi_key @@ -229,6 +234,17 @@ static void hildon_im_context_send_event(HildonIMContext *self, XEvent *event); +static void setled(int v); +static void +setled (int v) { + int f; + char s[16]; + f=open("/sys/class/leds/lp5523:a/brightness", O_RDWR); + sprintf(s,"%d", v); + write(f,s,strlen(s)); + close(f); +} + static void hildon_im_context_send_fake_key (guint key_val, gboolean is_press) { @@ -1365,6 +1381,7 @@ HILDON_IM_LEVEL_STICKY_MASK | HILDON_IM_LEVEL_LOCK_MASK | HILDON_IM_COMPOSE_MASK); + setled(0); break; case HILDON_IM_CONTEXT_OPTION_CHANGED: break; @@ -1822,8 +1839,10 @@ /* Pressing the key while already locked clears the state */ if (lock_mask & HILDON_IM_SHIFT_LOCK_MASK) hildon_im_context_send_command(self, HILDON_IM_SHIFT_UNLOCKED); - else if (lock_mask & HILDON_IM_LEVEL_LOCK_MASK) - hildon_im_context_send_command(self, HILDON_IM_MOD_UNLOCKED); + else if (lock_mask & HILDON_IM_LEVEL_LOCK_MASK) { + hildon_im_context_send_command(self, HILDON_IM_MOD_UNLOCKED); + setled(0); + } *mask &= ~(lock_mask | sticky_mask); } @@ -1834,14 +1853,17 @@ if (lock_mask & HILDON_IM_SHIFT_LOCK_MASK) hildon_im_context_send_command(self, HILDON_IM_SHIFT_LOCKED); - else if (lock_mask & HILDON_IM_LEVEL_LOCK_MASK) + else if (lock_mask & HILDON_IM_LEVEL_LOCK_MASK) { hildon_im_context_send_command(self, HILDON_IM_MOD_LOCKED); + setled(200); + } } else if (was_press_and_release) { /* Pressing the key for the first time stickies the key for one character, * but only if no characters were entered while holding the key down */ *mask |= sticky_mask; + if (sticky_mask == HILDON_IM_LEVEL_STICKY_MASK) setled(80); } } @@ -1860,6 +1882,21 @@ event->keyval = translated_keyval; } + +static void +perform_shift_level_translation (GdkEventKey *event) +{ + guint translated_keyval; + + gdk_keymap_translate_keyboard_state(gdk_keymap_get_default(), + event->hardware_keycode, + LEVEL_KEY_MOD_MASK | GDK_Shift_L, + event->group, + &translated_keyval, + NULL, NULL, NULL); + event->keyval = translated_keyval; +} + static void reset_shift_and_level_keys_if_needed (HildonIMContext *context, GdkEventKey *event) { @@ -1876,6 +1913,7 @@ if (event->keyval != LEVEL_KEY && (context->mask & HILDON_IM_LEVEL_LOCK_MASK) == 0) { context->mask &= ~HILDON_IM_LEVEL_STICKY_MASK; + setled(0); } } @@ -2188,7 +2226,10 @@ * level key was being held down. */ if (!invert_level_behavior) { - perform_level_translation (event); + + if (shift_key_is_locked || shift_key_is_sticky || shift_key_is_down) { + perform_shift_level_translation(event); + } else perform_level_translation (event); } else if (level_key_is_down) { @@ -2227,11 +2268,15 @@ /* Shift lock or holding the shift down forces uppercase, * ignoring autocap */ +#if 1 + if (shift_key_is_locked) +#else if (shift_key_is_locked || (shift_key_is_sticky && (level_key_is_sticky || level_key_is_locked || level_key_is_down))) +#endif { - event->keyval = gdk_keyval_to_upper (event->keyval); + event->keyval = gdk_keyval_to_upper (event->keyval); } else if (shift_key_is_sticky) perform_shift_translation (event);