From: GiWoong Kim Date: Fri, 20 Dec 2013 08:03:25 +0000 (+0900) Subject: touch: multi-touch enhancement X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~550 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7283729fb94d3e0fdd5e2efa1d4b125a51158392;p=sdk%2Femulator%2Fqemu.git touch: multi-touch enhancement 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 --- diff --git a/tizen/src/maru_finger.c b/tizen/src/maru_finger.c index c6b61c47a4..6c2ccf5eba 100644 --- a/tizen/src/maru_finger.c +++ b/tizen/src/maru_finger.c @@ -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; diff --git a/tizen/src/maru_finger.h b/tizen/src/maru_finger.h index 35015e4d18..51d7f53200 100644 --- a/tizen/src/maru_finger.h +++ b/tizen/src/maru_finger.h @@ -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); diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorFingers.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorFingers.java index 2042e3a0fe..b2b914dc54 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorFingers.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorFingers.java @@ -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(); } diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java index 65a9a7197c..47729e2d1b 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorShmSkin.java @@ -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( diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java index 51891eb9da..beffaf6d15 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/ICommunicator.java @@ -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), diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/SocketCommunicator.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/SocketCommunicator.java index 66394e2d01..6555aa8970 100755 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/SocketCommunicator.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/comm/sock/SocketCommunicator.java @@ -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; diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/menu/KeyWindowKeeper.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/menu/KeyWindowKeeper.java index 37cf4b9c6e..4a496dc6be 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/menu/KeyWindowKeeper.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/menu/KeyWindowKeeper.java @@ -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); } diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index 4f01c430a7..1cd3c1f45a 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -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"); } } diff --git a/tizen/src/skin/maruskin_server.c b/tizen/src/skin/maruskin_server.c index 25d982f7b9..35788d6928 100644 --- a/tizen/src/skin/maruskin_server.c +++ b/tizen/src/skin/maruskin_server.c @@ -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"); diff --git a/tizen/src/skin/maruskin_server.h b/tizen/src/skin/maruskin_server.h index e7e278f425..28da5f6a99 100644 --- a/tizen/src/skin/maruskin_server.h +++ b/tizen/src/skin/maruskin_server.h @@ -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);