From: giwoong.kim Date: Tue, 3 Jul 2012 08:26:07 +0000 (+0900) Subject: [Title] support 3point multitouch X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~1559 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6cbd81a5e8b956ccc246239bf8f1ff1576bcd07d;p=sdk%2Femulator%2Fqemu.git [Title] support 3point multitouch [Type] feature [Module] Emulator / touch [Priority] major [Jira#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] Ctrl + Shift + click --- diff --git a/tizen/src/maru_finger.c b/tizen/src/maru_finger.c index 9f03ba34f2..cc37f59706 100644 --- a/tizen/src/maru_finger.c +++ b/tizen/src/maru_finger.c @@ -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) diff --git a/tizen/src/maru_finger.h b/tizen/src/maru_finger.h index 8a98475930..53cc43a59e 100644 --- a/tizen/src/maru_finger.h +++ b/tizen/src/maru_finger.h @@ -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); diff --git a/tizen/src/maru_sdl.c b/tizen/src/maru_sdl.c index 0102a45fb2..731e31890e 100644 --- a/tizen/src/maru_sdl.c +++ b/tizen/src/maru_sdl.c @@ -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; diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index d8f289b2c5..e38511b19b 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -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"); + } } }