From 1614a9d997bac1d2992001cb25a92cdf082f7cd0 Mon Sep 17 00:00:00 2001 From: "giwoong.kim" Date: Tue, 27 Mar 2012 19:50:23 +0900 Subject: [PATCH] [Title] CapsLock state is synchronized with host key value [Type] [Module] Emulator [Priority] [Jira#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] --- tizen/src/emul_state.c | 35 +++++++++++++++++++++++++++++++++++ tizen/src/emul_state.h | 12 ++++++++---- tizen/src/emulator.c | 5 +---- tizen/src/skin/maruskin_keymap.c | 23 ++++++++++++++++++++--- tizen/src/skin/maruskin_keymap.h | 3 ++- tizen/src/skin/maruskin_operation.c | 4 ++-- 6 files changed, 68 insertions(+), 14 deletions(-) diff --git a/tizen/src/emul_state.c b/tizen/src/emul_state.c index 9a76712..7fe7f85 100644 --- a/tizen/src/emul_state.c +++ b/tizen/src/emul_state.c @@ -33,6 +33,12 @@ #include "emul_state.h" #include "debug_ch.h" +#ifdef __linux__ +#include +#elif _WIN32 +#include +#endif + MULTI_DEBUG_CHANNEL(qemu, emul_state); @@ -124,3 +130,32 @@ MultiTouchState *get_emul_multi_touch_state(void) { return &(_emul_state.qemu_mts); } + +/* manage CapsLock key state for usb keyboard input */ +int get_host_caps_lock_state(void) +{ +#ifdef __linux__ + unsigned state = 0; + Display *display = XOpenDisplay((char*)0); + if (display) { + XkbGetIndicatorState(display, XkbUseCoreKbd, &state); + } + XCloseDisplay(display); + + return (state & 1); +#elif _WIN32 + //TODO: +#endif + + return 0; +} + +void set_emul_caps_lock_state(int state) +{ + _emul_state.qemu_caps_lock = state; +} + +int get_emul_caps_lock_state(void) +{ + return _emul_state.qemu_caps_lock; +} diff --git a/tizen/src/emul_state.h b/tizen/src/emul_state.h index fbe341f..c7552be 100644 --- a/tizen/src/emul_state.h +++ b/tizen/src/emul_state.h @@ -78,25 +78,29 @@ typedef struct EmulatorConfigState { double scale_factor; short rotation_type; MultiTouchState qemu_mts; + int qemu_caps_lock; //TODO: } EmulatorConfigState; /* setter */ -void set_emulator_condition(int state); void set_emul_lcd_size(int width, int height); void set_emul_win_scale(double scale); -void set_emul_rotation(short rotation_type); void set_emul_sdl_bpp(int bpp); +void set_emulator_condition(int state); +void set_emul_rotation(short rotation_type); +void set_emul_caps_lock_state(int state); /* getter */ -int get_emulator_condition(void); int get_emul_lcd_width(void); int get_emul_lcd_height(void); double get_emul_win_scale(void); -short get_emul_rotation(void); int get_emul_sdl_bpp(void); +int get_emulator_condition(void); +short get_emul_rotation(void); MultiTouchState *get_emul_multi_touch_state(void); +int get_host_caps_lock_state(void); +int get_emul_caps_lock_state(void); #endif /* __EMUL_STATE_H__ */ diff --git a/tizen/src/emulator.c b/tizen/src/emulator.c index 08567a1..b92e39b 100644 --- a/tizen/src/emulator.c +++ b/tizen/src/emulator.c @@ -81,10 +81,6 @@ static void construct_main_window(int skin_argc, char* skin_argv[]) { INFO("construct main window\n"); - //TODO: init - //set_emul_win_scale(0.5); - //set_emul_rotation(0); - start_skin_server( skin_argc, skin_argv ); #if 1 if ( 0 > start_skin_client(skin_argc, skin_argv) ) { @@ -92,6 +88,7 @@ static void construct_main_window(int skin_argc, char* skin_argv[]) } #endif + set_emul_caps_lock_state(get_host_caps_lock_state()); } static void parse_options(int argc, char* argv[], int* skin_argc, char*** skin_argv, int* qemu_argc, char*** qemu_argv) diff --git a/tizen/src/skin/maruskin_keymap.c b/tizen/src/skin/maruskin_keymap.c index 3df849b..aca7f86 100644 --- a/tizen/src/skin/maruskin_keymap.c +++ b/tizen/src/skin/maruskin_keymap.c @@ -29,9 +29,14 @@ #include "maruskin_keymap.h" +#include "emul_state.h" +#include "console.h" +#include "debug_ch.h" +MULTI_DEBUG_CHANNEL(qemu, skin_keymap); -int javakeycode_to_scancode(int java_keycode) + +int javakeycode_to_scancode(int java_keycode, int event_type) { int state_mask = java_keycode & JAVA_KEYCODE_BIT; int vk = java_keycode & JAVA_KEY_MASK; @@ -91,11 +96,11 @@ int javakeycode_to_scancode(int java_keycode) case JAVA_KEY_KEYPAD_ADD : return 78; case JAVA_KEY_KEYPAD_SUBTRACT : - return 74; + return 114; // case JAVA_KEY_KEYPAD_DECIMAL : return 123; case JAVA_KEY_KEYPAD_DIVIDE : - return -1; + return 138; // case JAVA_KEY_KEYPAD_0 : return 81; case JAVA_KEY_KEYPAD_1 : @@ -116,8 +121,13 @@ int javakeycode_to_scancode(int java_keycode) return 71; case JAVA_KEY_KEYPAD_9 : return 73; + case JAVA_KEY_KEYPAD_CR : + return 136; // case JAVA_KEY_CAPS_LOCK : + if (event_type == KEY_PRESSED) { + set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1); //toggle + } return 58; case JAVA_KEY_NUM_LOCK : return 69; @@ -209,6 +219,13 @@ int javakeycode_to_scancode(int java_keycode) } } + if (get_emul_caps_lock_state() != get_host_caps_lock_state()) { + kbd_put_keycode(58); + kbd_put_keycode(58 | 0x80); + set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1); //toggle + INFO("qemu CapsLock state was synchronized with host key value (%d)\n", get_emul_caps_lock_state()); + } + } return vkkey2scancode[vk]; diff --git a/tizen/src/skin/maruskin_keymap.h b/tizen/src/skin/maruskin_keymap.h index c295d1b..25cd36d 100644 --- a/tizen/src/skin/maruskin_keymap.h +++ b/tizen/src/skin/maruskin_keymap.h @@ -67,6 +67,7 @@ enum JAVA_KEYCODE { JAVA_KEY_KEYPAD_7, JAVA_KEY_KEYPAD_8, JAVA_KEY_KEYPAD_9, + JAVA_KEY_KEYPAD_CR = 80, JAVA_KEY_CAPS_LOCK = 82, JAVA_KEY_NUM_LOCK, JAVA_KEY_SCROLL_LOCK, @@ -223,6 +224,6 @@ static const int vkkey2scancode[KEY_MAX] = { ['?'] = 53 | SHIFT, }; -int javakeycode_to_scancode(int java_keycode); +int javakeycode_to_scancode(int java_keycode, int event_type); #endif /* MARUSKIN_KEYMAP_H_ */ diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 0b2e42b..2992247 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -82,7 +82,7 @@ void do_key_event( int event_type, int keycode ) { TRACE( "key_event event_type:%d, keycode:%d\n", event_type, keycode ); - //check for multi-touch + //is multi-touch mode ? if (keycode == JAVA_KEYCODE_BIT_CTRL) { if (KEY_PRESSED == event_type) { get_emul_multi_touch_state()->multitouch_enable = 1; @@ -98,7 +98,7 @@ void do_key_event( int event_type, int keycode ) return; } - int scancode = javakeycode_to_scancode(keycode); + int scancode = javakeycode_to_scancode(keycode, event_type); if (scancode == -1) { INFO("cannot find scancode\n"); return; -- 2.7.4