e_service_gesture: add 'use_cleanup_timer' config in gesture_service 92/294792/1
authorduna.oh <duna.oh@samsung.com>
Thu, 15 Jun 2023 00:08:58 +0000 (09:08 +0900)
committerduna.oh <duna.oh@samsung.com>
Tue, 27 Jun 2023 00:22:57 +0000 (09:22 +0900)
configuration added
- use_cleanup_timer: use timer to cleanup gestures
- cleanup_time: wait for gesture ends after started (60 sec by default)

Change-Id: I9629f5b5ba3c05542bbff8a17268ed867611ffe0

src/bin/e_config.c
src/bin/e_config.h
src/bin/services/e_service_gesture.c

index 74e849a9ca512b4a8256e3cc0617c04e91cd694e..fde678bdca3c19f6a081fdc88645ef1692e2db16 100644 (file)
@@ -304,6 +304,8 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, qp_handler.alpha, INT);
    E_CONFIG_VAL(D, T, gesture_service.wait_time, DOUBLE);
    E_CONFIG_VAL(D, T, gesture_service.wait_dist, INT);
+   E_CONFIG_VAL(D, T, gesture_service.use_cleanup_timer, INT);
+   E_CONFIG_VAL(D, T, gesture_service.cleanup_time, INT);
    E_CONFIG_VAL(D, T, configured_output_resolution.use, UCHAR);
    E_CONFIG_VAL(D, T, configured_output_resolution.w, INT);
    E_CONFIG_VAL(D, T, configured_output_resolution.h, INT);
@@ -571,6 +573,7 @@ e_config_load(void)
    E_CONFIG_LIMIT(e_config->qp_use_bg_rect, 0, 1);
    E_CONFIG_LIMIT(e_config->qp_handler.use_alpha, 0, 1);
    E_CONFIG_LIMIT(e_config->qp_handler.alpha, 0, 255);
+   E_CONFIG_LIMIT(e_config->gesture_service.use_cleanup_timer, 0, 1);
    E_CONFIG_LIMIT(e_config->configured_output_resolution.use, 0, 1);
    E_CONFIG_LIMIT(e_config->global_object_not_provide.launch_effect, 0, 1);
    E_CONFIG_LIMIT(e_config->use_thread_max_cpu, 0, 1);
index 87aa4e3694e2b7a19f94dc0b31053175aa5dcb83..1ba56c9f9bfba01518daf3bc0a9878ab0daa567f 100644 (file)
@@ -238,10 +238,14 @@ struct _E_Config
    // But each devices has different touch sensitivity, so make these values configurable.
    // wait_time: waiting times set fingers are come
    // wait_dist: if current touched fingers are moving sufficiently, stop waiting other fingers
+   // use_cleanup_timer: use timer to cleanup gestures
+   // cleanup_time: wait for gesture ends after started
    struct
    {
       double wait_time; // default value is 0.1(sec)
       int wait_dist;
+      int use_cleanup_timer;
+      int cleanup_time;
    } gesture_service;
 
    // Configured output resolution
index e669bbf95254e0567f4f26f7b36fa57d359ba66b..d94353456ebe9538e7a9275baab0f638513293de 100644 (file)
@@ -47,6 +47,9 @@ struct _E_Policy_Gesture
         E_Policy_Gesture_End_Cb end;
         void *data;
      } cb;
+
+   int cleanup_time;
+   Ecore_Timer *cleanup_timer;
 };
 
 static void
@@ -254,6 +257,38 @@ _gesture_waiting_timer(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
+static Eina_Bool
+_gesture_cleanup_timer(void *data)
+{
+   int cx = 0, cy = 0;
+   E_Policy_Gesture *gesture = data;
+   unsigned int timestamp;
+
+   E_FREE_FUNC(gesture->cleanup_timer, ecore_timer_del);
+
+   WRN("cleanup_timer TIMEOUT: set_fingers: 0x%x, pressed: %d(0x%x)",
+       gesture->set_fingers, gesture->pressed_fingers, (1 << gesture->pressed_fingers));
+
+   timestamp = (int)(ecore_time_get() * 1000);
+   _gesture_util_center_cur_point_get(gesture, &cx, &cy);
+   _gesture_check(gesture, gesture->obj, cx, cy, timestamp);
+   WRN("cleanup_timer gesture->status: %d cx: %d, cy: %d", gesture->status, cx, cy);
+   if (gesture->status == POL_GESTURE_STATUS_ACTIVE)
+     {
+        if (gesture->cb.end)
+          {
+             gesture->cb.end(gesture->cb.data, gesture->obj, gesture->gesture_fingers, cx, cy, timestamp);
+          }
+     }
+
+   for (int i = 0; i < gesture->pressed_fingers; i++)
+     gesture->touch_info[i].pressed = EINA_FALSE;
+
+   _gesture_cleanup(gesture);
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
 static void
 _gesture_touch_up(E_Policy_Gesture *gesture, Evas_Object *obj, int idx, int x, int y, int timestamp)
 {
@@ -421,6 +456,11 @@ _gesture_obj_cb_mouse_up(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, v
 
    gesture->pressed_fingers--;
    _gesture_touch_up(gesture, obj, 0, ev->canvas.x, ev->canvas.y, ev->timestamp);
+
+   if (e_config->gesture_service.use_cleanup_timer)
+     {
+        E_FREE_FUNC(gesture->cleanup_timer, ecore_timer_del);
+     }
 }
 
 static void
@@ -442,7 +482,14 @@ _gesture_obj_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj,
    Evas_Event_Mouse_Down *ev = event;
 
    gesture->pressed_fingers++;
+
    _gesture_touch_down(data, obj, 0, ev->canvas.x, ev->canvas.y, ev->timestamp);
+
+   if (e_config->gesture_service.use_cleanup_timer)
+     {
+        E_FREE_FUNC(gesture->cleanup_timer, ecore_timer_del);
+        gesture->cleanup_timer = ecore_timer_add(gesture->cleanup_time, _gesture_cleanup_timer, (void *)gesture);
+     }
 }
 
 static void
@@ -524,7 +571,7 @@ e_service_gesture_add(Evas_Object *obj, E_Policy_Gesture_Type type, int nfingers
    gesture->type = type;
    gesture->set_fingers |= 1 << nfingers;
 
-   // attempt to get wait_time and wait_dist to config file.
+   // attempt to get wait_time, wait_dist and cleanup_time from config file.
    // but if failed, set default VALUE
    if (e_config)
      {
@@ -532,6 +579,8 @@ e_service_gesture_add(Evas_Object *obj, E_Policy_Gesture_Type type, int nfingers
           gesture->wait_time = e_config->gesture_service.wait_time;
         if (e_config->gesture_service.wait_dist)
           gesture->wait_dist = e_config->gesture_service.wait_dist;
+        if (e_config->gesture_service.use_cleanup_timer)
+          gesture->cleanup_time = e_config->gesture_service.cleanup_time ?: 60;
      }
    if (!gesture->wait_time)
      gesture->wait_time = 0.1;
@@ -583,6 +632,7 @@ e_service_gesture_del(E_Policy_Gesture *gesture)
    evas_object_data_del(gesture->obj, E_SERVICE_GESTURE_KEY);
 
    E_FREE_FUNC(gesture->waiting_timer, ecore_timer_del);
+   E_FREE_FUNC(gesture->cleanup_timer, ecore_timer_del);
 
    free(gesture);
 }