_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;
}
_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);
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 \
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
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);
}
_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)
{