[Title] CapsLock state is synchronized with host key value
authorgiwoong.kim <giwoong.kim@samsung.com>
Tue, 27 Mar 2012 10:50:23 +0000 (19:50 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Tue, 27 Mar 2012 10:50:23 +0000 (19:50 +0900)
[Type]
[Module] Emulator
[Priority]
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/emul_state.c
tizen/src/emul_state.h
tizen/src/emulator.c
tizen/src/skin/maruskin_keymap.c
tizen/src/skin/maruskin_keymap.h
tizen/src/skin/maruskin_operation.c

index 9a76712..7fe7f85 100644 (file)
 #include "emul_state.h"
 #include "debug_ch.h"
 
+#ifdef __linux__
+#include <X11/XKBlib.h>
+#elif _WIN32
+#include <windows.h>
+#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;
+}
index fbe341f..c7552be 100644 (file)
@@ -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__ */
index 08567a1..b92e39b 100644 (file)
@@ -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)
index 3df849b..aca7f86 100644 (file)
 
 
 #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];
index c295d1b..25cd36d 100644 (file)
@@ -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_ */
index 0b2e42b..2992247 100644 (file)
@@ -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;