touch: multi-touch enhancement 96/14096/1
authorGiWoong Kim <giwoong.kim@samsung.com>
Fri, 20 Dec 2013 08:03:25 +0000 (17:03 +0900)
committerGiWoong Kim <giwoong.kim@samsung.com>
Mon, 23 Dec 2013 05:14:22 +0000 (14:14 +0900)
1. added protocol for multi-touch state
2. modified clearFingerSlot fucntion
3. removed unguarded write in communicator

Change-Id: I957159a87ecb524aa77b83a528b39bc2b8e28d02
Signed-off-by: GiWoong Kim <giwoong.kim@samsung.com>
tizen/src/maru_finger.c
tizen/src/maru_finger.h
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorFingers.java
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java
tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java
tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/SocketCommunicator.java
tizen/src/skin/client/src/org/tizen/emulator/skin/menu/KeyWindowKeeper.java
tizen/src/skin/maruskin_operation.c
tizen/src/skin/maruskin_server.c
tizen/src/skin/maruskin_server.h

index c6b61c47a4dbee453939c7b925dc4621d196d9ca..6c2ccf5ebad7850377787c19ae1d705e14a67b40 100644 (file)
@@ -245,7 +245,7 @@ int add_finger_point(int origin_x, int origin_y, int x, int y)
     MultiTouchState *mts = get_emul_multi_touch_state();
 
     if (mts->finger_cnt == mts->finger_cnt_max) {
-        INFO("support multi-touch up to %d fingers\n", mts->finger_cnt_max);
+        WARN("support multi-touch up to %d fingers\n", mts->finger_cnt_max);
         return -1;
     }
 
@@ -542,13 +542,17 @@ int rearrange_finger_points(
     return count;
 }
 
-void clear_finger_slot(void)
+void clear_finger_slot(bool keep_enable)
 {
     int i = 0;
     MultiTouchState *mts = get_emul_multi_touch_state();
     FingerPoint *finger = NULL;
 
-    INFO("clear multi-touch\n");
+    if (keep_enable == false) {
+        set_multi_touch_enable(0);
+    }
+
+    INFO("clear multi-touch : %d\n", get_multi_touch_enable());
 
     for (i = 0; i < mts->finger_cnt; i++) {
         finger = get_finger_point_from_slot(i);
@@ -571,9 +575,7 @@ void cleanup_multi_touch_state(void)
     MultiTouchState *mts = get_emul_multi_touch_state();
     SDL_Surface *point = (SDL_Surface *)mts->finger_point_surface;
 
-    mts->multitouch_enable = 0;
-
-    clear_finger_slot();
+    clear_finger_slot(false);
     g_free(mts->finger_slot);
 
     mts->finger_point_surface = NULL;
index 35015e4d184b60ea438a84b39413398496a35e42..51d7f53200fb6f1ed74d9de063ae64bda9acb0d7 100644 (file)
@@ -31,6 +31,8 @@
 #ifndef __MARU_FINGER_H__
 #define __MARU_FINGER_H__
 
+#include "qemu-common.h"
+
 
 /* definitions relating to multi-touch */
 #define MAX_FINGER_CNT 10
@@ -69,7 +71,7 @@ int add_finger_point(int origin_x, int origin_y, int x, int y);
 void maru_finger_processing_1(int touch_type, int origin_x, int origin_y, int x, int y);
 void maru_finger_processing_2(int touch_type, int origin_x, int origin_y, int x, int y);
 int rearrange_finger_points(int lcd_w, int lcd_h, double scale_factor, int rotaton_type);
-void clear_finger_slot(void);
+void clear_finger_slot(bool keep_enable);
 void cleanup_multi_touch_state(void);
 
 
index 2042e3a0fedfcdc68563f966a28ad3953eda4eb4..b2b914dc54d36751aba63bf9945bae51644c80bc 100644 (file)
@@ -80,6 +80,7 @@ public class EmulatorFingers {
                initMultiTouchState(maximum, palette);
        }
 
+       /* one finger */
        static class FingerPoint {
                private int id;
                private int originX;
@@ -492,19 +493,20 @@ public class EmulatorFingers {
                return count;
        }
 
-       public void clearFingerSlot() {
+       public void clearFingerSlot(boolean keepEnable) {
                int i = 0;
                FingerPoint finger = null;
 
-               logger.info("clear multi-touch slot");
+               if (keepEnable == false) {
+                       setMultiTouchEnable(0);
+               }
+
+               logger.info("clear multi-touch : " + getMultiTouchEnable());
 
                for (i = 0; i < fingerCnt; i++) {
                        finger = getFingerPointFromSlot(i);
                        if (finger != null) {
                                if (finger.id > 0) {
-                                       logger.info(String.format(
-                                                       "clear %d, %d, %d", finger.x, finger.y, finger.id - 1));
-
                                        MouseEventData mouseEventData = new MouseEventData(
                                                        MouseButtonType.LEFT.value(), MouseEventType.RELEASE.value(),
                                                        0, 0, finger.x, finger.y, finger.id - 1);
@@ -522,8 +524,7 @@ public class EmulatorFingers {
        }
 
        public void cleanupMultiTouchState() {
-               multiTouchEnable = 0;
-               clearFingerSlot();
+               clearFingerSlot(false);
 
                fingerPointImage.dispose();
        }
index 65a9a7197c6d706e55fda9b46d683a1dc29cad22..47729e2d1bcd38d02d8175d4a7666012ca1ebce1 100644 (file)
@@ -229,8 +229,7 @@ public class EmulatorShmSkin extends EmulatorSkin {
        protected void skinFinalize() {
                pollThread.stopRequest();
 
-               finger.setMultiTouchEnable(0);
-               finger.clearFingerSlot();
+               /* remove multi-touch finger points */
                finger.cleanupMultiTouchState();
 
                super.skinFinalize();
@@ -557,10 +556,9 @@ public class EmulatorShmSkin extends EmulatorSkin {
                        if (tempStateMask == (multiTouchKeySub | multiTouchKey)) {
                                finger.setMultiTouchEnable(1);
 
-                               logger.info("enable multi-touch = mode1");
+                               logger.info("enable multi-touch = mode 1");
                        } else {
-                               finger.setMultiTouchEnable(0);
-                               finger.clearFingerSlot();
+                               finger.clearFingerSlot(false);
 
                                logger.info("disable multi-touch");
                        }
@@ -596,7 +594,7 @@ public class EmulatorShmSkin extends EmulatorSkin {
                                pressingOriginX = pressingOriginY = -1;
                        }
 
-                       logger.info("enable multi-touch = mode2");
+                       logger.info("enable multi-touch = mode 2");
                } else if (keyCode == multiTouchKeySub || keyCode == multiTouchKey) {
                        finger.setMultiTouchEnable(1);
 
@@ -611,7 +609,7 @@ public class EmulatorShmSkin extends EmulatorSkin {
                                pressingOriginX = pressingOriginY = -1;
                        }
 
-                       logger.info("enable multi-touch = mode1");
+                       logger.info("enable multi-touch = mode 1");
                }
 
                KeyEventData keyEventData = new KeyEventData(
index 51891eb9daa319c20084ff789181075f5cac5734..beffaf6d1524d0e49bd19bdf1a1fbafbbc566066 100644 (file)
@@ -252,6 +252,7 @@ public interface ICommunicator extends Runnable {
                RECV_BRIGHTNESS_STATE((short) 6),
                RECV_ECP_PORT_DATA((short) 7),
                RECV_HOST_KBD_STATE((short) 8),
+               RECV_MULTI_TOUCH_STATE((short) 9),
 
                RECV_SENSORD_STARTED((short) 800),
                RECV_SDBD_STARTED((short) 801),
index 66394e2d0188cc1561e97ca90ea61f9d4f23ae21..6555aa897063efdf32be263cbd2a0db83df9f7a4 100755 (executable)
@@ -421,6 +421,32 @@ public class SocketCommunicator implements ICommunicator {
 
                                        break;
                                }
+                               case RECV_MULTI_TOUCH_STATE: {
+                                       logger.info("received MULTI_TOUCH_STATE from QEMU");
+
+                                       resetDataTransfer(miscDataTransfer);
+                                       receiveData(miscDataTransfer, length);
+
+                                       byte[] receivedData = getReceivedData(miscDataTransfer);
+                                       if (null != receivedData) {
+                                               String strValue = new String(receivedData, 0, length - 1, "UTF-8");
+
+                                               int value = 1;
+                                               try {
+                                                       value = Integer.parseInt(strValue);
+                                               } catch (NumberFormatException e) {
+                                                       e.printStackTrace();
+                                               }
+
+                                               if (value == 0) {
+                                                       //TODO:
+                                               } else {
+                                                       //TODO:
+                                               }
+                                       }
+
+                                       break;
+                               }
                                case RECV_SENSORD_STARTED: {
                                        logger.info("received SENSORD_STARTED from QEMU");
 
@@ -466,9 +492,12 @@ public class SocketCommunicator implements ICommunicator {
                                case RECV_EMUL_RESET: {
                                        logger.info("received EMUL_RESET from QEMU");
 
-                                       isSensorDaemonStarted = false;
-                                       isSdbDaemonStarted = false;
-                                       isEcsServerStarted = false;
+                                       synchronized (this) {
+                                               isSensorDaemonStarted = false;
+                                               isSdbDaemonStarted = false;
+                                               isEcsServerStarted = false;
+                                       }
+
                                        // TODO:
 
                                        break;
index 37cf4b9c6e3811e6b6afadf5c60a9d9be05497be..4a496dc6beb07d27b86ed4f045e3808e5f34a6ca 100644 (file)
@@ -112,6 +112,10 @@ public class KeyWindowKeeper {
                        MenuItem layout = keywindowMenu.getItem(indexLayout);
                        if (layout == null) {
                                layout = keywindowMenu.getItem(0);
+                               if (layout == null) {
+                                       return;
+                               }
+
                                layout.setSelection(true);
                        }
 
index 4f01c430a72a4a6c30ec30261a2a85ab0b51c172..1cd3c1f45a47d6bd2a401e4ecf6f560f8605fc50 100644 (file)
@@ -192,8 +192,8 @@ void do_keyboard_key_event(int event_type,
         event_type, keycode, state_mask, key_location);
 
 #ifndef CONFIG_USE_SHM
-    //is multi-touch mode ?
     if (get_emul_max_touch_point() > 1) {
+        /* multi-touch checking */
         int state_mask_temp = state_mask & ~JAVA_KEYCODE_NO_FOCUS;
 
         if ((keycode == JAVA_KEYCODE_BIT_SHIFT &&
@@ -215,7 +215,7 @@ void do_keyboard_key_event(int event_type,
                     pressing_origin_x = pressing_origin_y = -1;
                 }
 
-                INFO("enable multi-touch = mode2\n");
+                INFO("enable multi-touch = mode 2\n");
             }
         }
         else if (keycode == JAVA_KEYCODE_BIT_CTRL ||
@@ -235,14 +235,13 @@ void do_keyboard_key_event(int event_type,
                     pressing_origin_x = pressing_origin_y = -1;
                 }
 
-                INFO("enable multi-touch = mode1\n");
+                INFO("enable multi-touch = mode 1\n");
             } else if (KEY_RELEASED == event_type) {
                 if (state_mask_temp == (JAVA_KEYCODE_BIT_CTRL | JAVA_KEYCODE_BIT_SHIFT)) {
                     get_emul_multi_touch_state()->multitouch_enable = 1;
-                    INFO("enabled multi-touch = mode1\'\n");
+                    INFO("enabled multi-touch = mode 1\'\n");
                 } else {
-                    get_emul_multi_touch_state()->multitouch_enable = 0;
-                    clear_finger_slot();
+                    clear_finger_slot(false);
                     INFO("disable multi-touch\n");
                 }
             }
index 25d982f7b97b8e93123260e715a5bf5a665978e4..35788d69289fa68fbc6af830cc2d94de058d83c8 100644 (file)
@@ -132,6 +132,7 @@ enum {
     SEND_BRIGHTNESS_STATE = 6,
     SEND_ECP_PORT_DATA = 7,
     SEND_HOST_KBD_STATE = 8,
+    SEND_MULTI_TOUCH_STATE = 9,
 
     SEND_SENSORD_STARTED = 800,
     SEND_SDBD_STARTED = 801,
@@ -455,6 +456,31 @@ void notify_host_kbd_state(bool on)
     }
 }
 
+void notify_multi_touch_state(bool on)
+{
+#define MULTITOUCH_DATA_LENGTH 2
+    char mt_state_data[MULTITOUCH_DATA_LENGTH] = { 0, };
+
+    if (on == false) {
+        snprintf(mt_state_data, MULTITOUCH_DATA_LENGTH, "0");
+    } else {
+        snprintf(mt_state_data, MULTITOUCH_DATA_LENGTH, "1");
+    }
+
+    TRACE("notify multi touch state : %s\n", mt_state_data);
+
+    if (client_sock) {
+        if (0 > send_skin_data(client_sock,
+            SEND_MULTI_TOUCH_STATE,
+            (unsigned char *)mt_state_data, MULTITOUCH_DATA_LENGTH, 0)) {
+
+            ERR("fail to send SEND_MULTI_TOUCH_STATE to skin\n");
+        }
+    } else {
+        INFO("skin client socket is not connected yet\n");
+    }
+}
+
 void notify_emul_reset(void)
 {
     INFO("notify_emul_reset\n");
index e7e278f425511393969fdad684606ce427272e7a..28da5f6a99ec94185de7abbafa5bfd3752eb19ca 100644 (file)
@@ -42,6 +42,7 @@ void notify_ramdump_completed(void);
 void notify_booting_progress(unsigned int layer, int progress_value);
 void notify_brightness_state(bool on);
 void notify_host_kbd_state(bool on);
+void notify_multi_touch_state(bool on);
 void notify_emul_reset(void);
 
 int is_ready_skin_server(void);