e_desk_area: remove use_desk_area config value
[platform/upstream/enlightenment.git] / src / bin / services / e_service_taskbar.c
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"
5
6 #include <wayland-server.h>
7 #include <tzsh_server.h>
8
9 static void _e_service_taskbar_update(E_Service_Taskbar *taskbar_service);
10
11 /* private data for taskbar */
12 static E_Service_Taskbar   *_taskbar_service = NULL;
13
14 /* event handler */
15 static E_Client_Hook       *_taskbar_del_hook = NULL;
16
17 EINTERN E_Client *
18 e_service_taskbar_client_get(void)
19 {
20    if (!_taskbar_service) return NULL;
21    return _taskbar_service->ec;
22 }
23
24 static void
25 _taskbar_client_unset(void)
26 {
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);
30 }
31
32 static void
33 _taskbar_hook_client_del(void *d EINA_UNUSED, E_Client *ec)
34 {
35    if (!ec) return;
36    if (!_taskbar_service) return;
37    if (ec != _taskbar_service->ec) return;
38
39    ELOGF("TASKBAR","Del Client", ec);
40
41    e_zone_obstacle_remove(_taskbar_service->zone, ec);
42    _taskbar_client_unset();
43 }
44
45 static Eina_Bool
46 _taskbar_cb_client_zone_set(void *data, int type EINA_UNUSED, void *event)
47 {
48    E_Service_Taskbar *taskbar_service;
49    E_Event_Client_Zone_Set *ev;
50
51    taskbar_service = data;
52    ev = event;
53
54    if (taskbar_service->ec != ev->ec)
55      goto end;
56
57    if (taskbar_service->zone == ev->zone)
58      goto end;
59
60    ELOGF("TASKBAR", "Change Zone | taskbar_service %p old(%p) new(%p)",
61          taskbar_service->ec, taskbar_service, taskbar_service->zone, ev->zone);
62
63    taskbar_service->zone = ev->zone;
64    _e_service_taskbar_update(taskbar_service);
65
66 end:
67    return ECORE_CALLBACK_PASS_ON;
68 }
69
70 EINTERN Eina_Bool
71 e_service_taskbar_client_set(E_Client *ec)
72 {
73    E_Layer layer;
74    E_Service_Taskbar *taskbar_service;
75
76    if (!ec) return EINA_FALSE;
77    if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
78
79    if (_taskbar_service)
80      {
81         ELOGF("TASKBAR", "Taskbar is already registered. registered(%p)", ec, _taskbar_service->ec);
82         return EINA_FALSE;
83      }
84
85    taskbar_service = E_NEW(E_Service_Taskbar, 1);
86    EINA_SAFETY_ON_NULL_RETURN_VAL(taskbar_service, EINA_FALSE);
87
88    ELOGF("TASKBAR","Set Client", ec);
89
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;
96
97    _taskbar_service = taskbar_service;
98
99    _taskbar_del_hook =
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);
102
103 #ifdef REFACTOR_DESK_AREA
104    // set taskbar layer
105    layer = e_client_layer_get(ec);
106 #else
107    // set taskbar layer
108    layer = e_client_desk_area_original_layer_get(ec);
109 #endif
110
111    if (E_POLICY_TASKBAR_LAYER != layer)
112      {
113         e_client_layer_set(ec, E_POLICY_TASKBAR_LAYER);
114      }
115
116    // set skip iconify
117    ec->exp_iconify.skip_iconify = 1;
118
119    // set skip focus
120    ec->icccm.accepts_focus = ec->icccm.take_focus = 0;
121
122    e_zone_obstacle_add(taskbar_service->zone, ec,
123                        &(Eina_Rectangle){_taskbar_service->x, _taskbar_service->y, _taskbar_service->w, _taskbar_service->h},
124                        0);
125
126    return EINA_TRUE;
127 }
128
129 static void
130 _e_service_taskbar_update(E_Service_Taskbar *taskbar_service)
131 {
132    Eina_Bool vertical;
133    E_Client *ec;
134
135    if (!taskbar_service->ec) return;
136    if (!taskbar_service->zone) return;
137
138    ec = taskbar_service->ec;
139
140    if (taskbar_service->place_type == 0)
141      {
142         taskbar_service->x = 0;
143         taskbar_service->y = taskbar_service->zone->h - taskbar_service->h;
144         vertical = EINA_FALSE;
145      }
146    else if (taskbar_service->place_type == 1)
147      {
148         taskbar_service->x = 0;
149         taskbar_service->y = 0;
150         vertical = EINA_FALSE;
151      }
152    else if (taskbar_service->place_type == 2)
153      {
154         taskbar_service->x = 0;
155         taskbar_service->y = 0;
156         vertical = EINA_TRUE;
157      }
158    else
159      {
160         taskbar_service->x = taskbar_service->zone->w - taskbar_service->w;
161         taskbar_service->y = 0;
162         vertical = EINA_TRUE;
163      }
164
165    if (taskbar_service->auto_placement == EINA_TRUE)
166      e_client_util_move_without_frame(ec, taskbar_service->x, taskbar_service->y);
167
168    e_zone_obstacle_update(taskbar_service->zone, ec,
169                           &(Eina_Rectangle){taskbar_service->x, taskbar_service->y, taskbar_service->w, taskbar_service->h},
170                           vertical);
171 }
172
173 EINTERN Eina_Bool
174 e_service_taskbar_place_type_set(E_Client *ec, int type)
175 {
176    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
177    EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
178
179    ELOGF("TASKBAR", "Set PLACE_TYPE... type:%d", ec, type);
180
181    if (ec != _taskbar_service->ec)
182      {
183         ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
184         return EINA_FALSE;
185      }
186
187    if (type == _taskbar_service->place_type)
188      return EINA_TRUE;
189
190    _taskbar_service->place_type = type;
191
192    _e_service_taskbar_update(_taskbar_service);
193    return EINA_TRUE;
194 }
195
196 EINTERN Eina_Bool
197 e_service_taskbar_size_set(E_Client *ec, unsigned int w, unsigned int h)
198 {
199    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
200    EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
201
202    ELOGF("TASKBAR", "Set SIZE... size:%dx%d)", ec, w, h);
203
204    if (ec != _taskbar_service->ec)
205      {
206         ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
207         return EINA_FALSE;
208      }
209
210    if (w == 0)
211      _taskbar_service->w = ec->w;
212    else
213      _taskbar_service->w = w;
214
215    if (h == 0)
216      _taskbar_service->h = ec->h;
217    else
218      _taskbar_service->h = h;
219
220    _e_service_taskbar_update(_taskbar_service);
221    return EINA_TRUE;
222 }
223
224 EINTERN Eina_Bool
225 e_service_taskbar_auto_placement_set(E_Client *ec, Eina_Bool set)
226 {
227    EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
228    EINA_SAFETY_ON_NULL_RETURN_VAL(_taskbar_service, EINA_FALSE);
229
230    ELOGF("TASKBAR", "Set Auto Placement to %d", ec, set);
231
232    if (ec != _taskbar_service->ec)
233      {
234         ELOGF("TASKBAR", "ERROR... Taskbar ec is not matched...regisered(%p)..", ec, _taskbar_service->ec);
235         return EINA_FALSE;
236      }
237
238    if (set == _taskbar_service->auto_placement)
239      return EINA_TRUE;
240
241    _taskbar_service->auto_placement = set;
242    _e_service_taskbar_update(_taskbar_service);
243
244    return EINA_TRUE;
245 }