1 #include "services/e_service_taskbar_intern.h"
2 #include "e_policy_private_data.h"
3 #include "e_client_intern.h"
4 #include "e_zone_intern.h"
6 #include <wayland-server.h>
7 #include <tzsh_server.h>
9 static void _e_service_taskbar_update(E_Service_Taskbar *taskbar_service);
11 /* private data for taskbar */
12 static E_Service_Taskbar *_taskbar_service = NULL;
15 static E_Client_Hook *_taskbar_del_hook = NULL;
18 e_service_taskbar_client_get(void)
20 if (!_taskbar_service) return NULL;
21 return _taskbar_service->ec;
25 _taskbar_client_unset(void)
27 E_FREE_LIST(_taskbar_service->events, ecore_event_handler_del);
28 E_FREE_FUNC(_taskbar_del_hook, e_client_hook_del);
29 E_FREE(_taskbar_service);
33 _taskbar_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
36 if (!_taskbar_service) return;
37 if (ec != _taskbar_service->ec) return;
39 ELOGF("TASKBAR","Del Client", ec);
41 e_zone_obstacle_remove(_taskbar_service->zone, ec);
42 _taskbar_client_unset();
46 _taskbar_cb_client_zone_set(void *data, int type EINA_UNUSED, void *event)
48 E_Service_Taskbar *taskbar_service;
49 E_Event_Client_Zone_Set *ev;
51 taskbar_service = data;
54 if (taskbar_service->ec != ev->ec)
57 if (taskbar_service->zone == ev->zone)
60 ELOGF("TASKBAR", "Change Zone | taskbar_service %p old(%p) new(%p)",
61 taskbar_service->ec, taskbar_service, taskbar_service->zone, ev->zone);
63 taskbar_service->zone = ev->zone;
64 _e_service_taskbar_update(taskbar_service);
67 return ECORE_CALLBACK_PASS_ON;
71 e_service_taskbar_client_set(E_Client *ec)
74 E_Service_Taskbar *taskbar_service;
76 if (!ec) return EINA_FALSE;
77 if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
81 ELOGF("TASKBAR", "Taskbar is already registered. registered(%p)", ec, _taskbar_service->ec);
85 taskbar_service = E_NEW(E_Service_Taskbar, 1);
86 EINA_SAFETY_ON_NULL_RETURN_VAL(taskbar_service, EINA_FALSE);
88 ELOGF("TASKBAR","Set Client", ec);
90 taskbar_service->ec = ec;
91 taskbar_service->zone = e_comp_zone_find_by_ec(ec);
92 taskbar_service->x = ec->x;
93 taskbar_service->y = ec->y;
94 taskbar_service->w = ec->w;
95 taskbar_service->h = ec->h;
97 _taskbar_service = taskbar_service;
100 e_client_hook_add(E_CLIENT_HOOK_DEL, _taskbar_hook_client_del, NULL);
101 E_LIST_HANDLER_APPEND(taskbar_service->events, E_EVENT_CLIENT_ZONE_SET, _taskbar_cb_client_zone_set, taskbar_service);
103 #ifdef REFACTOR_DESK_AREA
105 layer = e_client_layer_get(ec);
108 layer = e_client_desk_area_original_layer_get(ec);
111 if (E_POLICY_TASKBAR_LAYER != layer)
113 e_client_layer_set(ec, E_POLICY_TASKBAR_LAYER);
117 ec->exp_iconify.skip_iconify = 1;
120 ec->icccm.accepts_focus = ec->icccm.take_focus = 0;
122 e_zone_obstacle_add(taskbar_service->zone, ec,
123 &(Eina_Rectangle){_taskbar_service->x, _taskbar_service->y, _taskbar_service->w, _taskbar_service->h},
130 _e_service_taskbar_update(E_Service_Taskbar *taskbar_service)
135 if (!taskbar_service->ec) return;
136 if (!taskbar_service->zone) return;
138 ec = taskbar_service->ec;
140 if (taskbar_service->place_type == 0)
142 taskbar_service->x = 0;
143 taskbar_service->y = taskbar_service->zone->h - taskbar_service->h;
144 vertical = EINA_FALSE;
146 else if (taskbar_service->place_type == 1)
148 taskbar_service->x = 0;
149 taskbar_service->y = 0;
150 vertical = EINA_FALSE;
152 else if (taskbar_service->place_type == 2)
154 taskbar_service->x = 0;
155 taskbar_service->y = 0;
156 vertical = EINA_TRUE;
160 taskbar_service->x = taskbar_service->zone->w - taskbar_service->w;
161 taskbar_service->y = 0;
162 vertical = EINA_TRUE;
165 if (taskbar_service->auto_placement == EINA_TRUE)
166 e_client_util_move_without_frame(ec, taskbar_service->x, taskbar_service->y);
168 e_zone_obstacle_update(taskbar_service->zone, ec,
169 &(Eina_Rectangle){taskbar_service->x, taskbar_service->y, taskbar_service->w, taskbar_service->h},
174 e_service_taskbar_place_type_set(E_Client *ec, int type)
176 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
177 EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
179 ELOGF("TASKBAR", "Set PLACE_TYPE... type:%d", ec, type);
181 if (ec != _taskbar_service->ec)
183 ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
187 if (type == _taskbar_service->place_type)
190 _taskbar_service->place_type = type;
192 _e_service_taskbar_update(_taskbar_service);
197 e_service_taskbar_size_set(E_Client *ec, unsigned int w, unsigned int h)
199 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
200 EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
202 ELOGF("TASKBAR", "Set SIZE... size:%dx%d)", ec, w, h);
204 if (ec != _taskbar_service->ec)
206 ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
211 _taskbar_service->w = ec->w;
213 _taskbar_service->w = w;
216 _taskbar_service->h = ec->h;
218 _taskbar_service->h = h;
220 _e_service_taskbar_update(_taskbar_service);
225 e_service_taskbar_auto_placement_set(E_Client *ec, Eina_Bool set)
227 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
228 EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
230 ELOGF("TASKBAR", "Set Auto Placement to %d", ec, set);
232 if (ec != _taskbar_service->ec)
234 ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
238 if (set == _taskbar_service->auto_placement)
241 _taskbar_service->auto_placement = set;
242 _e_service_taskbar_update(_taskbar_service);