softkey service: support to handle the handler region for softkey service 99/261199/2 accepted/tizen/unified/20210715.094740 submit/tizen/20210714.022946
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 13 Jul 2021 07:13:40 +0000 (16:13 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 14 Jul 2021 02:09:53 +0000 (02:09 +0000)
we add code for setting the handler region of the softkey service to support showing
the softkey service by swipe up.

Change-Id: I2a00140de3359695454478c986f826f20f0923fe

src/bin/e_policy_wl.c
src/bin/services/e_service_softkey.c [changed mode: 0644->0755]
src/bin/services/e_service_softkey.h

index 7810837..be8f112 100644 (file)
@@ -3425,6 +3425,16 @@ _tzsh_srv_iface_cb_region_set(struct wl_client *client, struct wl_resource *res_
      }
    else if (tzsh_srv->role == TZSH_SRV_ROLE_VOLUME)
      e_service_volume_region_set(type, angle, tzsh_reg->tiler);
+   else if (tzsh_srv->role == TZSH_SRV_ROLE_SOFTKEY)
+     {
+        if (e_config->use_softkey_service)
+          {
+             EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh);
+             EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh->ec);
+
+             e_service_softkey_handler_region_set(tzsh_srv->tzsh->ec, angle, tzsh_reg->tiler);
+          }
+     }
 }
 
 static void
old mode 100644 (file)
new mode 100755 (executable)
index 234c690..e3d312b
@@ -68,6 +68,7 @@ e_service_softkey_module_func_set(E_Service_Softkey_Funcs *fp)
    _e_softkey_funcs->softkey_service_opacity_set = fp->softkey_service_opacity_set;
    _e_softkey_funcs->softkey_service_opacity_get = fp->softkey_service_opacity_get;
    _e_softkey_funcs->softkey_service_get = fp->softkey_service_get;
+   _e_softkey_funcs->softkey_service_handler_region_set = fp->softkey_service_handler_region_set;
 
    return EINA_TRUE;
 }
@@ -123,6 +124,7 @@ e_service_softkey_del(E_Service_Softkey *softkey)
 
    _e_softkey_list = eina_list_remove(_e_softkey_list , softkey);
 
+   E_FREE_FUNC(softkey->handler_obj, evas_object_del);
    E_FREE_LIST(softkey->intercept_hooks, e_comp_object_intercept_hook_del);
 
    E_FREE(softkey);
@@ -188,6 +190,94 @@ end:
    return EINA_TRUE;
 }
 
+
+static void
+_e_service_softkey_client_evas_cb_show(void *data, Evas *evas, Evas_Object *obj, void *event)
+{
+   E_Service_Softkey *softkey_service;
+
+   softkey_service = data;
+   if (!softkey_service) return;
+
+   ELOGF("SOFTKEY", "Show SOFTKEY SERVICE(%p)!!!  HIDE handler_obj (%p)...", NULL, softkey_service, softkey_service->handler_obj);
+   evas_object_hide(softkey_service->handler_obj);
+}
+
+static void
+_e_service_softkey_client_evas_cb_hide(void *data, Evas *evas, Evas_Object *obj, void *event)
+{
+   E_Service_Softkey *softkey_service;
+
+   softkey_service = data;
+   if (!softkey_service) return;
+
+   ELOGF("SOFTKEY", "Hide SOFTKEY SERVICE(%p)!!!  SHOW handler_obj (%p)...", NULL, softkey_service, softkey_service->handler_obj);
+   evas_object_show(softkey_service->handler_obj);
+}
+
+static void
+_e_service_softkey_handler_obj_cb_gesture_start(void *data, Evas_Object *handler, int nfingers, int x, int y, unsigned int timestamp)
+{
+   E_Service_Softkey *softkey_service;
+
+   ELOGF("SOFTKEY", "Start gesture for softkey service", NULL);
+
+   softkey_service = data;
+   if (EINA_UNLIKELY(!softkey_service))
+     return;
+
+   if (EINA_UNLIKELY(!softkey_service->ec))
+     return;
+
+   if (e_object_is_del(E_OBJECT(softkey_service->ec)))
+     return;
+
+   /* cancel touch events sended up to now */
+   e_comp_wl_touch_cancel();
+}
+
+
+static void
+_e_service_softkey_handler_obj_cb_gesture_end(void *data, Evas_Object *handler, int nfingers, int x, int y, unsigned int timestamp)
+{
+   E_Service_Softkey *softkey_service;
+
+   ELOGF("SOFTKEY", "End gesture for softkey service", NULL);
+
+   softkey_service = data;
+   if (!softkey_service) return;
+
+   ELOGF("SOFTKEY", "Show softkey service(%p)", softkey_service->ec, softkey_service);
+   e_service_softkey_show(softkey_service);
+}
+
+static Evas_Object *
+_e_service_handler_object_new(E_Service_Softkey *softkey_service)
+{
+   Evas_Object *handler_obj;
+
+   handler_obj = e_service_region_object_new(softkey_service->ec);
+   evas_object_name_set(handler_obj, "softkey_service::handler_obj");
+   if (!handler_obj)
+     return NULL;
+
+   evas_object_repeat_events_set(handler_obj, EINA_FALSE);
+   /* FIXME: make me move to explicit layer something like POL_LAYER */
+   evas_object_layer_set(handler_obj, EVAS_LAYER_MAX - 1);
+
+   e_service_region_gesture_set(handler_obj,
+                                POL_GESTURE_TYPE_LINE,
+                                1,
+                                _e_service_softkey_handler_obj_cb_gesture_start,
+                                NULL,
+                                _e_service_softkey_handler_obj_cb_gesture_end, softkey_service);
+
+   ELOGF("SOFTKEY", "SHOW SOFTKEY(%p)'s handler_obj (%p)...", NULL, softkey_service, handler_obj);
+   evas_object_show(handler_obj);
+
+   return handler_obj;
+}
+
 #undef E_COMP_OBJECT_INTERCEPT_HOOK_APPEND
 #define E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(l, t, cb, d) \
   do                                                     \
@@ -258,6 +348,9 @@ e_service_softkey_client_set(E_Client *ec)
    e_policy_animatable_lock(ec, E_POLICY_ANIMATABLE_NEVER, EINA_TRUE);
 
    E_COMP_OBJECT_INTERCEPT_HOOK_APPEND(softkey->intercept_hooks, E_COMP_OBJECT_INTERCEPT_HOOK_SHOW_HELPER, _softkey_intercept_hook_show, softkey);
+
+   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_SHOW, _e_service_softkey_client_evas_cb_show, softkey);
+   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_HIDE, _e_service_softkey_client_evas_cb_hide, softkey);
 }
 
 EINTERN void
@@ -276,6 +369,9 @@ e_service_softkey_client_unset(E_Client *ec)
    softkey = e_service_softkey_get(ec->zone);
    if (!softkey) return;
 
+   evas_object_event_callback_del(softkey->ec->frame, EVAS_CALLBACK_SHOW, _e_service_softkey_client_evas_cb_show);
+   evas_object_event_callback_del(softkey->ec->frame, EVAS_CALLBACK_HIDE, _e_service_softkey_client_evas_cb_hide);
+
    e_service_softkey_del(softkey);
 }
 
@@ -529,6 +625,104 @@ e_service_softkey_store_visible_request(E_Client *ec, Eina_Bool visible)
    _e_softkey_pending_req.visible = eina_list_append(_e_softkey_pending_req.visible, vis_req);
 }
 
+static void
+_e_service_softkey_handler_obj_region_set(E_Service_Softkey *softkey_service, int angle, int x, int y, int w, int h)
+{
+   int nx, ny, nw, nh;
+
+   ELOGF("SOFTKEY", "Handler Region Set | angle[%d]: geo (%d, %d, %d, %d",
+         softkey_service->ec, angle, x, y, w, h);
+
+   if ((w <= 0) || (h <= 0)) return;
+
+   switch (angle)
+     {
+      case E_POLICY_ANGLE_MAP_0:
+         nx = x;
+         ny = y;
+         nw = w;
+         nh = h;
+         break;
+
+      case E_POLICY_ANGLE_MAP_90:
+         nx = x;
+         ny = y;
+         nw = w;
+         nh = h;
+         break;
+
+      case E_POLICY_ANGLE_MAP_180:
+         nx = x;
+         ny = y;
+         nw = w;
+         nh = h;
+         break;
+
+      case E_POLICY_ANGLE_MAP_270:
+         nx = x;
+         ny = y;
+         nw = w;
+         nh = h;
+         break;
+
+      default:
+         nx = x;
+         ny = y;
+         nw = w;
+         nh = h;
+         break;
+     }
+
+   ELOGF("SOFTKEY", "handler obj:%p, angle:%d, converted_geo(%d, %d, %d, %d)", NULL, softkey_service->handler_obj, angle, nx, ny, nw, nh);
+   e_service_region_rectangle_set(softkey_service->handler_obj, angle, nx, ny, nw, nh);
+}
+
+static void
+_e_service_softkey_handler_region_set(E_Service_Softkey *softkey_service, E_Policy_Angle_Map ridx, Eina_Tiler *tiler)
+{
+   Eina_Iterator *it;
+   Eina_Rectangle *r;
+
+   it = eina_tiler_iterator_new(tiler);
+   EINA_ITERATOR_FOREACH(it, r)
+     {
+        _e_service_softkey_handler_obj_region_set(softkey_service, ridx, r->x, r->y, r->w, r->h);
+        break;
+     }
+   eina_iterator_free(it);
+}
+
+EINTERN Eina_Bool
+e_service_softkey_handler_region_set(E_Client *ec, int angle, Eina_Tiler *tiler)
+{
+   if (_e_softkey_funcs && _e_softkey_funcs->softkey_service_handler_region_set)
+     {
+        return _e_softkey_funcs->softkey_service_handler_region_set(ec, angle, tiler);
+     }
+
+   E_Service_Softkey *softkey_service = NULL;
+   E_Policy_Angle_Map ridx;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
+
+   ELOGF("SOFTKEY", "SOFTKEY_SRV.. SET Softkey region. angle:%d", ec, angle);
+
+   softkey_service = e_service_softkey_get(ec->zone);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(softkey_service, EINA_FALSE);
+
+   if (!softkey_service->handler_obj)
+     {
+        softkey_service->handler_obj = _e_service_handler_object_new(softkey_service);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(softkey_service->handler_obj, EINA_FALSE);
+     }
+
+   ridx = e_policy_angle_map(angle);
+   _e_service_softkey_handler_region_set(softkey_service, ridx, tiler);
+
+   return EINA_TRUE;
+}
+
 E_API E_Service_Softkey *
 e_service_softkey_get(E_Zone *zone)
 {
index 9010054..2045d36 100644 (file)
@@ -11,6 +11,7 @@ struct _E_Service_Softkey
    E_Zone *zone;
    E_Client *ec;
    struct wl_resource *wl_res;
+   Evas_Object *handler_obj;
    E_Policy_Softkey_Expand expand;
    E_Policy_Softkey_Opacity opacity;
    Eina_List *intercept_hooks;
@@ -34,6 +35,7 @@ struct _E_Service_Softkey_Funcs
    void                (*softkey_service_opacity_set)(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity opacity);
    Eina_Bool           (*softkey_service_opacity_get)(E_Service_Softkey *softkey, E_Policy_Softkey_Opacity *opacity);
    E_Service_Softkey*  (*softkey_service_get)(E_Zone *zone);
+   Eina_Bool           (*softkey_service_handler_region_set)(E_Client *ec, int angle, Eina_Tiler *tiler);
 };
 
 
@@ -64,6 +66,8 @@ EINTERN void              e_service_softkey_client_remove_handler_del(void);
 EINTERN void              e_service_softkey_restore_visible_request(E_Service_Softkey *softkey_srv);
 EINTERN void              e_service_softkey_store_visible_request(E_Client *ec, Eina_Bool visible);
 
+EINTERN Eina_Bool         e_service_softkey_handler_region_set(E_Client *ec, int angle, Eina_Tiler *tiler);
+
 E_API E_Service_Softkey  *e_service_softkey_get(E_Zone *zone);
 
 #endif