[Title] Fixed inconsistent NumLock/CapsLock states and long-pressed key issue
authordon.hong <don.hong@samsung.com>
Thu, 15 Dec 2011 12:03:01 +0000 (21:03 +0900)
committerdon.hong <don.hong@samsung.com>
Thu, 15 Dec 2011 12:03:01 +0000 (21:03 +0900)
[Type] BugFix
[Module]
[Priority]
[CQ#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/config_dbg_x86.ini [new file with mode: 0644]
tizen/src/emulator.sh
tizen/src/event_handler.c

diff --git a/tizen/src/config_dbg_x86.ini b/tizen/src/config_dbg_x86.ini
new file mode 100644 (file)
index 0000000..28807fa
--- /dev/null
@@ -0,0 +1,29 @@
+[COMMON]
+ALWAYS_ON_TOP=1
+
+[EMULATOR]
+ENABLE_SHELL=1
+MAIN_X=0
+MAIN_Y=0
+
+[QEMU]
+BINARY=emulator-x86
+HTTP_PROXY=1
+DNS_SERVER=1
+TELNET_PORT=1200
+KVM=1
+
+[ADDITIONAL_OPTION]
+EMULATOR_OPTION=
+QEMU_OPTION= 
+
+[HARDWARE]
+RESOLUTION=480x800
+BUTTON_TYPE=1
+SDCARD_TYPE=0
+SDCARD_PATH=
+RAM_SIZE=512
+DPI=2070
+DISK_TYPE=0
+BASEDISK_PATH=
+DISK_PATH=../../../../emulator-image/emulimg-default.x86
index d7eab49..9c9aac7 100755 (executable)
@@ -41,7 +41,6 @@ else
 fi
 
 EMULATOR_DATA_PATH="$EMULATOR_BIN_PATH/data"
-EMULATOR_SKIN_PATH="$EMULATOR_BIN_PATH/skins"
 EMULATOR_KERNEL_PATH="${EMULATOR_DATA_PATH}/kernel-img"
 EMULATOR_KERNEL_NAME_ARM="zImage_arm"
 EMULATOR_KERNEL_NAME_X86="bzImage"
@@ -92,8 +91,6 @@ display_help_mesgs () {
        echo "\t\t Run emulator with gdb"
        echo "\t --ddd-kernel"
        echo "\t\t Run emulator with DDD(Data Display Debugger)"
-       echo "\t --q | --quick-start"
-       echo "\t\t quick start of emulator without showing option window"
        echo "\t --t [new image] | --target [new image]"
        echo "\t\t Run emulator with new image"
        echo "\t --h | --help"
@@ -109,9 +106,6 @@ parse_input_params () {
        while [ "$1" != "" ]
        do
                case $1 in
-               disk*)
-                       BOOT_OPTION="--disk"
-                       shift ;;
                nfs*)
                        BOOT_OPTION="--target"
                        shift ;;
@@ -159,9 +153,6 @@ parse_input_params () {
                        ulimit -c 0
                        emul_opts="--no-dump $emul_opts"
                        shift ;;
-               --q|--quick-start)
-                       quick_start=1
-                       shift;;
                --t|--target)
                        while echo "$2" | grep "^[^-]"
                        do
@@ -206,7 +197,6 @@ set_terminal_type () {
 
 set_user_env () {
        test -e "/dev/kvm" && kvm_opt="-enable-kvm"
-       quick_start=0
 
        set_terminal_type
        parse_input_params $@
@@ -247,23 +237,23 @@ set_devel_env () {
        echo "Running from build directory"
        EMULATOR_BIN_PATH="$build_dir"
 
-#        test -h "$build_dir/skins" || ln -s "$build_dir/../skins" "$build_dir/skins"
-
        case ${TARGET_ARCH} in
                *arm)
+                       test -d "$build_dir/../etc" || mkdir "$build_dir/../etc"
+                       test -f "$build_dir/../etc/DEBUGCH" || cp "$build_dir/DEBUGCH" "$build_dir/../etc/" 
+                       test -d "$build_dir/../arm" || mkdir "$build_dir/../arm"
+                       test -h "$build_dir/../arm/conf" || ln -s "$build_dir/../conf" "$build_dir/../arm/conf"
+                       test -h "$build_dir/../arm/data" || ln -s "$build_dir/../data" "$build_dir/../arm/data"
+                       test -d "$build_dir/../arm/VMs" || mkdir "$build_dir/../arm/VMs" 
+                       test -d "$build_dir/../arm/VMs/default" || mkdir "$build_dir/../arm/VMs/default" 
+                       test -d "$build_dir/../arm/VMs/default/logs" || mkdir "$build_dir/../arm/VMs/default/logs" 
+                       test -f "$build_dir/../arm/VMs/default/config.ini" || cp "$build_dir/config_dbg_arm.ini" "$build_dir/../arm/VMs/default/config.ini" 
+
                        # find the target path
                        test "$BOOT_OPTION" = "--disk" && TARGET_PATH="$EMULATOR_BIN_PATH/../../emulator-image/$TARGET_NAME"
+
                        # fine the kernel image
-                       EMULATOR_KERNEL_LINK="$EMULATOR_BIN_PATH/../../../kernel/linux-current"
-                       if test -h "$EMULATOR_KERNEL_LINK" -a -d "$EMULATOR_KERNEL_LINK/arch/arm/boot"
-                       then
-                               EMULATOR_KERNEL_PATH="$EMULATOR_KERNEL_LINK/arch/arm/boot"
-                               EMULATOR_KERNEL_NAME_ARM="zImage"
-                               if test "$DDD" != "" 
-                               then
-                                       DDD="$DDD --debugger /usr/bin/arm-linux/bin/arm-linux-gdb $EMULATOR_KERNEL_PATH/../../../vmlinux"
-                               fi
-                       elif test -d "$EMULATOR_BIN_PATH/../../../kernel/linux-2.6.32/arch/arm/boot"
+                       if test -d "$EMULATOR_BIN_PATH/../../../kernel/linux-2.6.32/arch/arm/boot"
                        then
                                EMULATOR_KERNEL_PATH="$EMULATOR_BIN_PATH/../../../kernel/linux-2.6.32/arch/arm/boot"
                                EMULATOR_KERNEL_NAME_ARM="zImage"
@@ -277,27 +267,20 @@ set_devel_env () {
                        ;;
                *86)    
                        test -d "$build_dir/../etc" || mkdir "$build_dir/../etc"
+                       test -f "$build_dir/../etc/DEBUGCH" || cp "$build_dir/DEBUGCH" "$build_dir/../etc/" 
                        test -d "$build_dir/../x86" || mkdir "$build_dir/../x86"
                        test -h "$build_dir/../x86/conf" || ln -s "$build_dir/../conf" "$build_dir/../x86/conf"
                        test -h "$build_dir/../x86/data" || ln -s "$build_dir/../data" "$build_dir/../x86/data"
                        test -d "$build_dir/../x86/VMs" || mkdir "$build_dir/../x86/VMs" 
                        test -d "$build_dir/../x86/VMs/default" || mkdir "$build_dir/../x86/VMs/default" 
                        test -d "$build_dir/../x86/VMs/default/logs" || mkdir "$build_dir/../x86/VMs/default/logs" 
-                       test -f "$build_dir/../x86/VMs/default/config.ini" || cp "$build_dir/config_dbg.ini" "$build_dir/../x86/VMs/default/config.ini" 
+                       test -f "$build_dir/../x86/VMs/default/config.ini" || cp "$build_dir/config_dbg_x86.ini" "$build_dir/../x86/VMs/default/config.ini" 
 
                        # find the target path
                        test "$BOOT_OPTION" = "--disk" && TARGET_PATH="$EMULATOR_BIN_PATH/../../../../emulator-image/$TARGET_NAME"
 
                        # fine the kernel image
-                       EMULATOR_KERNEL_LINK="$EMULATOR_BIN_PATH/../../../emulator-kernel"
-                       if test -h "$EMULATOR_KERNEL_LINK" -a -d "$EMULATOR_KERNEL_LINK/arch/x86/boot"
-                       then
-                               EMULATOR_KERNEL_PATH="$EMULATOR_KERNEL_LINK/arch/x86/boot"
-                               if test "$DDD" != "" 
-                               then
-                                       DDD="$DDD $EMULATOR_KERNEL_PATH/../../../vmlinux"
-                               fi
-                       elif test -d "$EMULATOR_BIN_PATH/../../../emulator-kernel/arch/x86/boot"
+                       if test -d "$EMULATOR_BIN_PATH/../../../emulator-kernel/arch/x86/boot"
                        then
                                EMULATOR_KERNEL_PATH="$EMULATOR_BIN_PATH/../../../emulator-kernel/arch/x86/boot"
                                if test "$DDD" != "" 
@@ -310,13 +293,6 @@ set_devel_env () {
                        ;;
        esac
 
-       # find the skins
-       if test -d "$EMULATOR_BIN_PATH/../skins"
-       then
-               EMULATOR_SKIN_PATH="$EMULATOR_BIN_PATH/../skins"
-               echo "Found skins in $EMULATOR_SKIN_PATH"
-       fi
-
        # find the bios path
        if test -d "$EMULATOR_BIN_PATH/../data/pc-bios"
        then
@@ -326,51 +302,6 @@ set_devel_env () {
 }
 
 set_emulator_options () {
-       if test \! -d "$EMULATOR_SKIN_PATH"
-       then
-               echo "No emulator skins found..." >> $STDERR_LOGFILE
-               exit 1
-       fi
-
-       target_conf="$TARGET_PATH/TargetInfo.conf"
-       if test -f "$target_conf"
-       then
-               skin=`grep "^EmulatorSkinPath=" "$target_conf" | cut -f2 -d=`
-               case "$skin" in
-               /*)
-                       ;;
-               skin*)
-                       skin="$EMULATOR_SKIN_PATH/../$skin"
-                       ;;
-               *)
-                       skin="$EMULATOR_SKIN_PATH/$skin"
-                       ;;
-               esac
-       fi
-
-       # no skin, search for one
-       if test "$skin" = ""
-       then
-               skin="$EMULATOR_SKIN_PATH/emul_480x800/default.dbi"
-       fi
-       if test \! -f "$skin"
-       then
-               echo "No skin file found" >> $STDERR_LOGFILE
-               exit 1
-       fi
-
-       export EMULATOR_SKIN_PATH
-
-       case ${TARGET_ARCH} in
-               *arm)
-                       #qemu_skin
-                       emul_opts="$emul_opts --skin $skin"
-
-                       #quick_start
-                       emul_opts="$emul_opts --quick-start $quick_start"
-                       ;;
-       esac
-       
        #disable dump
        if test EMUL_DUMP = 0
        then
@@ -478,7 +409,6 @@ case ${TARGET_ARCH} in
                DGLES2_BACKEND='env DGLES2_BACKEND=osmesa'
                # export DGLES2_BACKEND="osmesa"
                exec $GDB $DGLES2_BACKEND "${EMULATOR_BIN_PATH}/emulator-arm" \
-                       $BOOT_OPTION "$TARGET_PATH" \
                        $emul_opts -- $qemu_arm_opts $qemu_common_opts $debug_ports
                ;;
        *86)
@@ -488,8 +418,7 @@ case ${TARGET_ARCH} in
                        $BOOT_OPTION "$TARGET_PATH" \
                        $emul_opts -- $qemu_x86_opts $qemu_common_opts $debug_ports $kvm_opt 1>> $EMUL_LOGFILE 2> stderr.log
                else
-               exec $GDB "${EMULATOR_BIN_PATH}/emulator-x86" --vtm default \
-                       $BOOT_OPTION "$TARGET_PATH" \
+               exec $GDB "${EMULATOR_BIN_PATH}/emulator-x86" \
                        $emul_opts -- $qemu_x86_opts $qemu_common_opts $debug_ports $kvm_opt
                fi
                ;;
index 6c62d32..8043a09 100755 (executable)
@@ -66,7 +66,6 @@
 #include "utils.h"
 #include "tools.h"
 #include "debug_ch.h"
-#include <sys/utsname.h>
 
 //DEFAULT_DEBUG_CHANNEL(tizen);
 MULTI_DEBUG_CHANNEL(tizen, event_handler);
@@ -90,7 +89,7 @@ static int gui_key_modifier_pressed;
 static int gui_keysym;
 static kbd_layout_t *kbd_layout = NULL;
 extern multi_touch_state qemu_mts;
-extern struct utsname host_uname_buf;
+
 
 static uint8_t gtk_keyevent_to_keycode_generic(const GdkEventKey *event)
 {
@@ -345,20 +344,19 @@ static void reset_keys(void)
 
 static void gtk_process_key(GdkEventKey *event)
 {
-       int keycode, v;
-       int i;
+       static guint ev_state = 0;
+       static GdkEventKey prev_event ;
+       int keycode;
 
        if (event->keyval == GDK_Pause) {
                /* specific case */
-               v = 0;
-
-               if (event->type == GDK_KEY_RELEASE)
-               v |= 0x80;
+               int v = (event->type == GDK_KEY_RELEASE) ? 0x80 : 0;
 
                kbd_put_keycode(0xe1);
                kbd_put_keycode(0x1d | v);
                kbd_put_keycode(0x45 | v);
-               return;
+
+               prev_event = *event; return;
        }
 
        if (kbd_layout)
@@ -370,12 +368,15 @@ static void gtk_process_key(GdkEventKey *event)
        case 0x00:
                /* sent when leaving window: reset the modifiers state */
                reset_keys();
-               return;
+               prev_event = *event; return;
+       case 0x2a:                          /* Left Shift */
+       case 0x36:                          /* Right Shift */
        case 0x1d:                          /* Left CTRL */
                if (event->type == GDK_KEY_RELEASE) {
                        qemu_mts.multitouch_enable = 0;
 
                        if (qemu_mts.finger_cnt > 0) {
+                               int i;
                                for (i = 0; i < qemu_mts.finger_cnt; i++) {
                                        kbd_mouse_event(qemu_mts.finger_slot[i].dx, qemu_mts.finger_slot[i].dy, i, 0);
                                }
@@ -384,9 +385,8 @@ static void gtk_process_key(GdkEventKey *event)
                } else {
                        qemu_mts.multitouch_enable = 1;
                }
+
        case 0x9d:                          /* Right CTRL */
-       case 0x2a:                          /* Left Shift */
-       case 0x36:                          /* Right Shift */
        case 0x38:                          /* Left ALT */
        case 0xb8:                         /* Right ALT */
                if (event->type == GDK_KEY_RELEASE)
@@ -394,28 +394,50 @@ static void gtk_process_key(GdkEventKey *event)
                else
                        modifiers_state[keycode] = 1;
                break;
-       case 0x45: /* num lock */
-       case 0x3a: /* caps lock */
-               /* GTK does send the key up event, so we dont generate it */
-               /*kbd_put_keycode(keycode);
-               kbd_put_keycode(keycode | 0x80);
-               return;*/
+       case 0x45:      /* Num Lock */
+               if (event->type == GDK_KEY_RELEASE)
+                       ev_state ^= GDK_MOD2_MASK;
+               break;
+       case 0x3a:      /* Caps Lock */
+               if (event->type == GDK_KEY_RELEASE)
+                       ev_state ^= GDK_LOCK_MASK;
                break;
        }
 
-       /* now send the key code */
+//     fprintf(stderr, "input key = %02x %s\n", keycode, (event->type == GDK_KEY_PRESS)? "press":"release");
 
-       if (keycode & 0x80) {
-               kbd_put_keycode(0xe0);
-       }
+       if (event->type == GDK_KEY_PRESS) {
+               /* Put release keycode of previous pressed key becuase GTK doesn't generate release event of long-pushed key */
+               if (prev_event.type == GDK_KEY_PRESS &&
+                       prev_event.state == event->state &&
+                       prev_event.hardware_keycode == event->hardware_keycode) {
+                       if (keycode & 0x80)
+                               kbd_put_keycode(0xe0);
+                       kbd_put_keycode(keycode | 0x80);
+               }
+               else {
+                       /* synchronize state of Num Lock to host's event->state */
+                       if ((event->state ^ ev_state) & GDK_MOD2_MASK) {
+                               ev_state ^= GDK_MOD2_MASK;
+                               kbd_put_keycode(0x45 & 0x7f);
+                               kbd_put_keycode(0x45 | 0x80);
+                       }
 
-       if (event->type == GDK_KEY_RELEASE) {
-               kbd_put_keycode(keycode | 0x80);
+                       /* synchronize state of Caps Lock to host's event->state */
+                       if ((event->state ^ ev_state) & GDK_LOCK_MASK) {
+                               ev_state ^= GDK_LOCK_MASK;
+                               kbd_put_keycode(0x3a & 0x7f);
+                               kbd_put_keycode(0x3a | 0x80);
+                       }
+               }
        }
 
-       else {
-               kbd_put_keycode(keycode & 0x7f);
-       }
+       /* now send the key code */
+       if (keycode & 0x80)
+               kbd_put_keycode(0xe0);
+       kbd_put_keycode((event->type == GDK_KEY_RELEASE) ? (keycode | 0x80) : (keycode & 0x7f));
+
+       prev_event = *event; return;
 }
 
 
@@ -1056,15 +1078,10 @@ gint motion_notify_event_handler(GtkWidget *widget, GdkEventButton *event, gpoin
   */
 gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
 {
-       // Ubuntu 11.10 configure_event bug work-around
-       if (strcmp(host_uname_buf.release, "3.0.0-12-generic") == 0 && event->x == 0 && event->y == 0) {
-               return TRUE;
-       }
-
        /* just save new values in configuration structure */
+
        configuration.main_x = event->x;
        configuration.main_y = event->y;
-       INFO("configure_event x=%d, y=%d", event->x, event->y);
 
        return TRUE;
 }