From 1e5cb93086bb8a3e29a0d5356f9772aca31cffeb Mon Sep 17 00:00:00 2001 From: "giwoong.kim" Date: Mon, 25 Jun 2012 21:11:25 +0900 Subject: [PATCH] [Title] corrected multi-touch point position of non-portrait mode [Type] bugfix [Module] Emulator / touch [Priority] major [Jira#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] Ctrl + click --- tizen/src/maru_finger.c | 21 ++++++++++++------- tizen/src/maru_finger.h | 4 +++- tizen/src/maru_sdl.c | 4 ++-- .../org/tizen/emulator/skin/EmulatorSkin.java | 11 +++++----- .../skin/comm/sock/data/MouseEventData.java | 18 ++++++++++++---- tizen/src/skin/maruskin_operation.c | 6 +++--- tizen/src/skin/maruskin_operation.h | 2 +- tizen/src/skin/maruskin_server.c | 10 ++++++++- 8 files changed, 52 insertions(+), 24 deletions(-) mode change 100755 => 100644 tizen/src/skin/maruskin_operation.c diff --git a/tizen/src/maru_finger.c b/tizen/src/maru_finger.c index f90702f44e..9f03ba34f2 100644 --- a/tizen/src/maru_finger.c +++ b/tizen/src/maru_finger.c @@ -140,7 +140,7 @@ static void sdl_fill_circle(SDL_Surface *surface, int cx, int cy, int radius, Ui Uint8 *target_pixel_a = (Uint8 *)surface->pixels + ((int)(cy + r - dy)) * surface->pitch + x * bpp; Uint8 *target_pixel_b = (Uint8 *)surface->pixels + ((int)(cy - r + dy)) * surface->pitch + x * bpp; - for (; x <= cx + dx; x++) + for ( ; x <= cx + dx; x++) { *(Uint32 *)target_pixel_a = pixel; *(Uint32 *)target_pixel_b = pixel; @@ -178,7 +178,7 @@ void init_multi_touch_state(void) for (i = 0; i < mts->finger_cnt_max; i++) { finger = get_finger_point_from_slot(i); //finger->id = 0; - finger->x = finger->y = -1; + finger->origin_x = finger->origin_y = finger->x = finger->y = -1; } mts->finger_point_size = DEFAULT_FINGER_POINT_SIZE; //temp @@ -221,7 +221,7 @@ int get_multi_touch_enable(void) return get_emul_multi_touch_state()->multitouch_enable; } -static int _add_finger_point(int x, int y) +static int _add_finger_point(int origin_x, int origin_y, int x, int y) { MultiTouchState *mts = get_emul_multi_touch_state(); @@ -233,6 +233,8 @@ static int _add_finger_point(int x, int y) mts->finger_cnt += 1; mts->finger_slot[mts->finger_cnt - 1].id = mts->finger_cnt; + mts->finger_slot[mts->finger_cnt - 1].origin_x = origin_x; + mts->finger_slot[mts->finger_cnt - 1].origin_y = origin_y; mts->finger_slot[mts->finger_cnt - 1].x = x; mts->finger_slot[mts->finger_cnt - 1].y = y; INFO("%d finger touching\n", mts->finger_cnt); @@ -260,6 +262,7 @@ FingerPoint *get_finger_point_search(int x, int y) for (i = mts->finger_cnt - 1; i >= 0; i--) { finger = get_finger_point_from_slot(i); + if (finger != NULL) { if (x >= (finger->x - finger_point_size_half) && x < (finger->x + finger_point_size_half) && @@ -276,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 x, int y, int touch_type) +void maru_finger_processing(int touch_type, int origin_x, int origin_y, int x, int y) { MultiTouchState *mts = get_emul_multi_touch_state(); FingerPoint *finger = NULL; @@ -285,6 +288,8 @@ void maru_finger_processing(int x, int y, int touch_type) if (_grab_finger_id > 0) { finger = get_finger_point_from_slot(_grab_finger_id - 1); if (finger != NULL) { + finger->origin_x = origin_x; + finger->origin_y = origin_y; finger->x = x; finger->y = y; if (finger->id != 0) { @@ -297,7 +302,7 @@ void maru_finger_processing(int x, int y, int touch_type) if (mts->finger_cnt == 0) { //first finger touch input - if (_add_finger_point(x, y) == -1) { + if (_add_finger_point(origin_x, origin_y, x, y) == -1) { return; } kbd_mouse_event(x, y, 0, QEMU_MOUSE_PRESSED); @@ -316,6 +321,8 @@ void maru_finger_processing(int x, int y, int touch_type) kbd_mouse_event(finger->x, finger->y, mts->finger_cnt_max - 1, 0); #endif + finger->origin_x = origin_x; + finger->origin_y = origin_y; finger->x = x; finger->y = y; if (finger->id != 0) { @@ -325,7 +332,7 @@ void maru_finger_processing(int x, int y, int touch_type) } else //one more finger { - _add_finger_point(x, y) ; + _add_finger_point(origin_x, origin_y, x, y) ; kbd_mouse_event(x, y, mts->finger_cnt - 1, QEMU_MOUSE_PRESSED); } @@ -348,7 +355,7 @@ void clear_finger_slot(void) } finger->id = 0; - finger->x = finger->y = -1; + finger->origin_x = finger->origin_y = finger->x = finger->y = -1; } _grab_finger_id = 0; diff --git a/tizen/src/maru_finger.h b/tizen/src/maru_finger.h index a37edb5c11..a8a40c091d 100644 --- a/tizen/src/maru_finger.h +++ b/tizen/src/maru_finger.h @@ -41,6 +41,8 @@ typedef struct FingerPoint { int id; + int origin_x; + int origin_y; int x; int y; } FingerPoint; @@ -63,7 +65,7 @@ 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 x, int y, int touch_type); +void maru_finger_processing(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 55574e58cb..0102a45fb2 100644 --- a/tizen/src/maru_sdl.c +++ b/tizen/src/maru_sdl.c @@ -91,8 +91,8 @@ static void qemu_update(void) for (i = 0; i < mts->finger_cnt; i++) { finger = get_finger_point_from_slot(i); if (finger != NULL && finger->id != 0) { - rect.x = (finger->x * get_emul_win_scale()) - finger_point_size_half; - rect.y = (finger->y * get_emul_win_scale()) - finger_point_size_half; + rect.x = finger->origin_x - finger_point_size_half; + rect.y = finger->origin_y - finger_point_size_half; rect.w = rect.h = mts->finger_point_size; SDL_BlitSurface((SDL_Surface *)mts->finger_point_surface, NULL, surface_screen, &rect); diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java index 153066a1fc..19335fedfc 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -736,7 +736,8 @@ public class EmulatorSkin { int[] geometry = SkinUtil.convertMouseGeometry( e.x, e.y, currentLcdWidth, currentLcdHeight, currentScale, currentAngle ); - MouseEventData mouseEventData = new MouseEventData( eventType, geometry[0], geometry[1], 0 ); + MouseEventData mouseEventData = new MouseEventData( eventType, + e.x, e.y, geometry[0], geometry[1], 0 ); communicator.sendToQEMU( SendCommand.SEND_MOUSE_EVENT, mouseEventData ); } } @@ -754,8 +755,8 @@ public class EmulatorSkin { currentScale, currentAngle ); logger.info( "mouseUp in LCD" + " x:" + geometry[0] + " y:" + geometry[1] ); - MouseEventData mouseEventData = new MouseEventData( MouseEventType.UP.value(), geometry[0], - geometry[1], 0 ); + MouseEventData mouseEventData = new MouseEventData( MouseEventType.UP.value(), + e.x, e.y, geometry[0], geometry[1], 0 ); communicator.sendToQEMU( SendCommand.SEND_MOUSE_EVENT, mouseEventData ); if ( true == EmulatorSkin.this.isDragStartedInLCD ) { EmulatorSkin.this.isDragStartedInLCD = false; @@ -771,8 +772,8 @@ public class EmulatorSkin { currentScale, currentAngle ); logger.info( "mouseDown in LCD" + " x:" + geometry[0] + " y:" + geometry[1] ); - MouseEventData mouseEventData = new MouseEventData( MouseEventType.DOWN.value(), geometry[0], - geometry[1], 0 ); + MouseEventData mouseEventData = new MouseEventData( MouseEventType.DOWN.value(), + e.x, e.y, geometry[0], geometry[1], 0 ); communicator.sendToQEMU( SendCommand.SEND_MOUSE_EVENT, mouseEventData ); if ( false == EmulatorSkin.this.isDragStartedInLCD ) { EmulatorSkin.this.isDragStartedInLCD = true; diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/data/MouseEventData.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/data/MouseEventData.java index 1733b4d9f1..b247b49578 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/data/MouseEventData.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/data/MouseEventData.java @@ -38,12 +38,16 @@ import java.io.IOException; public class MouseEventData extends AbstractSendData { int eventType; + int originX; + int originY; int x; int y; int z; - public MouseEventData(int eventType, int x, int y, int z) { + public MouseEventData(int eventType, int originX, int originY, int x, int y, int z) { this.eventType = eventType; + this.originX = originX; + this.originY = originY; this.x = x; this.y = y; this.z = z; @@ -52,6 +56,8 @@ public class MouseEventData extends AbstractSendData { @Override protected void write() throws IOException { writeInt(eventType); + writeInt(originX); + writeInt(originY); writeInt(x); writeInt(y); writeInt(z); @@ -62,11 +68,15 @@ public class MouseEventData extends AbstractSendData { StringBuilder builder = new StringBuilder(); builder.append("MouseEventData [eventType="); builder.append(eventType); - builder.append(", x="); + builder.append(", originX="); + builder.append(originX); + builder.append(", originY="); + builder.append(originY); + builder.append(", transposeX="); builder.append(x); - builder.append(", y="); + builder.append(", transposeY="); builder.append(y); - builder.append(", z="); + builder.append(", id="); builder.append(z); builder.append("]"); return builder.toString(); diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c old mode 100755 new mode 100644 index 3d60e28857..d8f289b2c5 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -70,17 +70,17 @@ void start_display(uint64 handle_id, int lcd_size_width, int lcd_size_height, do maruskin_sdl_init(handle_id, lcd_size_width, lcd_size_height); } -void do_mouse_event( int event_type, int x, int y, int z ) +void do_mouse_event( int event_type, int origin_x, int origin_y, int x, int y, int z ) { if( brightness_off ) { TRACE( "reject mouse touch in lcd off : %d, x:%d, y:%d, z:%d\n", event_type, x, y, z ); return; } - TRACE( "mouse_event event_type:%d, x:%d, y:%d, z:%d\n", event_type, x, y, z ); + 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(x, y, event_type); + maru_finger_processing(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); diff --git a/tizen/src/skin/maruskin_operation.h b/tizen/src/skin/maruskin_operation.h index 43427e28e9..7409d7a69f 100644 --- a/tizen/src/skin/maruskin_operation.h +++ b/tizen/src/skin/maruskin_operation.h @@ -49,7 +49,7 @@ typedef struct DetailInfo DetailInfo; void start_display(uint64 handle_id, int lcd_size_width, int lcd_size_height, double scale_factor, short rotation_type); -void do_mouse_event( int event_type, int x, int y, int z ); +void do_mouse_event( int event_type, int origin_x, int origin_y, int x, int y, int z ); void do_key_event( int event_type, int keycode, int key_location ); diff --git a/tizen/src/skin/maruskin_server.c b/tizen/src/skin/maruskin_server.c index fb15c466ab..cb94e976c3 100644 --- a/tizen/src/skin/maruskin_server.c +++ b/tizen/src/skin/maruskin_server.c @@ -588,6 +588,8 @@ static void* run_skin_server( void* args ) { /* keep it consistent with emulator-skin definition */ int event_type = 0; + int origin_x = 0; + int origin_y = 0; int x = 0; int y = 0; int z = 0; @@ -595,6 +597,10 @@ static void* run_skin_server( void* args ) { char* p = recvbuf; memcpy( &event_type, p, sizeof( event_type ) ); p += sizeof( event_type ); + memcpy( &origin_x, p, sizeof( origin_x ) ); + p += sizeof( origin_x ); + memcpy( &origin_y, p, sizeof( origin_y ) ); + p += sizeof( origin_y ); memcpy( &x, p, sizeof( x ) ); p += sizeof( x ); memcpy( &y, p, sizeof( y ) ); @@ -602,11 +608,13 @@ static void* run_skin_server( void* args ) { memcpy( &z, p, sizeof( z ) ); event_type = ntohl( event_type ); + origin_x = ntohl( origin_x ); + origin_y = ntohl( origin_y ); x = ntohl( x ); y = ntohl( y ); z = ntohl( z ); - do_mouse_event( event_type, x, y, z ); + do_mouse_event( event_type, origin_x, origin_y, x, y, z ); break; } case RECV_KEY_EVENT: { -- 2.34.1