Do not send duplicate mouse cancel event
authorHyunho Kang <hhstark.kang@samsung.com>
Fri, 25 Aug 2017 10:25:39 +0000 (19:25 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Tue, 17 Oct 2017 03:06:33 +0000 (12:06 +0900)
Change-Id: I2a9d98ea5e27276a7bc1dde57d80073c768acc93
Signed-off-by: Hyunho Kang <hhstark.kang@samsung.com>
screen_connector_watcher_evas/src/screen_connector_toolkit_evas.c

index b9ef88b..57a111f 100644 (file)
@@ -59,6 +59,7 @@ struct _screen_connector_toolkit_evas_h {
        screen_connector_toolkit_h toolkit_h;
        int freeze;
        bool is_init;
+       bool is_down;
        Evas_Object *img_tbm;
        Evas_Object *img_file;
        uint32_t img_type;
@@ -93,6 +94,23 @@ static void __rs_cb_hide(void *data, Evas *e, Evas_Object *obj, void *event_info
 static void __rs_cb_resize(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void __obj_update_visibility(void *data, Evas *e, Evas_Object *obj, void *event_info);
 
+static void __cancel_touch(screen_connector_toolkit_evas_h h)
+{
+       struct tizen_remote_surface *surface;
+
+       if (!h->is_down)
+               return;
+
+       h->is_down = false;
+       surface = screen_connector_toolkit_get_trs(h->toolkit_h);
+       if (!surface) {
+               LOGE("failed to get tizen remote surface");
+               return;
+       }
+
+       tizen_remote_surface_transfer_touch_cancel(surface);
+}
+
 static gint __comp_win_id(gconstpointer a, gconstpointer b)
 {
        viewer_visibility_h win = (viewer_visibility_h)a;
@@ -482,9 +500,9 @@ static int __set_visibility(screen_connector_toolkit_evas_h toolkit_evas_h, visi
        if (__delayed_resuming_time == 0 ||
                toolkit_evas_h->screen_type == SCREEN_CONNECTOR_SCREEN_TYPE_WATCH) {
                if (obscured == TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_INVISIBLE)
-                       tizen_remote_surface_transfer_touch_cancel(surface);
+                       __cancel_touch(toolkit_evas_h);
 
-               LOGI("normal resume");
+               LOGI("normal visibility %d", obscured);
                tizen_remote_surface_transfer_visibility(surface, obscured);
 
                return 0;
@@ -496,7 +514,7 @@ static int __set_visibility(screen_connector_toolkit_evas_h toolkit_evas_h, visi
                        toolkit_evas_h->resuming_timer = 0;
                }
 
-               tizen_remote_surface_transfer_touch_cancel(surface);
+               __cancel_touch(toolkit_evas_h);
                tizen_remote_surface_transfer_visibility(surface, obscured);
        } else {
                if (toolkit_evas_h->resuming_timer == 0) {
@@ -634,6 +652,7 @@ static void __rs_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *even
                return;
        }
 
+       toolkit_evas_h->is_down = true;
        tizen_remote_surface_transfer_mouse_event(surface,
                        TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN,
                        0,
@@ -680,6 +699,12 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_
                return;
        }
 
+       if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) {
+               LOGD("Event canceld");
+               __cancel_touch(toolkit_evas_h);
+               return;
+       }
+
        /*
         * We need to send move event for
         * consistency with old widget framework
@@ -699,6 +724,7 @@ static void __rs_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_
                        desc,
                        ev->timestamp);
 
+       toolkit_evas_h->is_down = false;
        tizen_remote_surface_transfer_mouse_event(surface,
                        TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP,
                        0,
@@ -1466,7 +1492,6 @@ EXPORT_API int screen_connector_toolkit_evas_send_mouse_up(Evas_Object *obj)
 EXPORT_API int screen_connector_toolkit_evas_send_touch_cancel(Evas_Object *obj)
 {
        screen_connector_toolkit_evas_h toolkit_evas_h;
-       struct tizen_remote_surface *surface;
 
        toolkit_evas_h = __find_toolkit_evas_h(obj);
        if (!toolkit_evas_h) {
@@ -1475,15 +1500,9 @@ EXPORT_API int screen_connector_toolkit_evas_send_touch_cancel(Evas_Object *obj)
        }
 
        if (toolkit_evas_h->img_tbm) {
-               surface = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h);
-               if (surface == NULL) {
-                       LOGE("surface is NULL");
-                       return -1;
-               }
-
-               tizen_remote_surface_transfer_touch_cancel(surface);
+               __cancel_touch(toolkit_evas_h);
        } else {
-               LOGE("surface not yet initialized.");
+               LOGE("Null tbm image.");
                return -1;
        }
 
@@ -1627,19 +1646,18 @@ EXPORT_API int screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_
        }
        h->bind_win_id = bind_win_id;
 
-       trs = screen_connector_toolkit_get_trs(h->toolkit_h);
-       if (trs) {
-               tizen_remote_surface_transfer_touch_cancel(trs);
-       } else {
-               LOGE("failed to get tizen remote surface");
-               return -1;
-       }
-
+       __cancel_touch(h);
        if (h->cur_buffer) {
+               trs = screen_connector_toolkit_get_trs(h->toolkit_h);
+               if (trs == NULL) {
+                       LOGE("failed to get tizen remote surface");
+                       return -1;
+               }
+
                if (tizen_remote_surface_get_version(trs)
                                >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) {
-                       c_buf_info = g_hash_table_lookup(
-                                       __cur_buffer_table, h->cur_buffer);
+                       c_buf_info = g_hash_table_lookup(__cur_buffer_table,
+                                       h->cur_buffer);
                        if (c_buf_info != NULL)
                                __cur_buffer_info_unref(trs, c_buf_info);
                }
@@ -1694,20 +1712,18 @@ EXPORT_API int screen_connector_toolkit_evas_set_changed_event_filter(
                return ret;
        }
 
-       trs = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h);
-       if (trs) {
-               tizen_remote_surface_transfer_touch_cancel(trs);
-       } else {
-               LOGE("failed to get tizen remote surface");
-               return -1;
-       }
-
+       __cancel_touch(toolkit_evas_h);
        toolkit_evas_h->blocked = true;
        if (toolkit_evas_h->cur_buffer) {
+               trs = screen_connector_toolkit_get_trs(toolkit_evas_h->toolkit_h);
+               if (trs == NULL) {
+                       LOGE("failed to get tizen remote surface");
+                       return -1;
+               }
+
                if (tizen_remote_surface_get_version(trs)
                                >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) {
-                       c_buf_info = g_hash_table_lookup(
-                                       __cur_buffer_table,
+                       c_buf_info = g_hash_table_lookup(__cur_buffer_table,
                                        toolkit_evas_h->cur_buffer);
                        if (c_buf_info != NULL)
                                __cur_buffer_info_unref(trs, c_buf_info);