fix a bug where touch axis value was misused when touch was not pressed 56/307256/1
authorduna.oh <duna.oh@samsung.com>
Wed, 6 Mar 2024 09:47:29 +0000 (18:47 +0900)
committerduna.oh <duna.oh@samsung.com>
Wed, 6 Mar 2024 10:00:35 +0000 (19:00 +0900)
Change-Id: Ib52031c87d161ea5c981060d56f5fd8cea1f79d5

src/e_mod_gesture_events.c

index 07bdd56..4656be8 100644 (file)
@@ -138,7 +138,7 @@ _e_gesture_event_drop(void)
 static void
 _e_gesture_util_center_axis_get(int num_finger, int *x, int *y)
 {
-   int i;
+   int i, cnt = 0;
    int calc_x = 0, calc_y = 0;
 
    if (num_finger <= 0)
@@ -150,12 +150,14 @@ _e_gesture_util_center_axis_get(int num_finger, int *x, int *y)
 
    for (i = 1; i <= num_finger; i++)
      {
+        if (!gesture->gesture_events.base_point[i].pressed) continue;
         calc_x += gesture->gesture_events.base_point[i].axis.x;
         calc_y += gesture->gesture_events.base_point[i].axis.y;
+        cnt++;
      }
 
-   calc_x = (int)(calc_x / num_finger);
-   calc_y = (int)(calc_y / num_finger);
+   calc_x = (int)(calc_x / cnt);
+   calc_y = (int)(calc_y / cnt);
 
    *x = calc_x;
    *y = calc_y;
@@ -181,6 +183,7 @@ _e_gesture_util_distances_get(int num_finger)
 
    for (i = 1; i <= num_finger; i++)
      {
+        if (!gesture->gesture_events.base_point[i].pressed) continue;
         distance +=  _e_gesture_util_distance_get(cx, cy,
                        gesture->gesture_events.base_point[i].axis.x,
                        gesture->gesture_events.base_point[i].axis.y);
@@ -206,24 +209,38 @@ _e_gesture_util_angle_get(int x1, int y1, int x2, int y2)
 }
 
 static void
-_e_gesture_util_rect_get(int finger, int *x1, int *y1, int *x2, int *y2)
+_e_gesture_util_rect_get(int num_finger, int *x1, int *y1, int *x2, int *y2)
 {
-   int i;
-
-   *x1 = *x2 = gesture->gesture_events.base_point[1].axis.x;
-   *y1 = *y2 = gesture->gesture_events.base_point[1].axis.y;
+   int i, start_i = 0;
 
-   for (i = 2; i < finger + 1; i++)
+   if (num_finger <= 0)
      {
-        if (gesture->gesture_events.base_point[i].axis.x < *x1)
-          *x1 = gesture->gesture_events.base_point[i].axis.x;
-        else if (gesture->gesture_events.base_point[i].axis.x > *x2)
-          *x2 = gesture->gesture_events.base_point[i].axis.x;
+        *x1 = *x2 = 0;
+        *y1 = *y2 = 0;
+        return;
+     }
 
-        if (gesture->gesture_events.base_point[i].axis.y < *y1)
-          *y1 = gesture->gesture_events.base_point[i].axis.y;
-        else if (gesture->gesture_events.base_point[i].axis.y > *y2)
-          *y2 = gesture->gesture_events.base_point[i].axis.y;
+   for (i = 1; i <= num_finger ; i++)
+     {
+        if (!gesture->gesture_events.base_point[i].pressed) continue;
+        if (start_i == 0)
+          {
+             *x1 = *x2 = gesture->gesture_events.base_point[i].axis.x;
+             *y1 = *y2 = gesture->gesture_events.base_point[i].axis.y;
+             start_i = i;
+          }
+        else
+          {
+            if (gesture->gesture_events.base_point[i].axis.x < *x1)
+               *x1 = gesture->gesture_events.base_point[i].axis.x;
+            else if (gesture->gesture_events.base_point[i].axis.x > *x2)
+               *x2 = gesture->gesture_events.base_point[i].axis.x;
+
+            if (gesture->gesture_events.base_point[i].axis.y < *y1)
+               *y1 = gesture->gesture_events.base_point[i].axis.y;
+            else if (gesture->gesture_events.base_point[i].axis.y > *y2)
+               *y2 = gesture->gesture_events.base_point[i].axis.y;
+          }
      }
 }
 
@@ -870,13 +887,13 @@ _e_gesture_process_edge_drag_up(Ecore_Event_Mouse_Button *ev)
 }
 
 static Eina_Bool
-_e_gesture_process_distance_check(int id, int x, int y)
+_e_gesture_process_distance_check(int id, int x, int y, int num_fingers)
 {
    double distance;
    int cx = 0, cy = 0;
    E_Gesture_Conf_Edd *conf = gesture->config->conf;
 
-   _e_gesture_util_center_axis_get(gesture->gesture_events.num_pressed, &cx, &cy);
+   _e_gesture_util_center_axis_get(num_fingers, &cx, &cy);
    distance = _e_gesture_util_distance_get(x, y, cx, cy);
 
    // for Debugging
@@ -951,16 +968,13 @@ _e_gesture_timer_pan_start(void *data)
    E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
    int num_pressed = gesture->gesture_events.num_pressed;
    int i;
+   Coords start_point = {0, };
 
    if (pans->fingers[num_pressed].client)
      {
-        for (i = 1; i <= num_pressed; i++)
-          {
-             pans->start_point.x += gesture->gesture_events.base_point[i].axis.x;
-             pans->start_point.y += gesture->gesture_events.base_point[i].axis.y;
-          }
-        pans->center_point.x = pans->start_point.x = (int)(pans->start_point.x / num_pressed);
-        pans->center_point.y = pans->start_point.y = (int)(pans->start_point.y / num_pressed);
+        _e_gesture_util_center_axis_get(num_pressed, &start_point.x, &start_point.y);
+        pans->start_point.x = pans->center_point.x = start_point.x;
+        pans->start_point.y = pans->center_point.y = start_point.y;
         pans->state = E_GESTURE_PANPINCH_STATE_START;
      }
    else
@@ -997,10 +1011,10 @@ _e_gesture_process_pan_down(Ecore_Event_Mouse_Button *ev)
         return;
      }
 
-   if (gesture->gesture_events.num_pressed > 0)
+   if (gesture->gesture_events.num_pressed > 1)
      {
         if (!_e_gesture_process_distance_check(ev->multi.device,
-                                               ev->x, ev->y))
+                                               ev->x, ev->y, gesture->gesture_events.num_pressed))
           _e_gesture_pan_cancel();
      }
 
@@ -1024,10 +1038,10 @@ _e_gesture_process_pan_move(Ecore_Event_Mouse_Move *ev)
         return;
      }
 
-   if (gesture->gesture_events.num_pressed > 0)
+   if (gesture->gesture_events.num_pressed > 1)
      {
         if (!_e_gesture_process_distance_check(ev->multi.device,
-                                               ev->x, ev->y))
+                                               ev->x, ev->y, gesture->gesture_events.num_pressed))
           _e_gesture_pan_cancel();
      }
 
@@ -1288,6 +1302,7 @@ _e_gesture_tap_cancel(void)
    taps->repeats = 0;
    taps->enabled_finger = 0;
    taps->current_finger = 0;
+   GTINF("Tap state changed. %d -> %d", taps->state, E_GESTURE_TAP_STATE_READY);
    taps->state = E_GESTURE_TAP_STATE_READY;
    taps->base_rect.x1 = 0;
    taps->base_rect.y1 = 0;
@@ -1332,12 +1347,18 @@ _e_gesture_timer_tap_start(void *data)
 {
    E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
 
-   if (taps->fingers[taps->enabled_finger].enabled)
+   GTWRN("Tap start timer expired. Currently alived fingers: 0x%x (curr:%d)\n",
+         taps->enabled_finger, taps->current_finger);
+
+   if ((taps->enabled_finger == taps->current_finger) &&
+       (taps->fingers[taps->enabled_finger].enabled))
      {
+        GTINF("Tap state changed. %d -> %d", taps->state, E_GESTURE_TAP_STATE_PROCESS);
         taps->state = E_GESTURE_TAP_STATE_PROCESS;
      }
    else
      {
+        GTWRN("Tap start timer expired. tap cancelled");
         _e_gesture_tap_cancel();
      }
 
@@ -1352,6 +1373,7 @@ _e_gesture_timer_tap_done(void *data)
 
    if (gesture->gesture_events.num_pressed)
      {
+        GTWRN("Tap done timer expired. tap cancelled");
         _e_gesture_tap_cancel();
      }
 
@@ -1380,6 +1402,7 @@ _e_gesture_timer_tap_interval(void *data)
      {
         /* All fingers are released. */
         gesture->gesture_filter = E_GESTURE_TYPE_ALL;
+        GTWRN("Tap interval timer is expired. tap cancelled");
         _e_gesture_tap_cancel();
 
         gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
@@ -1396,6 +1419,7 @@ _e_gesture_tap_start(void)
    E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
    E_Gesture_Conf_Edd *conf = gesture->config->conf;
 
+   GTINF("Tap state changed. %d -> %d", taps->state, E_GESTURE_TAP_STATE_START);
    taps->state = E_GESTURE_TAP_STATE_START;
    if (!taps->start_timer)
      {
@@ -1414,14 +1438,21 @@ _e_gesture_tap_done(void)
    E_Gesture_Conf_Edd *conf = gesture->config->conf;
 
    if (taps->repeats >= conf->tap.repeats_max)
-     _e_gesture_tap_cancel();
+     {
+        GTWRN("Tap done. taps->repeats(%d) is too big (max:%d). tap cancelled", taps->repeats, conf->tap.repeats_max);
+        _e_gesture_tap_cancel();
+     }
 
    if (!taps->fingers[taps->enabled_finger].enabled)
-      _e_gesture_tap_cancel();
+     {
+        GTWRN("Tap done. enabled_finger(%d) is not enabled. tap cancelled", taps->enabled_finger);
+        _e_gesture_tap_cancel();
+     }
 
    if (!(gesture->gesture_filter & E_GESTURE_TYPE_TAP) &&
        gesture->gesture_events.num_pressed == 0)
      {
+        GTINF("Tap state changed. %d -> %d", taps->state, E_GESTURE_TAP_STATE_WAIT);
         taps->state = E_GESTURE_TAP_STATE_WAIT;
         taps->repeats++;
         if (taps->done_timer)
@@ -1450,12 +1481,17 @@ _e_gesture_tap_condition_check(E_Gesture_Event_Tap *taps)
 {
    if (!taps->activation.active)
      {
+        GTWRN("Tap is not active. tap cancelled");
         _e_gesture_tap_cancel();
         return EINA_FALSE;
      }
 
    if (gesture->gesture_events.recognized_gesture)
-     _e_gesture_tap_cancel();
+     {
+        GTWRN("Tap recognized_gesture has a value(%d). tap cancelled",
+              gesture->gesture_events.recognized_gesture);
+        _e_gesture_tap_cancel();
+     }
 
    return EINA_TRUE;
 }
@@ -1470,10 +1506,10 @@ _e_gesture_process_tap_down(Ecore_Event_Mouse_Button *ev)
         return;
      }
 
-   if (gesture->gesture_events.num_pressed > 0)
+   if (gesture->gesture_events.num_pressed > 1)
      {
         if (!_e_gesture_process_distance_check(ev->multi.device,
-                                               ev->x, ev->y))
+                                               ev->x, ev->y, gesture->gesture_events.num_pressed))
           _e_gesture_tap_cancel();
      }
 
@@ -1483,7 +1519,10 @@ _e_gesture_process_tap_down(Ecore_Event_Mouse_Button *ev)
    taps->current_finger++;
 
    if (taps->enabled_finger > taps->max_fingers)
-     _e_gesture_tap_cancel();
+     {
+        GTWRN("Tap Down. enabled_finger(%d) is too big (max:%d). tap cancelled", taps->enabled_finger, taps->max_fingers);
+        _e_gesture_tap_cancel();
+     }
 
    if (taps->state == E_GESTURE_TAP_STATE_READY ||
        taps->state == E_GESTURE_TAP_STATE_START ||
@@ -1538,10 +1577,10 @@ _e_gesture_process_tap_move(Ecore_Event_Mouse_Move *ev)
         return;
      }
 
-   if (gesture->gesture_events.num_pressed > 0)
+   if (gesture->gesture_events.num_pressed > 1)
      {
         if (!_e_gesture_process_distance_check(ev->multi.device,
-                                               ev->x, ev->y))
+                                               ev->x, ev->y, taps->current_finger))
           _e_gesture_tap_cancel();
      }
 
@@ -1573,7 +1612,10 @@ _e_gesture_process_tap_up(Ecore_Event_Mouse_Button *ev)
      }
 
    if (taps->enabled_finger != taps->current_finger)
-     _e_gesture_tap_cancel();
+     {
+        GTWRN("Tap Up. enabled_finger(%d) is not equal (max:%d). tap cancelled", taps->enabled_finger, taps->max_fingers);
+        _e_gesture_tap_cancel();
+     }
 
    switch (taps->state)
      {
@@ -1585,6 +1627,7 @@ _e_gesture_process_tap_up(Ecore_Event_Mouse_Button *ev)
            break;
 
         case E_GESTURE_TAP_STATE_START:
+           GTINF("Tap state changed. %d -> %d", taps->state, E_GESTURE_TAP_STATE_PROCESS);
            taps->state = E_GESTURE_TAP_STATE_PROCESS;
            if (taps->start_timer)
              {