support taskbar_service 16/292116/2 accepted/tizen/unified/20230428.155115
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 25 Apr 2023 09:24:58 +0000 (18:24 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 27 Apr 2023 08:32:31 +0000 (08:32 +0000)
Change-Id: Id628e55061fa8b91dec221753bb8ed9e5a06b1f3

src/bin/Makefile.mk
src/bin/e_policy.c
src/bin/e_policy.h
src/bin/e_policy_private_data.h
src/bin/e_policy_wl.c
src/bin/e_privilege.c
src/bin/services/e_service_taskbar.c [new file with mode: 0644]
src/bin/services/e_service_taskbar.h [new file with mode: 0644]

index a3fcf62..15db08c 100644 (file)
@@ -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 \
index 04770d8..031feab 100644 (file)
@@ -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)
 {
index ac7c035..9019793 100644 (file)
@@ -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);
 
index 7ed3581..10f830c 100644 (file)
@@ -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
 
index 8e9ddb6..b847a0f 100644 (file)
@@ -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);
 }
index 6b17a9f..118e1da 100644 (file)
@@ -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 (file)
index 0000000..cc07113
--- /dev/null
@@ -0,0 +1,184 @@
+#include "e.h"
+#include "services/e_service_taskbar.h"
+
+#include <wayland-server.h>
+#include <tzsh_server.h>
+
+/* 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 (file)
index 0000000..801367a
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef E_SERVICE_TASKBAR_H
+#define E_SERVICE_TASKBAR_H
+
+#include <e.h>
+#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 */