gesture: Add efl_util_gesture_grab_mode_set 97/321397/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 14 Mar 2025 09:20:32 +0000 (18:20 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 20 Mar 2025 08:27:53 +0000 (17:27 +0900)
Support new shared_grab protocol.

Change-Id: If7ef8eba2bc29192c232eb4bade0c8f85b8f7507
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
include/efl_util.h
src/efl_util.c
test/tc-efl-util.cpp

index 1a96634917668466dcfdef42de58c3ccdaee6c5c..2b96c0eabf4a5e0efa5edafdf0f2ad7bf5a952f4 100644 (file)
@@ -652,6 +652,18 @@ typedef enum _efl_util_gesture_edge_size_e
    EFL_UTIL_GESTURE_EDGE_SIZE_PARTIAL  /**< Part of edge */
 } efl_util_gesture_edge_size_e;
 
+/**
+ * @platform
+ * @brief Enumeration of gesture grab mode.
+ * @since_tizen 9.0
+ */
+typedef enum _efl_util_gesture_grab_mode_e
+{
+   EFL_UTIL_GESTURE_GRAB_MODE_NONE = 0,  /**< none mode */
+   EFL_UTIL_GESTURE_GRAB_MODE_EXCLUSIVE, /**< exclusive mode */
+   EFL_UTIL_GESTURE_GRAB_MODE_SHARED,    /**< shared grab mode */
+} efl_util_gesture_grab_mode_e;
+
 /**
  * @brief Definition for the gesture data handle.
  * @since_tizen 4.0
@@ -1059,6 +1071,20 @@ API int efl_util_gesture_tap_cb_set(efl_util_gesture_h gesture_h, efl_util_gestu
  * @retval #EFL_UTIL_ERROR_INVALID_PARAMETER Invalid parameter
  */
 API int efl_util_gesture_palm_cover_cb_set(efl_util_gesture_h gesture_h, efl_util_gesture_palm_cover_cb cb_func, void *data);
+
+/**
+ * @brief Sets gesture grab mode.
+ * @since_tizen 9.0
+ * @privlevel platform
+ * @privilege %http://tizen.org/privilege/gesturegrab
+ * @param[in] gesture_h The #efl_util_gesture_h handle
+ * @param[in] data      The data to be passed to the callback function
+ * @param[in] mode      The #efl_util_gesture_grab_mode_e mode
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #EFL_UTIL_ERROR_NONE Successful
+ * @retval #EFL_UTIL_ERROR_INVALID_PARAMETER Invalid parameter
+ */
+API int efl_util_gesture_grab_mode_set(efl_util_gesture_h gesture_h, efl_util_gesture_data data, efl_util_gesture_grab_mode_e mode);
 /**
  * @}
  */
index ef50b2a1f0c6496a42c55beba0dc7d7f13b11dc4..77ad0c79aa405f1f283e8a6005a3ccac8293a4a5 100644 (file)
@@ -84,6 +84,7 @@ typedef struct _Efl_Util_Wl_Output_Info
 typedef struct _Efl_Util_Gesture_Common_Grab_Data
 {
    int type;
+   efl_util_gesture_grab_mode_e mode;
 } Efl_Util_Gesture_Common_Grab_Data;
 
 typedef struct _Efl_Util_Gesture_Edge_Swipe_Grab_Data
@@ -2757,20 +2758,20 @@ _efl_util_gesture_convert_error(int ret)
 {
    switch (ret)
      {
-        case TIZEN_GESTURE_ERROR_NONE:
-           return EFL_UTIL_ERROR_NONE;
-        case TIZEN_GESTURE_ERROR_INVALID_DATA:
-           return EFL_UTIL_ERROR_INVALID_PARAMETER;
-        case TIZEN_GESTURE_ERROR_NO_PERMISSION:
-           return EFL_UTIL_ERROR_PERMISSION_DENIED;
-        case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
-           return EFL_UTIL_ERROR_OUT_OF_MEMORY;
-        case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
-           return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
-        case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
-           return EFL_UTIL_ERROR_NOT_SUPPORTED;
-        default :
-           return EFL_UTIL_ERROR_NONE;
+      case TIZEN_GESTURE_ERROR_NONE:
+        return EFL_UTIL_ERROR_NONE;
+      case TIZEN_GESTURE_ERROR_INVALID_DATA:
+        return EFL_UTIL_ERROR_INVALID_PARAMETER;
+      case TIZEN_GESTURE_ERROR_NO_PERMISSION:
+        return EFL_UTIL_ERROR_PERMISSION_DENIED;
+      case TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES:
+        return EFL_UTIL_ERROR_OUT_OF_MEMORY;
+      case TIZEN_GESTURE_ERROR_GRABBED_ALREADY:
+        return EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE;
+      case TIZEN_GESTURE_ERROR_NOT_SUPPORTED:
+        return EFL_UTIL_ERROR_NOT_SUPPORTED;
+      default :
+        return EFL_UTIL_ERROR_NONE;
      }
 }
 
@@ -2790,7 +2791,7 @@ _efl_util_gesture_verify_request_notified()
 }
 
 static int
-_efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
+_efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed, efl_util_gesture_grab_mode_e mode)
 {
    LOGD("");
    int ret = EFL_UTIL_ERROR_NONE;
@@ -2818,9 +2819,14 @@ _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
    end_point = edge_swipe_data->end_point;
 
    if (grabbed)
-      tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     {
+        if (mode == EFL_UTIL_GESTURE_GRAB_MODE_SHARED)
+          tizen_gesture_shared_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+        else
+          tizen_gesture_grab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     }
    else
-      tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     tizen_gesture_ungrab_edge_swipe(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
 
    ret = _efl_util_gesture_verify_request_notified();
 
@@ -2828,7 +2834,7 @@ _efl_util_gesture_grab_edge_swipe(efl_util_gesture_data data, Eina_Bool grabbed)
 }
 
 static int
-_efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
+_efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed, efl_util_gesture_grab_mode_e mode)
 {
    LOGD("");
    int ret = EFL_UTIL_ERROR_NONE;
@@ -2856,9 +2862,14 @@ _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
    end_point = edge_drag_data->end_point;
 
    if (grabbed)
-      tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     {
+        if (mode == EFL_UTIL_GESTURE_GRAB_MODE_SHARED)
+          tizen_gesture_shared_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+        else
+          tizen_gesture_grab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     }
    else
-      tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
+     tizen_gesture_ungrab_edge_drag(_eflutil_defaultqueue.wl.gesture.proto, fingers, edge, edge_size, start_point, end_point);
 
    ret = _efl_util_gesture_verify_request_notified();
 
@@ -2866,7 +2877,7 @@ _efl_util_gesture_grab_edge_drag(efl_util_gesture_data data, Eina_Bool grabbed)
 }
 
 static int
-_efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
+_efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed, efl_util_gesture_grab_mode_e mode)
 {
    LOGD("");
    int ret = EFL_UTIL_ERROR_NONE;
@@ -2888,9 +2899,14 @@ _efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
    repeats = tap_data->repeats;
 
    if (grabbed)
-      tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
+     {
+        if (mode == EFL_UTIL_GESTURE_GRAB_MODE_SHARED)
+          tizen_gesture_shared_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
+        else
+          tizen_gesture_grab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
+     }
    else
-      tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
+     tizen_gesture_ungrab_tap(_eflutil_defaultqueue.wl.gesture.proto, fingers, repeats);
 
    ret = _efl_util_gesture_verify_request_notified();
 
@@ -2898,7 +2914,7 @@ _efl_util_gesture_grab_tap(efl_util_gesture_data data, Eina_Bool grabbed)
 }
 
 static int
-_efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed)
+_efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed, efl_util_gesture_grab_mode_e mode)
 {
    LOGD("");
    int ret = EFL_UTIL_ERROR_NONE;
@@ -2912,9 +2928,14 @@ _efl_util_gesture_grab_palm_cover(efl_util_gesture_data data, Eina_Bool grabbed)
                                   EFL_UTIL_ERROR_INVALID_PARAMETER);
 
    if (grabbed)
-      tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
+     {
+        if (mode == EFL_UTIL_GESTURE_GRAB_MODE_SHARED)
+          tizen_gesture_shared_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
+        else
+          tizen_gesture_grab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
+     }
    else
-      tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
+     tizen_gesture_ungrab_palm_cover(_eflutil_defaultqueue.wl.gesture.proto);
 
    ret = _efl_util_gesture_verify_request_notified();
 
@@ -3264,20 +3285,20 @@ efl_util_gesture_grab(efl_util_gesture_h gesture_h, efl_util_gesture_data data)
 
    switch (base_data->type)
      {
-        case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
-           ret = _efl_util_gesture_grab_edge_swipe(data, EINA_TRUE);
-           break;
-        case TIZEN_GESTURE_TYPE_EDGE_DRAG:
-           ret = _efl_util_gesture_grab_edge_drag(data, EINA_TRUE);
-           break;
-        case TIZEN_GESTURE_TYPE_TAP:
-           ret = _efl_util_gesture_grab_tap(data, EINA_TRUE);
-           break;
-        case TIZEN_GESTURE_TYPE_PALM_COVER:
-           ret = _efl_util_gesture_grab_palm_cover(data, EINA_TRUE);
-           break;
-        default:
-           return EFL_UTIL_ERROR_INVALID_PARAMETER;
+      case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
+        ret = _efl_util_gesture_grab_edge_swipe(data, EINA_TRUE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_EDGE_DRAG:
+        ret = _efl_util_gesture_grab_edge_drag(data, EINA_TRUE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_TAP:
+        ret = _efl_util_gesture_grab_tap(data, EINA_TRUE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_PALM_COVER:
+        ret = _efl_util_gesture_grab_palm_cover(data, EINA_TRUE, base_data->mode);
+        break;
+      default:
+        ret = EFL_UTIL_ERROR_INVALID_PARAMETER;
      }
 
    return ret;
@@ -3298,20 +3319,20 @@ efl_util_gesture_ungrab(efl_util_gesture_h gesture_h, efl_util_gesture_data data
 
    switch (base_data->type)
      {
-        case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
-           ret = _efl_util_gesture_grab_edge_swipe(data, EINA_FALSE);
-           break;
-        case TIZEN_GESTURE_TYPE_EDGE_DRAG:
-           ret = _efl_util_gesture_grab_edge_drag(data, EINA_FALSE);
-           break;
-        case TIZEN_GESTURE_TYPE_TAP:
-           ret = _efl_util_gesture_grab_tap(data, EINA_FALSE);
-           break;
-        case TIZEN_GESTURE_TYPE_PALM_COVER:
-           ret = _efl_util_gesture_grab_palm_cover(data, EINA_FALSE);
-           break;
-        default:
-           return EFL_UTIL_ERROR_INVALID_PARAMETER;
+      case TIZEN_GESTURE_TYPE_EDGE_SWIPE:
+        ret = _efl_util_gesture_grab_edge_swipe(data, EINA_FALSE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_EDGE_DRAG:
+        ret = _efl_util_gesture_grab_edge_drag(data, EINA_FALSE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_TAP:
+        ret = _efl_util_gesture_grab_tap(data, EINA_FALSE, base_data->mode);
+        break;
+      case TIZEN_GESTURE_TYPE_PALM_COVER:
+        ret = _efl_util_gesture_grab_palm_cover(data, EINA_FALSE, base_data->mode);
+        break;
+      default:
+        ret = EFL_UTIL_ERROR_INVALID_PARAMETER;
      }
 
    return ret;
@@ -3485,3 +3506,23 @@ API int efl_util_gesture_palm_cover_cb_set(efl_util_gesture_h gesture_h, efl_uti
 
    return ret;
 }
+
+API int
+efl_util_gesture_grab_mode_set(efl_util_gesture_h gesture_h, efl_util_gesture_data data, efl_util_gesture_grab_mode_e mode)
+{
+   LOGD("");
+   Efl_Util_Gesture_Common_Grab_Data *base_data = NULL;
+
+   base_data = (Efl_Util_Gesture_Common_Grab_Data *)data;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(gesture_h, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(gesture_h->init, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(base_data, EFL_UTIL_ERROR_INVALID_PARAMETER);
+   if (mode > EFL_UTIL_GESTURE_GRAB_MODE_SHARED) return EFL_UTIL_ERROR_INVALID_PARAMETER;
+   if (mode <= EFL_UTIL_GESTURE_GRAB_MODE_NONE || mode > EFL_UTIL_GESTURE_GRAB_MODE_SHARED)
+     return EFL_UTIL_ERROR_INVALID_PARAMETER;
+
+   base_data->mode = mode;
+
+   return EFL_UTIL_ERROR_NONE;
+}
index 9c0487b3ca4c1be34025b42daa189e0f823bdfbd..e49983f0fd2f4df4fb15661729af8c420e343fad 100644 (file)
@@ -2266,3 +2266,61 @@ TEST_F(EFLUtil, gesture_palm_cover_cb_set)
    ret = efl_util_gesture_deinitialize(h_gesture);
    EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
 }
+
+TEST_F(EFLUtil, gesture_shared_grab_p)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+   efl_util_gesture_h h_gesture = NULL;
+   efl_util_gesture_data d_edge_swipe = NULL;
+
+   h_gesture = efl_util_gesture_initialize();
+   ret = get_last_result();
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+   EXPECT_NE(h_gesture, nullptr);
+
+   d_edge_swipe = efl_util_gesture_edge_swipe_new(h_gesture, 1, EFL_UTIL_GESTURE_EDGE_TOP);
+   ret = get_last_result();
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+   EXPECT_NE(d_edge_swipe, nullptr);
+
+   ret = efl_util_gesture_grab_mode_set(h_gesture, d_edge_swipe, EFL_UTIL_GESTURE_GRAB_MODE_SHARED);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+
+   ret = efl_util_gesture_grab(h_gesture, d_edge_swipe);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+
+   ret = efl_util_gesture_ungrab(h_gesture, d_edge_swipe);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+
+   ret = efl_util_gesture_edge_swipe_free(h_gesture, d_edge_swipe);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+
+   ret = efl_util_gesture_deinitialize(h_gesture);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+}
+
+TEST_F(EFLUtil, gesture_shared_grab_n)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+   efl_util_gesture_h h_gesture = NULL;
+   efl_util_gesture_data d_edge_swipe = NULL;
+
+   h_gesture = efl_util_gesture_initialize();
+   ret = get_last_result();
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+   EXPECT_NE(h_gesture, nullptr);
+
+   d_edge_swipe = efl_util_gesture_edge_swipe_new(h_gesture, 1, EFL_UTIL_GESTURE_EDGE_TOP);
+   ret = get_last_result();
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+   EXPECT_NE(d_edge_swipe, nullptr);
+
+   ret = efl_util_gesture_grab_mode_set(h_gesture, d_edge_swipe, EFL_UTIL_GESTURE_GRAB_MODE_NONE);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_INVALID_PARAMETER);
+
+   ret = efl_util_gesture_edge_swipe_free(h_gesture, d_edge_swipe);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+
+   ret = efl_util_gesture_deinitialize(h_gesture);
+   EXPECT_EQ(ret, EFL_UTIL_ERROR_NONE);
+}