[Title] support 3point multitouch
authorgiwoong.kim <giwoong.kim@samsung.com>
Tue, 3 Jul 2012 08:26:07 +0000 (17:26 +0900)
committergiwoong.kim <giwoong.kim@samsung.com>
Tue, 3 Jul 2012 08:26:07 +0000 (17:26 +0900)
[Type] feature
[Module] Emulator / touch
[Priority] major
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase] Ctrl + Shift + click

tizen/src/maru_finger.c
tizen/src/maru_finger.h
tizen/src/maru_sdl.c
tizen/src/skin/maruskin_operation.c

index 9f03ba34f2a5e8cf4f2be32e9877d7bf9d029071..cc37f5970624665560180645fb843bc10489c853 100644 (file)
@@ -279,7 +279,7 @@ FingerPoint *get_finger_point_search(int x, int y)
 static int _grab_finger_id = 0;
 #define QEMU_MOUSE_PRESSED 1
 #define QEMU_MOUSE_RELEASEED 0
-void maru_finger_processing(int touch_type, int origin_x, int origin_y, int x, int y)
+void maru_finger_processing_A(int touch_type, int origin_x, int origin_y, int x, int y)
 {
     MultiTouchState *mts = get_emul_multi_touch_state();
     FingerPoint *finger = NULL;
@@ -339,7 +339,72 @@ void maru_finger_processing(int touch_type, int origin_x, int origin_y, int x, i
     } else if (touch_type == MOUSE_UP) { /* released */
         _grab_finger_id = 0;
     }
+}
+
+void maru_finger_processing_B(int touch_type, int origin_x, int origin_y, int x, int y)
+{
+    MultiTouchState *mts = get_emul_multi_touch_state();
+    FingerPoint *finger = NULL;
 
+    if (touch_type == MOUSE_DOWN || touch_type == MOUSE_DRAG) { /* pressed */
+        if (_grab_finger_id > 0) {
+            finger = get_finger_point_from_slot(_grab_finger_id - 1);
+            if (finger != NULL) {
+                int origin_distance_x = origin_x - finger->origin_x;
+                int origin_distance_y = origin_y - finger->origin_y;
+                int distance_x = x - finger->x;
+                int distance_y = y - finger->y;
+
+                int i = 0;
+                for( ; i < get_emul_multi_touch_state()->finger_cnt; i++) {
+                    finger = get_finger_point_from_slot(i);
+
+                    if (finger != NULL) {
+                        finger->origin_x += origin_distance_x;
+                        finger->origin_y += origin_distance_y;
+                        finger->x += distance_x;
+                        finger->y += distance_y;
+                        if (finger->id != 0) {
+                            kbd_mouse_event(finger->x, finger->y, i, QEMU_MOUSE_PRESSED);
+                            TRACE("id %d finger multi-touch dragging = (%d, %d)\n", i + 1, finger->x, finger->y);
+                        }
+#ifdef _WIN32
+                        Sleep(2);
+#else
+                        usleep(2000);
+#endif
+                    }
+                }
+            }
+            return;
+        }
+
+        if (mts->finger_cnt == 0)
+        { //first finger touch input
+            if (_add_finger_point(origin_x, origin_y, x, y) == -1) {
+                return;
+            }
+            kbd_mouse_event(x, y, 0, QEMU_MOUSE_PRESSED);
+        }
+        else if ((finger = get_finger_point_search(x, y)) != NULL) //check the position of previous touch event
+        {
+            //finger point is selected
+            _grab_finger_id = finger->id;
+            TRACE("id %d finger is grabbed\n", _grab_finger_id);
+        }
+        else if (mts->finger_cnt == mts->finger_cnt_max) //Let's assume that this event is last finger touch input
+        {
+            //do nothing
+        }
+        else //one more finger
+        {
+            _add_finger_point(origin_x, origin_y, x, y) ;
+            kbd_mouse_event(x, y, mts->finger_cnt - 1, QEMU_MOUSE_PRESSED);
+        }
+
+    } else if (touch_type == MOUSE_UP) { /* released */
+        _grab_finger_id = 0;
+    }
 }
 
 void clear_finger_slot(void)
index 8a98475930c2b02c363aa356bc73e19963cf975a..53cc43a59e65a19a586b8a532e37643c06f99e1c 100644 (file)
@@ -65,7 +65,8 @@ void set_multi_touch_enable(int enable);
 int get_multi_touch_enable(void);
 FingerPoint *get_finger_point_from_slot(int index);
 FingerPoint *get_finger_point_search(int x, int y);
-void maru_finger_processing(int touch_type, int origin_x, int origin_y, int x, int y);
+void maru_finger_processing_A(int touch_type, int origin_x, int origin_y, int x, int y);
+void maru_finger_processing_B(int touch_type, int origin_x, int origin_y, int x, int y);
 void clear_finger_slot(void);
 void cleanup_multi_touch_state(void);
 
index 0102a45fb26f2f408f845ed1050be22e5f5e4072..731e31890e1a7dcd525de1baef5d5940f317fb62 100644 (file)
@@ -83,7 +83,7 @@ static void qemu_update(void)
 
     /* draw multi-touch finger points */
     MultiTouchState *mts = get_emul_multi_touch_state();
-    if (mts->multitouch_enable == 1 && mts->finger_point_surface != NULL) {
+    if (mts->multitouch_enable != 0 && mts->finger_point_surface != NULL) {
         FingerPoint *finger = NULL;
         int finger_point_size_half = mts->finger_point_size / 2;
         SDL_Rect rect;
index d8f289b2c5a14a4110d52bc90b59395ff52fd727..e38511b19b635419342dc22fad2a3310c3bb5c6d 100644 (file)
@@ -80,7 +80,9 @@ void do_mouse_event( int event_type, int origin_x, int origin_y, int x, int y, i
     TRACE( "mouse_event event_type:%d, origin:(%d, %d), x:%d, y:%d, z:%d\n", event_type, origin_x, origin_y, x, y, z );
 
     if (get_emul_multi_touch_state()->multitouch_enable == 1) {
-        maru_finger_processing(event_type, origin_x, origin_y, x, y);
+        maru_finger_processing_A(event_type, origin_x, origin_y, x, y);
+    } else if (get_emul_multi_touch_state()->multitouch_enable == 2) {
+        maru_finger_processing_B(event_type, origin_x, origin_y, x, y);
     }
     else if ( MOUSE_DOWN == event_type || MOUSE_DRAG == event_type) { //single touch
         kbd_mouse_event(x, y, z, 1);
@@ -108,7 +110,7 @@ void do_key_event( int event_type, int keycode, int key_location )
         if (keycode == JAVA_KEYCODE_BIT_CTRL) {
             if (KEY_PRESSED == event_type) {
                 get_emul_multi_touch_state()->multitouch_enable = 1;
-                INFO("multi-touch enabled\n");
+                INFO("multi-touch enabled = A\n");
             } else if (KEY_RELEASED == event_type) {
                 get_emul_multi_touch_state()->multitouch_enable = 0;
                 clear_finger_slot();
@@ -121,6 +123,14 @@ void do_key_event( int event_type, int keycode, int key_location )
                 clear_finger_slot();
                 INFO("multi-touch disabled\n");
             }
+        } else if (keycode == (JAVA_KEYCODE_BIT_SHIFT | JAVA_KEYCODE_BIT_CTRL)) {
+            if (KEY_PRESSED == event_type) {
+                get_emul_multi_touch_state()->multitouch_enable = 2;
+                INFO("multi-touch enabled = B\n");
+            } else if (KEY_RELEASED == event_type) {
+                get_emul_multi_touch_state()->multitouch_enable = 1;
+                INFO("multi-touch enabled = A\n");
+            }
         }
     }