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 \
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 \
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)
{
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);
/* 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
#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"
TZSH_SRV_ROLE_SOFTKEY,
TZSH_SRV_ROLE_MAGNIFIER,
TZSH_SRV_ROLE_LAUNCHER,
+ TZSH_SRV_ROLE_TASKBAR,
TZSH_SRV_ROLE_MAX
} Tzsh_Srv_Role;
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;
}
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,
_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
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;
}
}
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);
}
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";
--- /dev/null
+#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;
+}
--- /dev/null
+#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 */