From: Doyoun Kang Date: Tue, 25 Apr 2023 09:24:58 +0000 (+0900) Subject: support taskbar_service X-Git-Tag: accepted/tizen/unified/20230428.155115^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F16%2F292116%2F2;p=platform%2Fupstream%2Fenlightenment.git support taskbar_service Change-Id: Id628e55061fa8b91dec221753bb8ed9e5a06b1f3 --- diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk index a3fcf62f1a..15db08ccd9 100644 --- a/src/bin/Makefile.mk +++ b/src/bin/Makefile.mk @@ -124,6 +124,7 @@ src/bin/services/e_service_cbhm.h \ src/bin/services/e_service_scrsaver.h \ src/bin/services/e_service_softkey.h \ src/bin/services/e_service_launcher.h \ +src/bin/services/e_service_taskbar.h \ src/bin/e_policy.h \ src/bin/e_policy_conformant.h \ src/bin/e_policy_visibility.h \ @@ -253,6 +254,7 @@ src/bin/services/e_service_cbhm.c \ src/bin/services/e_service_scrsaver.c \ src/bin/services/e_service_softkey.c \ src/bin/services/e_service_launcher.c \ +src/bin/services/e_service_taskbar.c \ src/bin/e_policy.c \ src/bin/e_policy_conformant.c \ src/bin/e_policy_softkey.c \ diff --git a/src/bin/e_policy.c b/src/bin/e_policy.c index 04770d8fb6..031feab899 100644 --- a/src/bin/e_policy.c +++ b/src/bin/e_policy.c @@ -1952,6 +1952,25 @@ e_policy_client_is_watch_viewer(E_Client *ec) return EINA_FALSE; } +Eina_Bool +e_policy_client_is_taskbar(E_Client *ec) +{ + E_OBJECT_CHECK_RETURN(ec, EINA_FALSE); + E_OBJECT_TYPE_CHECK_RETURN(ec, E_CLIENT_TYPE, EINA_FALSE); + + if (ec->client_type == 3) + return EINA_TRUE; + + if (!e_util_strcmp(ec->icccm.title, "TaskBar")) + return EINA_TRUE; + + if (!e_util_strcmp(ec->icccm.window_role, "taskbar")) + return EINA_TRUE; + + return EINA_FALSE; +} + + E_Service_Quickpanel_Type e_policy_quickpanel_type_get(E_Client *ec) { diff --git a/src/bin/e_policy.h b/src/bin/e_policy.h index ac7c035829..9019793cea 100644 --- a/src/bin/e_policy.h +++ b/src/bin/e_policy.h @@ -234,6 +234,7 @@ E_API Eina_Bool e_policy_client_is_keyboard(E_Client *ec); E_API Eina_Bool e_policy_client_is_keyboard_sub(E_Client *ec); E_API Eina_Bool e_policy_client_is_keyboard_magnifier(E_Client *ec); E_API Eina_Bool e_policy_client_is_watch_viewer(E_Client *ec); +E_API Eina_Bool e_policy_client_is_taskbar(E_Client *ec); E_API E_Service_Quickpanel_Type e_policy_quickpanel_type_get(E_Client *ec); diff --git a/src/bin/e_policy_private_data.h b/src/bin/e_policy_private_data.h index 7ed3581ff1..10f830cc1d 100644 --- a/src/bin/e_policy_private_data.h +++ b/src/bin/e_policy_private_data.h @@ -55,6 +55,9 @@ e_policy_angle_get(E_Policy_Angle_Map map) /* layer level - E_LAYER_CLIENT_FULLSCREEN (350) */ +/* layer level - E_LAYER_CLIENT_EDGE (300) */ +# define E_POLICY_TASKBAR_LAYER E_LAYER_CLIENT_EDGE + /* layer level - E_LAYER_CLIENT_ABOVE (250) */ # define E_POLICY_DIALOG_LAYER E_LAYER_CLIENT_ABOVE diff --git a/src/bin/e_policy_wl.c b/src/bin/e_policy_wl.c index 8e9ddb62c2..b847a0f134 100644 --- a/src/bin/e_policy_wl.c +++ b/src/bin/e_policy_wl.c @@ -8,6 +8,7 @@ #include "services/e_service_scrsaver.h" #include "services/e_service_softkey.h" #include "services/e_service_launcher.h" +#include "services/e_service_taskbar.h" #include "e_policy_wl_display.h" #include "e_policy_conformant_internal.h" #include "e_policy_visibility.h" @@ -34,6 +35,7 @@ typedef enum _Tzsh_Srv_Role TZSH_SRV_ROLE_SOFTKEY, TZSH_SRV_ROLE_MAGNIFIER, TZSH_SRV_ROLE_LAUNCHER, + TZSH_SRV_ROLE_TASKBAR, TZSH_SRV_ROLE_MAX } Tzsh_Srv_Role; @@ -754,6 +756,7 @@ _e_policy_wl_tzsh_srv_role_get(const char *name) else if (!e_util_strcmp(name, "softkey" )) role = TZSH_SRV_ROLE_SOFTKEY; else if (!e_util_strcmp(name, "magnifier" )) role = TZSH_SRV_ROLE_MAGNIFIER; else if (!e_util_strcmp(name, "launcher" )) role = TZSH_SRV_ROLE_LAUNCHER; + else if (!e_util_strcmp(name, "taskbar" )) role = TZSH_SRV_ROLE_TASKBAR; return role; } @@ -4411,6 +4414,77 @@ _tzsh_srv_iface_cb_launcher_get(struct wl_client *client, struct wl_resource *re e_service_launcher_resource_set(tzsh_srv->ec, res); } +static void +_tzsh_srv_taskbar_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static void +_tzsh_srv_taskbar_cb_place_type_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t place_type) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(resource); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh); + + ec = tzsh_srv->ec; + EINA_SAFETY_ON_NULL_RETURN(ec); + + e_service_taskbar_place_type_set(ec, place_type); +} + +static void +_tzsh_srv_taskbar_cb_size_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource, uint32_t width, uint32_t height) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + E_Client *ec; + + tzsh_srv = wl_resource_get_user_data(resource); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh); + + ec = tzsh_srv->ec; + EINA_SAFETY_ON_NULL_RETURN(ec); + + e_service_taskbar_size_set(ec, width, height); +} + +static const struct tws_service_taskbar_interface _tzsh_srv_taskbar_iface = +{ + _tzsh_srv_taskbar_cb_destroy, + _tzsh_srv_taskbar_cb_place_type_set, + _tzsh_srv_taskbar_cb_size_set, +}; + +static void +_tzsh_srv_iface_cb_taskbar_get(struct wl_client *client, struct wl_resource *res_tzsh_srv, uint32_t id) +{ + E_Policy_Wl_Tzsh_Srv *tzsh_srv; + struct wl_resource *res; + + tzsh_srv = wl_resource_get_user_data(res_tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv); + EINA_SAFETY_ON_NULL_RETURN(tzsh_srv->tzsh); + + if (!eina_list_data_find(polwl->tzsh_srvs, tzsh_srv)) + return; + + res = wl_resource_create(client, + &tws_service_taskbar_interface, + 1, + id); + if (!res) + { + wl_client_post_no_memory(client); + return; + } + + wl_resource_set_implementation(res, &_tzsh_srv_taskbar_iface, tzsh_srv, NULL); +} + static const struct tws_service_interface _tzsh_srv_iface = { _tzsh_srv_iface_cb_destroy, @@ -4423,6 +4497,7 @@ static const struct tws_service_interface _tzsh_srv_iface = _tzsh_srv_iface_cb_softkey_get, _tzsh_srv_iface_cb_magnifier_get, _tzsh_srv_iface_cb_launcher_get, + _tzsh_srv_iface_cb_taskbar_get, }; static Eina_Bool @@ -4465,6 +4540,11 @@ _e_policy_wl_tzsh_service_check_privilege(struct wl_client *client, int role) case TZSH_SRV_ROLE_LAUNCHER: privilege = E_PRIVILEGE_LAUNCHER_SERVICE; break; +/* TODO: Need to check privilege + case TZSH_SRV_ROLE_TASKBAR: + privilege = E_PRIVILEGE_TASKBAR_SERVICE; + break; +*/ default: return EINA_TRUE; } @@ -4632,6 +4712,8 @@ _tzsh_iface_cb_srv_create(struct wl_client *client, struct wl_resource *res_tzsh } else if (role == TZSH_SRV_ROLE_LAUNCHER) e_service_launcher_client_set(tzsh_srv->ec); + else if (role == TZSH_SRV_ROLE_TASKBAR) + e_service_taskbar_client_set(tzsh_srv->ec); e_client_desk_iconify_skip_set(tzsh_srv->ec, EINA_TRUE); } diff --git a/src/bin/e_privilege.c b/src/bin/e_privilege.c index 6b17a9f5ba..118e1da896 100644 --- a/src/bin/e_privilege.c +++ b/src/bin/e_privilege.c @@ -17,6 +17,7 @@ EINTERN const char *E_PRIVILEGE_INDICATOR_SERVICE = "http://tizen.org/pr EINTERN const char *E_PRIVILEGE_SCREENSAVER_SERVICE = "http://tizen.org/privilege/internal/default/platform"; EINTERN const char *E_PRIVILEGE_CBHM_SERVICE = "http://tizen.org/privilege/internal/default/platform"; EINTERN const char *E_PRIVILEGE_SOFTKEY_SERVICE = "http://tizen.org/privilege/internal/default/platform"; +EINTERN const char *E_PRIVILEGE_TASKBAR_SERVICE = "http://tizen.org/privilege/internal/default/platform"; E_API const char *E_PRIVILEGE_GESTURE_GRAB = "http://tizen.org/privilege/gesturegrab"; E_API const char *E_PRIVILEGE_GESTURE_ACTIVATE = "http://tizen.org/privilege/gestureactivation"; diff --git a/src/bin/services/e_service_taskbar.c b/src/bin/services/e_service_taskbar.c new file mode 100644 index 0000000000..cc07113873 --- /dev/null +++ b/src/bin/services/e_service_taskbar.c @@ -0,0 +1,184 @@ +#include "e.h" +#include "services/e_service_taskbar.h" + +#include +#include + +/* private data for taskbar */ +static E_Service_Taskbar *_taskbar_service = NULL; + +/* event handler */ +static E_Client_Hook *_taskbar_del_hook = NULL; + +EINTERN E_Client * +e_service_taskbar_client_get(void) +{ + if (!_taskbar_service) return NULL; + return _taskbar_service->ec; +} + +static void +_taskbar_client_unset(void) +{ + E_FREE_FUNC(_taskbar_del_hook, e_client_hook_del); + E_FREE(_taskbar_service); +} + +static void +_taskbar_hook_client_del(void *d EINA_UNUSED, E_Client *ec) +{ + if (!ec) return; + if (!_taskbar_service) return; + if (ec != _taskbar_service->ec) return; + + ELOGF("TASKBAR","Del Client", ec); + + e_zone_obstacle_remove(ec->zone, ec); + _taskbar_client_unset(); +} + +EINTERN Eina_Bool +e_service_taskbar_client_set(E_Client *ec) +{ + E_Layer layer; + E_Service_Taskbar *taskbar_service; + + if (!ec) return EINA_FALSE; + if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE; + + if (_taskbar_service) + { + ELOGF("TASKBAR", "Taskbar is already registered. registered(%p)", ec, _taskbar_service->ec); + return EINA_FALSE; + } + + taskbar_service = E_NEW(E_Service_Taskbar, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(taskbar_service, EINA_FALSE); + + ELOGF("TASKBAR","Set Client", ec); + + taskbar_service->ec = ec; + taskbar_service->x = ec->x; + taskbar_service->y = ec->y; + taskbar_service->w = ec->w; + taskbar_service->h = ec->h; + + _taskbar_service = taskbar_service; + + _taskbar_del_hook = + e_client_hook_add(E_CLIENT_HOOK_DEL, _taskbar_hook_client_del, NULL); + + // set taskbar layer + if (e_config->use_desk_area) + layer = e_client_desk_area_original_layer_get(ec); + else + layer = e_client_layer_get(ec); + + if (E_POLICY_TASKBAR_LAYER != layer) + { + e_client_layer_set(ec, E_POLICY_TASKBAR_LAYER); + } + + // set skip iconify + ec->exp_iconify.skip_iconify = 1; + + // set skip focus + ec->icccm.accepts_focus = ec->icccm.take_focus = 0; + + e_zone_obstacle_add(ec->zone, ec, + &(Eina_Rectangle){_taskbar_service->x, _taskbar_service->y, _taskbar_service->w, _taskbar_service->h}, + 0); + + return EINA_TRUE; +} + +static void +_e_service_taskbar_update(E_Service_Taskbar *taskbar_service) +{ + Eina_Bool vertical; + E_Client *ec; + + if (!taskbar_service) return; + + ec = taskbar_service->ec; + + if (taskbar_service->place_type == 0) + { + taskbar_service->x = 0; + taskbar_service->y = ec->zone->h - taskbar_service->h; + vertical = EINA_FALSE; + } + else if (taskbar_service->place_type == 1) + { + taskbar_service->x = 0; + taskbar_service->y = 0; + vertical = EINA_FALSE; + } + else if (taskbar_service->place_type == 2) + { + taskbar_service->x = 0; + taskbar_service->y = 0; + vertical = EINA_TRUE; + } + else + { + taskbar_service->x = ec->zone->w - taskbar_service->w; + taskbar_service->y = 0; + vertical = EINA_TRUE; + } + + e_zone_obstacle_update(ec->zone, ec, + &(Eina_Rectangle){taskbar_service->x, taskbar_service->y, taskbar_service->w, taskbar_service->h}, + vertical); +} + +EINTERN Eina_Bool +e_service_taskbar_place_type_set(E_Client *ec, int type) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE); + + ELOGF("TASKBAR", "Set PLACE_TYPE... type:%d", ec, type); + + if (ec != _taskbar_service->ec) + { + ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec); + return EINA_FALSE; + } + + if (type == _taskbar_service->place_type) + return EINA_TRUE; + + _taskbar_service->place_type = type; + + _e_service_taskbar_update(_taskbar_service); + return EINA_TRUE; +} + +EINTERN Eina_Bool +e_service_taskbar_size_set(E_Client *ec, unsigned int w, unsigned int h) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE); + + ELOGF("TASKBAR", "Set SIZE... size:%dx%d)", ec, w, h); + + if (ec != _taskbar_service->ec) + { + ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec); + return EINA_FALSE; + } + + if (w == 0) + _taskbar_service->w = ec->w; + else + _taskbar_service->w = w; + + if (h == 0) + _taskbar_service->h = ec->h; + else + _taskbar_service->h = h; + + _e_service_taskbar_update(_taskbar_service); + return EINA_TRUE; +} diff --git a/src/bin/services/e_service_taskbar.h b/src/bin/services/e_service_taskbar.h new file mode 100644 index 0000000000..801367ac78 --- /dev/null +++ b/src/bin/services/e_service_taskbar.h @@ -0,0 +1,21 @@ +#ifndef E_SERVICE_TASKBAR_H +#define E_SERVICE_TASKBAR_H + +#include +#include "e_policy_private_data.h" + +typedef struct _E_Service_Taskbar E_Service_Taskbar; +struct _E_Service_Taskbar +{ + E_Client *ec; + int place_type; + int x, y; + unsigned int w, h; +}; + +EINTERN Eina_Bool e_service_taskbar_client_set(E_Client *ec); +EINTERN E_Client *e_service_taskbar_client_get(void); +EINTERN Eina_Bool e_service_taskbar_place_type_set(E_Client *ec, int type); +EINTERN Eina_Bool e_service_taskbar_size_set(E_Client *ec, unsigned int w, unsigned int h); + +#endif /* E_SERVICE_TASKBAR_H */