1 #include "e.h"
2 
3 static void _e_client_cb_border_menu_end(void *data, E_Menu *m);
4 static void _e_client_menu_cb_locks(void *data, E_Menu *m, E_Menu_Item *mi);
5 static void _e_client_menu_cb_remember(void *data, E_Menu *m, E_Menu_Item *mi);
6 static void _e_client_menu_cb_borderless(void *data, E_Menu *m, E_Menu_Item *mi);
7 static void _e_client_menu_cb_border(void *data, E_Menu *m, E_Menu_Item *mi);
8 static void _e_client_menu_cb_redirect_set(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED);
9 static void _e_client_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi);
10 static void _e_client_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi);
11 static void _e_client_menu_cb_kill(void *data, E_Menu *m, E_Menu_Item *mi);
12 static void _e_client_menu_cb_move(void *data, E_Menu *m, E_Menu_Item *mi);
13 static void _e_client_menu_cb_resize(void *data, E_Menu *m, E_Menu_Item *mi);
14 static void _e_client_menu_cb_maximize_pre(void *data, E_Menu *m, E_Menu_Item *mi);
15 static void _e_client_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi);
16 static void _e_client_menu_cb_maximize_vertically(void *data, E_Menu *m, E_Menu_Item *mi);
17 static void _e_client_menu_cb_maximize_horizontally(void *data, E_Menu *m, E_Menu_Item *mi);
18 static void _e_client_menu_cb_maximize_left(void *data, E_Menu *m, E_Menu_Item *mi);
19 static void _e_client_menu_cb_maximize_right(void *data, E_Menu *m, E_Menu_Item *mi);
20 static void _e_client_menu_cb_unmaximize(void *data, E_Menu *m, E_Menu_Item *mi);
21 static void _e_client_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi);
22 static void _e_client_menu_cb_resistance(void *data, E_Menu *m, E_Menu_Item *mi);
23 static void _e_client_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi);
24 static void _e_client_menu_cb_application_pre(void *data, E_Menu *m, E_Menu_Item *mi);
25 static void _e_client_menu_cb_window_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi);
26 static void _e_client_menu_cb_prop(void *data, E_Menu *m, E_Menu_Item *mi);
27 static void _e_client_menu_cb_stick(void *data, E_Menu *m, E_Menu_Item *mi);
28 static void _e_client_menu_cb_stacking_pre(void *data, E_Menu *m, E_Menu_Item *mi);
29 static void _e_client_menu_cb_on_top(void *data, E_Menu *m, E_Menu_Item *mi);
30 static void _e_client_menu_cb_normal(void *data, E_Menu *m, E_Menu_Item *mi);
31 static void _e_client_menu_cb_below(void *data, E_Menu *m, E_Menu_Item *mi);
32 static void _e_client_menu_cb_fullscreen(void *data, E_Menu *m, E_Menu_Item *mi);
33 static void _e_client_menu_cb_skip_winlist(void *data, E_Menu *m, E_Menu_Item *mi);
34 static void _e_client_menu_cb_skip_pager(void *data, E_Menu *m, E_Menu_Item *mi);
35 static void _e_client_menu_cb_skip_taskbar(void *data, E_Menu *m, E_Menu_Item *mi);
36 static void _e_client_menu_cb_sendto_pre(void *data, E_Menu *m, E_Menu_Item *mi);
37 static void _e_client_menu_cb_align_pre(void *data, E_Menu *m, E_Menu_Item *mi);
38 static void _e_client_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi);
39 static void _e_client_menu_cb_pin(void *data, E_Menu *m, E_Menu_Item *mi);
40 static void _e_client_menu_cb_unpin(void *data, E_Menu *m, E_Menu_Item *mi);
41 static void _e_client_menu_cb_raise(void *data, E_Menu *m, E_Menu_Item *mi);
42 static void _e_client_menu_cb_lower(void *data, E_Menu *m, E_Menu_Item *mi);
43 static void _e_client_menu_cb_skip_pre(void *data, E_Menu *m, E_Menu_Item *mi);
44 static void _e_client_menu_cb_fav_add(void *data, E_Menu *m, E_Menu_Item *mi);
45 static void _e_client_menu_cb_kbdshrtct_add(void *data, E_Menu *m, E_Menu_Item *mi);
46 static void _e_client_menu_cb_ibar_add_pre(void *data, E_Menu *m, E_Menu_Item *mi);
47 static void _e_client_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi);
48 static void _e_client_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi);
49 static void _e_client_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi);
50 #ifndef HAVE_WAYLAND_ONLY
51 static void _e_client_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi);
52 #endif
53 static void _e_client_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi);
54 static void _e_client_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi);
55 
56 static Eina_List *menu_hooks = NULL;
57 
58 E_API E_Client_Menu_Hook *
e_int_client_menu_hook_add(E_Client_Menu_Hook_Cb cb,const void * data)59 e_int_client_menu_hook_add(E_Client_Menu_Hook_Cb cb, const void *data)
60 {
61    E_Client_Menu_Hook *h;
62 
63    if (!cb) return NULL;
64    h = E_NEW(E_Client_Menu_Hook, 1);
65    if (!h) return NULL;
66 
67    h->cb = cb;
68    h->data = (void *)data;
69    menu_hooks = eina_list_append(menu_hooks, h);
70    return h;
71 }
72 
73 E_API void
e_int_client_menu_hook_del(E_Client_Menu_Hook * hook)74 e_int_client_menu_hook_del(E_Client_Menu_Hook *hook)
75 {
76    E_Client_Menu_Hook *h;
77    Eina_List *l;
78 
79    if (!hook) return;
80 
81    EINA_LIST_FOREACH(menu_hooks, l, h)
82      if (h == hook)
83        {
84           menu_hooks = eina_list_remove_list(menu_hooks, l);
85           free(h);
86           return;
87        }
88 }
89 
90 E_API void
e_int_client_menu_hooks_clear(void)91 e_int_client_menu_hooks_clear(void)
92 {
93    E_Client_Menu_Hook *h;
94    EINA_LIST_FREE(menu_hooks, h)
95      free(h);
96 }
97 
98 E_API void
e_int_client_menu_create(E_Client * ec)99 e_int_client_menu_create(E_Client *ec)
100 {
101    E_Menu *m;
102    E_Menu_Item *mi;
103    Eina_List *l;
104    E_Client_Menu_Hook *h;
105    char buf[128];
106    Eina_Bool borderless;
107 
108    if (ec->border_menu) return;
109 
110    m = e_menu_new();
111    e_menu_category_set(m, "border");
112    e_menu_category_data_set("border", ec);
113    e_object_data_set(E_OBJECT(m), ec);
114    ec->border_menu = m;
115    e_menu_post_deactivate_callback_set(m, _e_client_cb_border_menu_end, NULL);
116 
117    if (!ec->internal)
118      {
119         if (ec->icccm.class)
120           snprintf(buf, sizeof(buf), "%s", ec->icccm.class);
121         else
122           snprintf(buf, sizeof(buf), _("Application"));
123         mi = e_menu_item_new(m);
124         e_menu_item_label_set(mi, buf);
125         e_menu_item_submenu_pre_callback_set(mi, _e_client_menu_cb_application_pre, ec);
126         if (ec->desktop)
127           e_util_desktop_menu_item_icon_add(ec->desktop, 16, mi);
128      }
129    borderless = e_client_util_borderless(ec);
130 
131    mi = e_menu_item_new(m);
132    e_menu_item_label_set(mi, _("Window"));
133    e_menu_item_submenu_pre_callback_set(mi, _e_client_menu_cb_window_pre, ec);
134    e_menu_item_icon_edje_set(mi,
135                              e_theme_edje_file_get("base/theme/borders",
136                                                    "e/widgets/border/default/window"),
137                              "e/widgets/border/default/window");
138 
139    mi = e_menu_item_new(m);
140    e_menu_item_separator_set(mi, 1);
141 
142    if ((!ec->sticky) && ((eina_list_count(e_comp->zones) > 1) || (ec->zone->desk_x_count > 1) || (ec->zone->desk_y_count > 1)))
143      {
144         mi = e_menu_item_new(m);
145         e_menu_item_label_set(mi, _("Move to"));
146         e_menu_item_submenu_pre_callback_set(mi, _e_client_menu_cb_sendto_pre, ec);
147         e_menu_item_icon_edje_set(mi,
148                                   e_theme_edje_file_get("base/theme/borders",
149                                                         "e/widgets/border/default/sendto"),
150                                   "e/widgets/border/default/sendto");
151      }
152 
153    if ((!ec->lock_user_location) && (!ec->iconic) && (!ec->maximized) && (!ec->fullscreen))
154      {
155         mi = e_menu_item_new(m);
156         e_menu_item_label_set(mi, _("Align"));
157         e_menu_item_submenu_pre_callback_set(mi, _e_client_menu_cb_align_pre, ec);
158      }
159 
160    if (ec->layer <= E_LAYER_CLIENT_ABOVE)
161      {
162         mi = e_menu_item_new(m);
163         e_menu_item_label_set(mi, _("Always on Top"));
164         e_menu_item_check_set(mi, 1);
165         e_menu_item_toggle_set(mi, (ec->layer == E_LAYER_CLIENT_ABOVE ? 1 : 0));
166         if (ec->layer == E_LAYER_CLIENT_ABOVE)
167           e_menu_item_callback_set(mi, _e_client_menu_cb_normal, ec);
168         else
169           e_menu_item_callback_set(mi, _e_client_menu_cb_on_top, ec);
170         e_menu_item_icon_edje_set(mi,
171                                   e_theme_edje_file_get("base/theme/borders",
172                                                         "e/widgets/border/default/stack_on_top"),
173                                   "e/widgets/border/default/stack_on_top");
174      }
175 
176    if (!ec->lock_user_sticky)
177      {
178         mi = e_menu_item_new(m);
179         e_menu_item_label_set(mi, _("Sticky"));
180         e_menu_item_check_set(mi, 1);
181         e_menu_item_toggle_set(mi, (ec->sticky ? 1 : 0));
182         e_menu_item_callback_set(mi, _e_client_menu_cb_stick, ec);
183         e_menu_item_icon_edje_set(mi,
184                                   e_theme_edje_file_get("base/theme/borders",
185                                                         "e/widgets/border/default/stick"),
186                                   "e/widgets/border/default/stick");
187      }
188 
189    if ((!ec->lock_user_shade) && (!ec->fullscreen) && (!ec->maximized) &&
190        e_comp_object_frame_allowed(ec->frame) &&
191        ((!ec->border.name) || (!borderless)))
192      {
193         mi = e_menu_item_new(m);
194         e_menu_item_label_set(mi, _("Shade"));
195         e_menu_item_check_set(mi, 1);
196         e_menu_item_toggle_set(mi, (ec->shaded ? 1 : 0));
197         e_menu_item_callback_set(mi, _e_client_menu_cb_shade, ec);
198         e_menu_item_icon_edje_set(mi,
199                                   e_theme_edje_file_get("base/theme/borders",
200                                                         "e/widgets/border/default/shade"),
201                                   "e/widgets/border/default/shade");
202      }
203 
204    if ((!ec->fullscreen) && (!ec->lock_border) && (!ec->shading) &&
205        (!ec->shaded) && e_comp_object_frame_allowed(ec->frame))
206      {
207         mi = e_menu_item_new(m);
208         e_menu_item_label_set(mi, _("Borderless"));
209         e_menu_item_check_set(mi, 1);
210         e_menu_item_toggle_set(mi, borderless);
211         e_menu_item_callback_set(mi, _e_client_menu_cb_borderless, ec);
212         e_menu_item_icon_edje_set(mi,
213                                   e_theme_edje_file_get("base/theme/borders",
214                                                         "e/widgets/border/default/borderless"),
215                                   "e/widgets/border/default/borderless");
216      }
217 
218    if (e_comp_config_get()->enable_advanced_features)
219      {
220         E_Menu *subm;
221         mi = e_menu_item_new(m);
222         e_menu_item_label_set(mi, _("Composite"));
223         e_util_menu_item_theme_icon_set(mi, "preferences-composite");
224         subm = e_menu_new();
225         e_menu_item_submenu_set(mi, subm);
226         e_object_unref(E_OBJECT(subm));
227         e_object_data_set(E_OBJECT(subm), e_comp);
228         if (e_pixmap_is_x(ec->pixmap) && (e_comp->nocomp_ec != ec))
229           {
230              mi = e_menu_item_new(subm);
231              e_menu_item_check_set(mi, 1);
232              e_menu_item_label_set(mi, _("Unredirected"));
233              e_menu_item_toggle_set(mi, !ec->redirected);
234              e_menu_item_callback_set(mi, _e_client_menu_cb_redirect_set, ec);
235           }
236      }
237 
238    if (!ec->lock_close)
239      {
240         mi = e_menu_item_new(m);
241         e_menu_item_separator_set(mi, 1);
242 
243         mi = e_menu_item_new(m);
244         e_menu_item_label_set(mi, _("Close"));
245         e_menu_item_callback_set(mi, _e_client_menu_cb_close, ec);
246         e_menu_item_icon_edje_set(mi,
247                                   e_theme_edje_file_get("base/theme/borders",
248                                                         "e/widgets/border/default/close"),
249                                   "e/widgets/border/default/close");
250      }
251    EINA_LIST_FOREACH(menu_hooks, l, h)
252      h->cb(h->data, ec);
253 }
254 
255 E_API void
e_int_client_menu_show(E_Client * ec,Evas_Coord x,Evas_Coord y,int key,unsigned int timestamp)256 e_int_client_menu_show(E_Client *ec, Evas_Coord x, Evas_Coord y, int key, unsigned int timestamp)
257 {
258    e_int_client_menu_create(ec);
259    if (key)
260      e_menu_activate_key(ec->border_menu, ec->zone, x, y, 1, 1,
261                          E_MENU_POP_DIRECTION_DOWN);
262    else
263      e_menu_activate_mouse(ec->border_menu, e_zone_current_get(), x, y, 1, 1,
264                            E_MENU_POP_DIRECTION_DOWN, timestamp);
265 }
266 
267 E_API void
e_int_client_menu_del(E_Client * ec)268 e_int_client_menu_del(E_Client *ec)
269 {
270    if (!ec->border_menu) return;
271    e_menu_post_deactivate_callback_set(ec->border_menu, NULL, NULL);
272    E_FREE_FUNC(ec->border_menu, e_object_del);
273    if (ec->cur_mouse_action && eina_streq(ec->cur_mouse_action->name, "window_menu"))
274      E_FREE_FUNC(ec->cur_mouse_action, e_object_unref);
275 }
276 
277 static void
_e_client_cb_border_menu_end(void * data EINA_UNUSED,E_Menu * m)278 _e_client_cb_border_menu_end(void *data EINA_UNUSED, E_Menu *m)
279 {
280    E_Client *ec;
281 
282    ec = e_object_data_get(E_OBJECT(m));
283    if (ec)
284      {
285         /* If the client exists, delete all associated menus */
286         e_int_client_menu_del(ec);
287      }
288    else
289      {
290         /* Just delete this menu */
291         e_object_del(E_OBJECT(m));
292      }
293 }
294 
295 static void
_e_client_menu_cb_locks(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)296 _e_client_menu_cb_locks(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
297 {
298    E_Client *ec;
299 
300    ec = data;
301    if (ec->border_locks_dialog)
302      e_client_activate(e_win_client_get(ec->border_locks_dialog->dia->win), 1);
303    else
304      e_int_client_locks(ec);
305 }
306 
307 static void
_e_client_menu_cb_remember(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)308 _e_client_menu_cb_remember(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
309 {
310    E_Client *ec;
311 
312    ec = data;
313    if (ec->border_remember_dialog)
314      e_client_activate(e_win_client_get(ec->border_remember_dialog->dia->win), 1);
315    else
316      e_int_client_remember(ec);
317 }
318 
319 static void
_e_client_menu_cb_border(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)320 _e_client_menu_cb_border(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
321 {
322    E_Client *ec;
323    char buf[256];
324 
325    ec = data;
326    if (ec->border_border_dialog)
327      e_client_activate(e_win_client_get(ec->border_border_dialog->dia->win), 1);
328    else
329      {
330         snprintf(buf, sizeof(buf), "%p", ec);
331         e_configure_registry_call("internal/borders_border", NULL, buf);
332      }
333 }
334 
335 static void
_e_client_menu_cb_borderless(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)336 _e_client_menu_cb_borderless(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
337 {
338    E_Client *ec = data;
339 
340    EC_CHANGED(ec);
341    ec->border.changed = 1;
342    ec->borderless = mi->toggle;
343 }
344 
345 
346 static void
_e_client_menu_cb_redirect_set(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)347 _e_client_menu_cb_redirect_set(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
348 {
349    e_comp_client_redirect_toggle(data);
350 }
351 
352 static void
_e_client_menu_cb_close(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)353 _e_client_menu_cb_close(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
354 {
355    E_Client *ec;
356 
357    ec = data;
358    if (!ec->lock_close) e_client_act_close_begin(ec);
359 }
360 
361 static void
_e_client_menu_cb_iconify(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)362 _e_client_menu_cb_iconify(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
363 {
364    E_Client *ec;
365 
366    ec = data;
367    if (!ec->lock_user_iconify)
368      {
369         if (ec->iconic)
370           e_client_uniconify(ec);
371         else
372           e_client_iconify(ec);
373      }
374 }
375 
376 static void
_e_client_menu_cb_kill(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)377 _e_client_menu_cb_kill(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
378 {
379    E_Action *a;
380    E_Client *ec;
381 
382    ec = data;
383    if ((ec->lock_close) || (ec->internal)) return;
384 
385    a = e_action_find("window_kill");
386    if ((a) && (a->func.go)) a->func.go(E_OBJECT(ec), NULL);
387 }
388 
389 static void
_e_client_menu_cb_move(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)390 _e_client_menu_cb_move(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
391 {
392    E_Client *ec;
393 
394    ec = data;
395 
396    if (!ec->lock_user_location)
397      e_client_act_move_keyboard(ec);
398 }
399 
400 static void
_e_client_menu_cb_resize(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)401 _e_client_menu_cb_resize(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
402 {
403    E_Client *ec;
404 
405    ec = data;
406 
407    if (!ec->lock_user_size)
408      e_client_act_resize_keyboard(ec);
409 }
410 
411 static void
_e_client_menu_cb_maximize_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)412 _e_client_menu_cb_maximize_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
413 {
414    E_Menu *subm;
415    E_Menu_Item *submi;
416    E_Client *ec;
417 
418    if (!(ec = data)) return;
419 
420    subm = e_menu_new();
421    e_object_data_set(E_OBJECT(subm), ec);
422    e_menu_item_submenu_set(mi, subm);
423    e_object_unref(E_OBJECT(subm));
424 
425    if ((!ec->lock_user_fullscreen) && (!ec->shaded))
426      {
427         submi = e_menu_item_new(subm);
428         e_menu_item_label_set(submi, _("Fullscreen"));
429         e_menu_item_check_set(submi, 1);
430         e_menu_item_toggle_set(submi, ec->fullscreen);
431         e_menu_item_callback_set(submi, _e_client_menu_cb_fullscreen, ec);
432         e_menu_item_icon_edje_set(submi,
433                                   e_theme_edje_file_get("base/theme/borders",
434                                                         "e/widgets/border/default/fullscreen"),
435                                   "e/widgets/border/default/fullscreen");
436      }
437 
438    if (!ec->fullscreen)
439      {
440         submi = e_menu_item_new(subm);
441         e_menu_item_label_set(submi, _("Maximize"));
442         e_menu_item_radio_set(submi, 1);
443         e_menu_item_radio_group_set(submi, 3);
444         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH);
445         e_menu_item_callback_set(submi, _e_client_menu_cb_maximize, ec);
446         e_menu_item_icon_edje_set(submi,
447                                   e_theme_edje_file_get("base/theme/borders",
448                                                         "e/widgets/border/default/maximize"),
449                                   "e/widgets/border/default/maximize");
450 
451         submi = e_menu_item_new(subm);
452         e_menu_item_label_set(submi, _("Maximize Vertically"));
453         e_menu_item_radio_set(submi, 1);
454         e_menu_item_radio_group_set(submi, 3);
455         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL);
456         e_menu_item_callback_set(submi, _e_client_menu_cb_maximize_vertically, ec);
457         e_menu_item_icon_edje_set(submi,
458                                   e_theme_edje_file_get("base/theme/borders",
459                                                         "e/widgets/border/default/maximize"),
460                                   "e/widgets/border/default/maximize");
461 
462         submi = e_menu_item_new(subm);
463         e_menu_item_label_set(submi, _("Maximize Horizontally"));
464         e_menu_item_radio_set(submi, 1);
465         e_menu_item_radio_group_set(submi, 3);
466         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL);
467         e_menu_item_callback_set(submi, _e_client_menu_cb_maximize_horizontally, ec);
468         e_menu_item_icon_edje_set(submi,
469                                   e_theme_edje_file_get("base/theme/borders",
470                                                         "e/widgets/border/default/maximize"),
471                                   "e/widgets/border/default/maximize");
472 
473         submi = e_menu_item_new(subm);
474         e_menu_item_label_set(submi, _("Maximize Left"));
475         e_menu_item_radio_set(submi, 1);
476         e_menu_item_radio_group_set(submi, 3);
477         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_LEFT);
478         e_menu_item_callback_set(submi, _e_client_menu_cb_maximize_left, ec);
479         e_menu_item_icon_edje_set(submi,
480                                   e_theme_edje_file_get("base/theme/borders",
481                                                         "e/widgets/border/default/maximize"),
482                                   "e/widgets/border/default/maximize");
483 
484         submi = e_menu_item_new(subm);
485         e_menu_item_label_set(submi, _("Maximize Right"));
486         e_menu_item_radio_set(submi, 1);
487         e_menu_item_radio_group_set(submi, 3);
488         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_RIGHT);
489         e_menu_item_callback_set(submi, _e_client_menu_cb_maximize_right, ec);
490         e_menu_item_icon_edje_set(submi,
491                                   e_theme_edje_file_get("base/theme/borders",
492                                                         "e/widgets/border/default/maximize"),
493                                   "e/widgets/border/default/maximize");
494 
495         submi = e_menu_item_new(subm);
496         e_menu_item_label_set(submi, _("Unmaximize"));
497         e_menu_item_radio_set(submi, 1);
498         e_menu_item_radio_group_set(submi, 3);
499         e_menu_item_toggle_set(submi, (ec->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE);
500         e_menu_item_callback_set(submi, _e_client_menu_cb_unmaximize, ec);
501         e_menu_item_icon_edje_set(submi,
502                                   e_theme_edje_file_get("base/theme/borders",
503                                                         "e/widgets/border/default/maximize"),
504                                   "e/widgets/border/default/maximize");
505      }
506 }
507 
508 static void
_e_client_menu_cb_maximize(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)509 _e_client_menu_cb_maximize(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
510 {
511    E_Client *ec;
512 
513    ec = data;
514    if (!ec->lock_user_maximize)
515      e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
516                        E_MAXIMIZE_BOTH);
517 }
518 
519 static void
_e_client_menu_cb_maximize_vertically(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)520 _e_client_menu_cb_maximize_vertically(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
521 {
522    E_Client *ec;
523 
524    ec = data;
525    if (!ec->lock_user_maximize)
526      {
527         if ((ec->maximized & E_MAXIMIZE_HORIZONTAL))
528           e_client_unmaximize(ec, E_MAXIMIZE_HORIZONTAL);
529         e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
530                           E_MAXIMIZE_VERTICAL);
531      }
532 }
533 
534 static void
_e_client_menu_cb_maximize_horizontally(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)535 _e_client_menu_cb_maximize_horizontally(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
536 {
537    E_Client *ec;
538 
539    ec = data;
540    if (!ec->lock_user_maximize)
541      {
542         if ((ec->maximized & E_MAXIMIZE_VERTICAL))
543           e_client_unmaximize(ec, E_MAXIMIZE_VERTICAL);
544         e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
545                           E_MAXIMIZE_HORIZONTAL);
546      }
547 }
548 
549 static void
_e_client_menu_cb_maximize_left(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)550 _e_client_menu_cb_maximize_left(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
551 {
552    E_Client *ec;
553 
554    ec = data;
555    if (!ec->lock_user_maximize)
556      {
557         if ((ec->maximized & E_MAXIMIZE_DIRECTION))
558           e_client_unmaximize(ec, ec->maximized & E_MAXIMIZE_DIRECTION);
559         e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
560                           E_MAXIMIZE_LEFT);
561      }
562 }
563 
564 static void
_e_client_menu_cb_maximize_right(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)565 _e_client_menu_cb_maximize_right(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
566 {
567    E_Client *ec;
568 
569    ec = data;
570    if (!ec->lock_user_maximize)
571      {
572         if ((ec->maximized & E_MAXIMIZE_DIRECTION))
573           e_client_unmaximize(ec, ec->maximized & E_MAXIMIZE_DIRECTION);
574         e_client_maximize(ec, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
575                           E_MAXIMIZE_RIGHT);
576      }
577 }
578 
579 static void
_e_client_menu_cb_unmaximize(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)580 _e_client_menu_cb_unmaximize(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
581 {
582    E_Client *ec;
583 
584    ec = data;
585    e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
586 }
587 
588 static void
_e_client_menu_cb_shade(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)589 _e_client_menu_cb_shade(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
590 {
591    E_Client *ec;
592 
593    ec = data;
594    if (!ec->lock_user_shade)
595      {
596         if (ec->shaded)
597           e_client_unshade(ec, ec->shade_dir);
598         else
599           e_client_shade(ec, E_DIRECTION_UP);
600      }
601 }
602 
603 static void
_e_client_menu_cb_resistance(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)604 _e_client_menu_cb_resistance(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
605 {
606    E_Client *ec;
607 
608    ec = data;
609    ec->offer_resistance = !ec->offer_resistance;
610 }
611 
612 static void
_e_client_menu_cb_icon_edit(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)613 _e_client_menu_cb_icon_edit(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
614 {
615    E_Client *ec;
616 
617    ec = data;
618    e_desktop_client_edit(ec);
619 }
620 #if 0
621 static void
622 _e_client_menu_cb_colors_edit_moveresize(E_Client *ec, ...)
623 {
624    evas_object_geometry_set(ec->color_editor, ec->client.x, ec->client.y, ec->client.w, ec->client.h);
625    e_comp_shape_queue();
626 }
627 
628 static void
629 _e_client_menu_cb_colors_edit_del(void *data, ...)
630 {
631    E_Client *ec = data;
632 
633    E_FREE_FUNC(ec->color_editor, evas_object_del);
634    evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_MOVE, (Evas_Object_Event_Cb)_e_client_menu_cb_colors_edit_moveresize, ec);
635    evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_RESIZE, (Evas_Object_Event_Cb)_e_client_menu_cb_colors_edit_moveresize, ec);
636    e_client_comp_hidden_set(ec, 0);
637    e_comp_ungrab_input(1, 1);
638    e_comp_shape_queue();
639 }
640 
641 static void
642 _e_client_menu_cb_colors_edit(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
643 {
644    Evas_Object *o;
645    E_Client *ec = data;
646 
647    ec->color_editor = o = elm_color_class_editor_add(e_comp->elm, e_client_util_win_get(data));
648    if (!o) return;
649    e_comp_shape_queue();
650    evas_object_geometry_set(o, ec->client.x, ec->client.y, ec->client.w, ec->client.h);
651    evas_object_layer_set(o, E_LAYER_POPUP);
652    evas_object_show(o);
653    e_client_comp_hidden_set(ec, 1);
654    e_comp_grab_input(1, 1);
655    evas_object_smart_callback_add(o, "application_closed", (Evas_Smart_Cb)_e_client_menu_cb_colors_edit_del, ec);
656    evas_object_smart_callback_add(o, "dismissed", (Evas_Smart_Cb)_e_client_menu_cb_colors_edit_del, ec);
657    evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, (Evas_Object_Event_Cb)_e_client_menu_cb_colors_edit_del, ec);
658    evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_MOVE, (Evas_Object_Event_Cb)_e_client_menu_cb_colors_edit_moveresize, ec);
659    evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_RESIZE, (Evas_Object_Event_Cb)_e_client_menu_cb_colors_edit_moveresize, ec);
660 }
661 #endif
662 static void
_e_client_menu_cb_application_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)663 _e_client_menu_cb_application_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
664 {
665    E_Menu *subm;
666    E_Menu_Item *submi;
667    E_Client *ec;
668 
669    if (!(ec = data)) return;
670 
671    subm = e_menu_new();
672    e_object_data_set(E_OBJECT(subm), ec);
673    e_menu_item_submenu_set(mi, subm);
674    e_object_unref(E_OBJECT(subm));
675 
676    if (ec->desktop)
677      {
678         submi = e_menu_item_new(subm);
679         e_menu_item_label_set(submi, _("Edit Icon"));
680         e_menu_item_callback_set(submi, _e_client_menu_cb_icon_edit, ec);
681         e_util_desktop_menu_item_icon_add(ec->desktop, 16, submi);
682      }
683    else if (ec->icccm.class)
684      {
685         /* icons with no class useless to borders */
686         submi = e_menu_item_new(subm);
687         e_menu_item_label_set(submi, _("Create Icon"));
688         e_menu_item_callback_set(submi, _e_client_menu_cb_icon_edit, ec);
689      }
690 
691    submi = e_menu_item_new(subm);
692    e_menu_item_separator_set(submi, 1);
693 
694    submi = e_menu_item_new(subm);
695    e_menu_item_label_set(submi, _("Add to Favorites Menu"));
696    e_menu_item_callback_set(submi, _e_client_menu_cb_fav_add, ec);
697    e_util_menu_item_theme_icon_set(submi, "user-bookmarks");
698 
699    submi = e_menu_item_new(subm);
700    e_menu_item_label_set(submi, _("Add to IBar"));
701    e_menu_item_submenu_pre_callback_set(submi,
702                                         _e_client_menu_cb_ibar_add_pre, ec);
703    e_util_menu_item_theme_icon_set(submi, "preferences-applications-ibar");
704 
705    if (e_configure_registry_exists("keyboard_and_mouse/key_bindings"))
706      {
707         submi = e_menu_item_new(subm);
708         e_menu_item_label_set(submi, _("Create Keyboard Shortcut"));
709         e_menu_item_callback_set(submi, _e_client_menu_cb_kbdshrtct_add, ec);
710         e_util_menu_item_theme_icon_set(submi, "preferences-desktop-keyboard");
711      }
712 #if 0
713    if (ec->color_editor || (!e_pixmap_is_x(ec->pixmap))) return;
714    submi = e_menu_item_new(subm);
715    e_menu_item_label_set(submi, _("Edit Color Scheme"));
716    e_menu_item_callback_set(submi, _e_client_menu_cb_colors_edit, ec);
717    e_util_menu_item_theme_icon_set(submi, "preferences-desktop-color");
718 #endif
719 }
720 
721 static void
_e_client_menu_cb_window_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)722 _e_client_menu_cb_window_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
723 {
724    E_Menu *subm;
725    E_Menu_Item *submi;
726    E_Client *ec;
727    Eina_Bool resize = EINA_FALSE;
728 
729    if (!(ec = data)) return;
730 
731    subm = e_menu_new();
732    e_object_data_set(E_OBJECT(subm), ec);
733    e_menu_item_submenu_set(mi, subm);
734    e_object_unref(E_OBJECT(subm));
735 
736    /* internal dialog which is resizable */
737    if (ec->internal && (ec->netwm.type == E_WINDOW_TYPE_DIALOG))
738      resize = (ec->icccm.max_w != ec->icccm.min_w);
739    if (resize || (ec->netwm.type == E_WINDOW_TYPE_NORMAL) ||
740        (ec->netwm.type == E_WINDOW_TYPE_UNKNOWN))
741      {
742         if (!(((ec->icccm.min_w == ec->icccm.max_w) &&
743                (ec->icccm.min_h == ec->icccm.max_h)) ||
744               (ec->lock_user_maximize)))
745           {
746              if ((!ec->lock_user_maximize) && (!ec->shaded))
747                {
748                   submi = e_menu_item_new(subm);
749                   e_menu_item_label_set(submi, _("Maximize"));
750                   e_menu_item_submenu_pre_callback_set(submi, _e_client_menu_cb_maximize_pre, ec);
751                   e_menu_item_icon_edje_set(submi,
752                                             e_theme_edje_file_get("base/theme/borders",
753                                                                   "e/widgets/border/default/maximize"),
754                                             "e/widgets/border/default/maximize");
755                }
756           }
757 
758         if ((!ec->lock_user_iconify) && (!ec->fullscreen))
759           {
760              submi = e_menu_item_new(subm);
761              e_menu_item_label_set(submi, _("Iconify"));
762              e_menu_item_callback_set(submi, _e_client_menu_cb_iconify, ec);
763              e_menu_item_icon_edje_set(submi,
764                                        e_theme_edje_file_get("base/theme/borders",
765                                                              "e/widgets/border/default/minimize"),
766                                        "e/widgets/border/default/minimize");
767           }
768      }
769 
770    if ((!ec->lock_user_location) && (!ec->fullscreen) &&
771        (((ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip))
772      {
773         submi = e_menu_item_new(subm);
774         e_menu_item_label_set(submi, _("Move with keyboard"));
775         e_menu_item_callback_set(submi, _e_client_menu_cb_move, ec);
776         e_menu_item_icon_edje_set(submi,
777                                   e_theme_edje_file_get("base/theme/borders",
778                                                         "e/widgets/border/default/move_icon"),
779                                   "e/widgets/border/default/move_icon");
780      }
781 
782    if (((!ec->lock_user_size) && (!ec->fullscreen) &&
783         (((ec->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip)) &&
784        ((ec->netwm.type == E_WINDOW_TYPE_NORMAL) ||
785         (ec->netwm.type == E_WINDOW_TYPE_UNKNOWN)))
786      {
787         submi = e_menu_item_new(subm);
788         e_menu_item_label_set(submi, _("Resize with keyboard"));
789         e_menu_item_callback_set(submi, _e_client_menu_cb_resize, ec);
790         e_menu_item_icon_edje_set(submi,
791                                   e_theme_edje_file_get("base/theme/borders",
792                                                         "e/widgets/border/default/resize_icon"),
793                                   "e/widgets/border/default/resize_icon");
794      }
795 
796    submi = e_menu_item_new(subm);
797    e_menu_item_separator_set(submi, 1);
798 
799    if ((!ec->lock_user_stacking) && (!ec->fullscreen) && (ec->layer <= E_LAYER_CLIENT_ABOVE))
800      {
801         submi = e_menu_item_new(subm);
802         e_menu_item_label_set(submi, _("Stacking"));
803         e_menu_item_submenu_pre_callback_set(submi, _e_client_menu_cb_stacking_pre, ec);
804         e_menu_item_icon_edje_set(submi,
805                                   e_theme_edje_file_get("base/theme/borders",
806                                                         "e/widgets/border/default/stacking"),
807                                   "e/widgets/border/default/stacking");
808      }
809 
810    submi = e_menu_item_new(subm);
811    e_menu_item_label_set(submi, _("Skip"));
812    e_menu_item_submenu_pre_callback_set(submi, _e_client_menu_cb_skip_pre, ec);
813    e_menu_item_icon_edje_set(submi,
814                              e_theme_edje_file_get("base/theme/borders",
815                                                    "e/widgets/border/default/skip"),
816                              "e/widgets/border/default/skip");
817 
818    if ((!ec->lock_border) && (!ec->mwm.borderless))
819      {
820         submi = e_menu_item_new(subm);
821         e_menu_item_label_set(submi, _("Border"));
822         e_menu_item_submenu_pre_callback_set(submi, _e_client_menu_cb_border_pre, ec);
823         e_menu_item_icon_edje_set(submi,
824                                   e_theme_edje_file_get("base/theme/borders",
825                                                         "e/widgets/border/default/borderless"),
826                                   "e/widgets/border/default/borderless");
827      }
828 
829    submi = e_menu_item_new(subm);
830    e_menu_item_separator_set(submi, 1);
831 
832    submi = e_menu_item_new(subm);
833    e_menu_item_label_set(submi, _("Locks"));
834    e_menu_item_callback_set(submi, _e_client_menu_cb_locks, ec);
835    e_menu_item_icon_edje_set(submi,
836                              e_theme_edje_file_get("base/theme/borders",
837                                                    "e/widgets/border/default/locks"),
838                              "e/widgets/border/default/locks");
839 
840    submi = e_menu_item_new(subm);
841    e_menu_item_label_set(submi, _("Remember"));
842    e_menu_item_callback_set(submi, _e_client_menu_cb_remember, ec);
843    e_menu_item_icon_edje_set(submi,
844                              e_theme_edje_file_get("base/theme/borders",
845                                                    "e/widgets/border/default/remember"),
846                              "e/widgets/border/default/remember");
847 
848    submi = e_menu_item_new(subm);
849    e_menu_item_separator_set(submi, 1);
850 
851    if ((!ec->internal) && (!ec->lock_close))
852      {
853         submi = e_menu_item_new(subm);
854         e_menu_item_label_set(submi, _("Kill"));
855         e_menu_item_callback_set(submi, _e_client_menu_cb_kill, ec);
856         e_menu_item_icon_edje_set(submi,
857                                   e_theme_edje_file_get("base/theme/borders",
858                                                         "e/widgets/border/default/kill"),
859                                   "e/widgets/border/default/kill");
860      }
861 
862    submi = e_menu_item_new(subm);
863    e_menu_item_label_set(submi, _("ICCCM/NetWM"));
864    e_menu_item_callback_set(submi, _e_client_menu_cb_prop, ec);
865    e_menu_item_icon_edje_set(submi,
866                              e_theme_edje_file_get("base/theme/borders",
867                                                    "e/widgets/border/default/properties"),
868                              "e/widgets/border/default/properties");
869 }
870 
871 static void
_e_client_menu_cb_prop(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)872 _e_client_menu_cb_prop(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
873 {
874    E_Client *ec;
875 
876    ec = data;
877    e_int_client_prop(ec);
878 }
879 
880 static void
_e_client_menu_cb_stick(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)881 _e_client_menu_cb_stick(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
882 {
883    E_Client *ec;
884 
885    ec = data;
886    if (!ec->lock_user_sticky)
887      {
888         if (ec->sticky)
889           e_client_unstick(ec);
890         else
891           e_client_stick(ec);
892      }
893 }
894 
895 static void
_e_client_menu_cb_on_top(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)896 _e_client_menu_cb_on_top(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
897 {
898    E_Client *ec;
899 
900    ec = data;
901    if (ec->layer != E_LAYER_CLIENT_ABOVE)
902      evas_object_layer_set(ec->frame, E_LAYER_CLIENT_ABOVE);
903 }
904 
905 static void
_e_client_menu_cb_below(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)906 _e_client_menu_cb_below(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
907 {
908    E_Client *ec;
909 
910    ec = data;
911    if (ec->layer != E_LAYER_CLIENT_BELOW)
912      evas_object_layer_set(ec->frame, E_LAYER_CLIENT_BELOW);
913 }
914 
915 static void
_e_client_menu_cb_normal(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)916 _e_client_menu_cb_normal(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
917 {
918    E_Client *ec;
919 
920    ec = data;
921    if (ec->layer != E_LAYER_CLIENT_NORMAL)
922      evas_object_layer_set(ec->frame, E_LAYER_CLIENT_NORMAL);
923 }
924 
925 static void
_e_client_menu_cb_fullscreen(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)926 _e_client_menu_cb_fullscreen(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
927 {
928    E_Client *ec;
929    int toggle;
930 
931    if (!(ec = data)) return;
932 
933    if (!ec->lock_user_fullscreen)
934      {
935         toggle = e_menu_item_toggle_get(mi);
936         if (toggle)
937           e_client_fullscreen(ec, e_config->fullscreen_policy);
938         else
939           e_client_unfullscreen(ec);
940      }
941 }
942 
943 static void
_e_client_menu_cb_skip_winlist(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)944 _e_client_menu_cb_skip_winlist(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
945 {
946    E_Client *ec;
947 
948    if (!(ec = data)) return;
949 
950    if (((ec->icccm.accepts_focus) || (ec->icccm.take_focus)) &&
951        (!ec->netwm.state.skip_taskbar))
952      {
953         ec->user_skip_winlist = e_menu_item_toggle_get(mi);
954         e_client_prop_misc_changed(ec);
955      }
956    else
957      ec->user_skip_winlist = 0;
958    EC_CHANGED(ec);
959    e_remember_update(ec);
960 }
961 
962 static void
_e_client_menu_cb_skip_pager(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)963 _e_client_menu_cb_skip_pager(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
964 {
965    E_Client *ec;
966 
967    if (!(ec = data)) return;
968 
969    if ((ec->icccm.accepts_focus) || (ec->icccm.take_focus))
970      {
971         ec->netwm.state.skip_pager = e_menu_item_toggle_get(mi);
972         e_client_prop_misc_changed(ec);
973      }
974    else
975      ec->netwm.state.skip_pager = 0;
976    EC_CHANGED(ec);
977    e_remember_update(ec);
978 }
979 
980 static void
_e_client_menu_cb_skip_taskbar(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)981 _e_client_menu_cb_skip_taskbar(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
982 {
983    E_Client *ec;
984 
985    if (!(ec = data)) return;
986 
987    if ((ec->icccm.accepts_focus) || (ec->icccm.take_focus))
988      {
989         ec->netwm.state.skip_taskbar = e_menu_item_toggle_get(mi);
990         e_client_prop_misc_changed(ec);
991      }
992    else
993      ec->netwm.state.skip_taskbar = 0;
994    EC_CHANGED(ec);
995    e_remember_update(ec);
996 }
997 
998 #ifndef DESKMIRROR_TEST
999  static void
_e_client_menu_cb_sendto_icon_pre(void * data,E_Menu * m,E_Menu_Item * mi)1000 _e_client_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi)
1001 {
1002    E_Desk *desk = NULL;
1003    Evas_Object *o = NULL;
1004    const char *bgfile = NULL;
1005    int tw = 0, th = 0;
1006 
1007    desk = data;
1008    E_OBJECT_CHECK(desk);
1009 
1010    tw = 50;
1011    th = (tw * desk->zone->h) / desk->zone->w;
1012    bgfile = e_bg_file_get(desk->zone->num,
1013                           desk->x, desk->y);
1014    o = e_thumb_icon_add(m->evas);
1015    e_thumb_icon_file_set(o, bgfile, "e/desktop/background");
1016    eina_stringshare_del(bgfile);
1017    e_thumb_icon_size_set(o, tw, th);
1018    e_thumb_icon_begin(o);
1019    mi->icon_object = o;
1020 }
1021 #endif
1022 
1023 static void
_e_client_menu_cb_align_setup(E_Client * ec,Evas_Object_Event_Cb cb)1024 _e_client_menu_cb_align_setup(E_Client *ec, Evas_Object_Event_Cb cb)
1025 {
1026    E_Notification_Notify n;
1027    Evas_Object *o;
1028 
1029    memset(&n, 0, sizeof(E_Notification_Notify));
1030    n.timeout = 3000;
1031    n.summary = _("Alignment");
1032    n.body = _("Click an object to align with.");
1033    n.urgency = E_NOTIFICATION_NOTIFY_URGENCY_NORMAL;
1034    e_notification_client_send(&n, NULL, NULL);
1035 
1036    o = evas_object_rectangle_add(e_comp->evas);
1037    evas_object_resize(o, e_comp->w, e_comp->h);
1038    evas_object_color_set(o, 0, 0, 0, 0);
1039    evas_object_layer_set(o, E_LAYER_POPUP);
1040    evas_object_show(o);
1041    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, cb, ec);
1042    e_comp_shape_queue();
1043 }
1044 
1045 static Evas_Object *
_e_client_menu_cb_align_cb(Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1046 _e_client_menu_cb_align_cb(Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1047 {
1048    evas_object_hide(obj);
1049    evas_object_del(obj);
1050    e_comp_shape_queue();
1051    return evas_object_top_at_xy_get(e, ev->output.x, ev->output.y, 0, 0);
1052 }
1053 
1054 static void
_e_client_menu_cb_align_on_center(E_Client * ec,Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1055 _e_client_menu_cb_align_on_center(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1056 {
1057    Evas_Object *o;
1058 
1059    o = _e_client_menu_cb_align_cb(e, obj, ev);
1060    e_comp_object_util_center_on(ec->frame, o);
1061 }
1062 
1063 static void
_e_client_menu_cb_align_center(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1064 _e_client_menu_cb_align_center(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1065 {
1066    E_Client *ec = e_object_data_get(E_OBJECT(m));
1067 
1068    if (data)
1069      _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_center);
1070    else
1071      e_comp_object_util_center(ec->frame);
1072 }
1073 
1074 static void
_e_client_menu_cb_align_on_top(E_Client * ec,Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1075 _e_client_menu_cb_align_on_top(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1076 {
1077    Evas_Object *o;
1078    int y;
1079 
1080    o = _e_client_menu_cb_align_cb(e, obj, ev);
1081    evas_object_geometry_get(o, NULL, &y, NULL, NULL);
1082    evas_object_move(ec->frame, ec->x, y);
1083 }
1084 
1085 static void
_e_client_menu_cb_align_top(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1086 _e_client_menu_cb_align_top(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1087 {
1088    E_Client *ec = e_object_data_get(E_OBJECT(m));
1089 
1090    if (data)
1091      _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_top);
1092    else
1093      {
1094         int y;
1095 
1096         e_zone_useful_geometry_get(ec->zone, NULL, &y, NULL, NULL);
1097         evas_object_move(ec->frame, ec->x, y);
1098      }
1099 }
1100 
1101 static void
_e_client_menu_cb_align_on_left(E_Client * ec,Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1102 _e_client_menu_cb_align_on_left(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1103 {
1104    Evas_Object *o;
1105    int x;
1106 
1107    o = _e_client_menu_cb_align_cb(e, obj, ev);
1108    evas_object_geometry_get(o, &x, NULL, NULL, NULL);
1109    evas_object_move(ec->frame, x, ec->y);
1110 }
1111 
1112 static void
_e_client_menu_cb_align_left(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1113 _e_client_menu_cb_align_left(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1114 {
1115    E_Client *ec = e_object_data_get(E_OBJECT(m));
1116 
1117    if (data)
1118      _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_left);
1119    else
1120      {
1121         int x;
1122 
1123         e_zone_useful_geometry_get(ec->zone, &x, NULL, NULL, NULL);
1124         evas_object_move(ec->frame, x, ec->y);
1125      }
1126 }
1127 
1128 static void
_e_client_menu_cb_align_on_right(E_Client * ec,Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1129 _e_client_menu_cb_align_on_right(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1130 {
1131    Evas_Object *o;
1132    int x, w;
1133 
1134    o = _e_client_menu_cb_align_cb(e, obj, ev);
1135    evas_object_geometry_get(o, &x, NULL, &w, NULL);
1136    evas_object_move(ec->frame, x + w - ec->w, ec->y);
1137 }
1138 
1139 static void
_e_client_menu_cb_align_right(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1140 _e_client_menu_cb_align_right(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1141 {
1142    E_Client *ec = e_object_data_get(E_OBJECT(m));
1143 
1144    if (data)
1145      _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_right);
1146    else
1147      {
1148         int x, w;
1149 
1150         e_zone_useful_geometry_get(ec->zone, &x, NULL, &w, NULL);
1151         evas_object_move(ec->frame, x + w - ec->w, ec->y);
1152      }
1153 }
1154 
1155 static void
_e_client_menu_cb_align_on_bottom(E_Client * ec,Evas * e,Evas_Object * obj,Evas_Event_Mouse_Down * ev)1156 _e_client_menu_cb_align_on_bottom(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
1157 {
1158    Evas_Object *o;
1159    int y, h;
1160 
1161    o = _e_client_menu_cb_align_cb(e, obj, ev);
1162    evas_object_geometry_get(o, NULL, &y, NULL, &h);
1163    evas_object_move(ec->frame, ec->x, y + h - ec->h);
1164 }
1165 
1166 static void
_e_client_menu_cb_align_bottom(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1167 _e_client_menu_cb_align_bottom(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1168 {
1169    E_Client *ec = e_object_data_get(E_OBJECT(m));
1170 
1171    if (data)
1172      _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_bottom);
1173    else
1174      {
1175         int y, h;
1176 
1177         e_zone_useful_geometry_get(ec->zone, NULL, &y, NULL, &h);
1178         evas_object_move(ec->frame, ec->x, y + h - ec->h);
1179      }
1180 }
1181 
1182 static void
_e_client_menu_cb_align_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1183 _e_client_menu_cb_align_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1184 {
1185    E_Menu *subm, *mm;
1186    E_Menu_Item *submi;
1187    E_Client *ec = data;
1188 
1189    subm = e_menu_new();
1190    e_menu_title_set(subm, _("Alignment"));
1191    e_object_data_set(E_OBJECT(subm), ec);
1192    e_menu_item_submenu_set(mi, subm);
1193    e_object_unref(E_OBJECT(subm));
1194 
1195    submi = e_menu_item_new(subm);
1196    e_menu_item_label_set(submi, _("Center"));
1197    e_menu_item_callback_set(submi, _e_client_menu_cb_align_center, NULL);
1198    mm = e_menu_new();
1199    e_object_data_set(E_OBJECT(mm), ec);
1200    e_menu_item_submenu_set(submi, mm);
1201    e_object_unref(E_OBJECT(mm));
1202    submi = e_menu_item_new(mm);
1203    e_menu_item_label_set(submi, _("On window..."));
1204    e_menu_item_callback_set(submi, _e_client_menu_cb_align_center, (void*)1);
1205 
1206    submi = e_menu_item_new(subm);
1207    e_menu_item_label_set(submi, _("Top"));
1208    e_menu_item_callback_set(submi, _e_client_menu_cb_align_top, NULL);
1209    mm = e_menu_new();
1210    e_object_data_set(E_OBJECT(mm), ec);
1211    e_menu_item_submenu_set(submi, mm);
1212    e_object_unref(E_OBJECT(mm));
1213    submi = e_menu_item_new(mm);
1214    e_menu_item_label_set(submi, _("Of window..."));
1215    e_menu_item_callback_set(submi, _e_client_menu_cb_align_top, (void*)1);
1216 
1217    submi = e_menu_item_new(subm);
1218    e_menu_item_label_set(submi, _("Left"));
1219    e_menu_item_callback_set(submi, _e_client_menu_cb_align_left, NULL);
1220    mm = e_menu_new();
1221    e_object_data_set(E_OBJECT(mm), ec);
1222    e_menu_item_submenu_set(submi, mm);
1223    e_object_unref(E_OBJECT(mm));
1224    submi = e_menu_item_new(mm);
1225    e_menu_item_label_set(submi, _("Of window..."));
1226    e_menu_item_callback_set(submi, _e_client_menu_cb_align_left, (void*)1);
1227 
1228    submi = e_menu_item_new(subm);
1229    e_menu_item_label_set(submi, _("Right"));
1230    e_menu_item_callback_set(submi, _e_client_menu_cb_align_right, NULL);
1231    mm = e_menu_new();
1232    e_object_data_set(E_OBJECT(mm), ec);
1233    e_menu_item_submenu_set(submi, mm);
1234    e_object_unref(E_OBJECT(mm));
1235    submi = e_menu_item_new(mm);
1236    e_menu_item_label_set(submi, _("Of window..."));
1237    e_menu_item_callback_set(submi, _e_client_menu_cb_align_right, (void*)1);
1238 
1239    submi = e_menu_item_new(subm);
1240    e_menu_item_label_set(submi, _("Bottom"));
1241    e_menu_item_callback_set(submi, _e_client_menu_cb_align_bottom, NULL);
1242    mm = e_menu_new();
1243    e_object_data_set(E_OBJECT(mm), ec);
1244    e_menu_item_submenu_set(submi, mm);
1245    e_object_unref(E_OBJECT(mm));
1246    submi = e_menu_item_new(mm);
1247    e_menu_item_label_set(submi, _("Of window..."));
1248    e_menu_item_callback_set(submi, _e_client_menu_cb_align_bottom, (void*)1);
1249 }
1250 
1251 static void
_e_client_menu_cb_sendto_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1252 _e_client_menu_cb_sendto_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1253 {
1254    E_Menu *subm;
1255    E_Menu_Item *submi;
1256    E_Client *ec;
1257    E_Zone *zone;
1258    Eina_List *l = NULL;
1259    char buf[128];
1260    int zones, i;
1261 
1262    ec = data;
1263    zones = eina_list_count(e_comp->zones);
1264 
1265    subm = e_menu_new();
1266    e_object_data_set(E_OBJECT(subm), ec);
1267    e_menu_item_submenu_set(mi, subm);
1268    e_object_unref(E_OBJECT(subm));
1269 
1270    EINA_LIST_FOREACH(e_comp->zones, l, zone)
1271      {
1272         if (zones > 1)
1273           {
1274              snprintf(buf, sizeof(buf), _("Screen %d"), zone->num);
1275              submi = e_menu_item_new(subm);
1276              e_menu_item_label_set(submi, buf);
1277              e_menu_item_disabled_set(submi, EINA_TRUE);
1278           }
1279 
1280         for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++)
1281           {
1282              E_Desk *desk;
1283 #ifdef DESKMIRROR_TEST
1284              int tw = 50, th;
1285 #endif
1286              desk = zone->desks[i];
1287 #ifdef DESKMIRROR_TEST
1288              th = (tw * desk->zone->h) / desk->zone->w;
1289 #endif
1290              submi = e_menu_item_new(subm);
1291              e_menu_item_label_set(submi, desk->name);
1292              e_menu_item_radio_set(submi, 1);
1293              e_menu_item_radio_group_set(submi, 2);
1294 #ifdef DESKMIRROR_TEST
1295              e_menu_item_icon_file_set(submi, "sup");
1296 #endif
1297              if ((ec->zone == zone) && (!ec->iconic) && (ec->desk == desk))
1298                e_menu_item_toggle_set(submi, 1);
1299              else
1300                e_menu_item_callback_set(submi, _e_client_menu_cb_sendto, desk);
1301 #ifdef DESKMIRROR_TEST
1302              submi->icon_object = e_deskmirror_add(desk, 0, 0);
1303              evas_object_size_hint_min_set(submi->icon_object, tw, th);
1304              evas_object_show(submi->icon_object);
1305 #else
1306              e_menu_item_realize_callback_set(submi, _e_client_menu_cb_sendto_icon_pre,
1307                                               desk);
1308 #endif
1309           }
1310      }
1311 }
1312 
1313 static void
_e_client_menu_cb_sendto(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1314 _e_client_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1315 {
1316    E_Desk *desk;
1317    E_Client *ec;
1318 
1319    desk = data;
1320    ec = e_object_data_get(E_OBJECT(m));
1321    if ((ec) && (desk) && (ec->desk != desk))
1322      {
1323         E_Desk *old_desk = ec->desk;
1324         Eina_Bool was_focused = e_client_stack_focused_get(ec);
1325 
1326         ec->hidden = 0;
1327         e_client_desk_set(ec, desk);
1328         if (was_focused)
1329           e_desk_last_focused_focus(old_desk);
1330      }
1331 }
1332 
1333 static void
_e_client_menu_cb_pin(void * data EINA_UNUSED,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1334 _e_client_menu_cb_pin(void *data EINA_UNUSED, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1335 {
1336    E_Client *ec;
1337 
1338    ec = e_object_data_get(E_OBJECT(m));
1339    if (ec) e_client_pinned_set(ec, 1);
1340 }
1341 
1342 static void
_e_client_menu_cb_unpin(void * data EINA_UNUSED,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1343 _e_client_menu_cb_unpin(void *data EINA_UNUSED, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1344 {
1345    E_Client *ec;
1346 
1347    ec = e_object_data_get(E_OBJECT(m));
1348    if (ec) e_client_pinned_set(ec, 0);
1349 }
1350 
1351 static void
_e_client_menu_cb_stacking_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1352 _e_client_menu_cb_stacking_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1353 {
1354    E_Menu *subm;
1355    E_Menu_Item *submi;
1356    E_Client *ec;
1357 
1358    if (!(ec = data)) return;
1359 
1360    subm = e_menu_new();
1361    e_object_data_set(E_OBJECT(subm), ec);
1362    e_menu_item_submenu_set(mi, subm);
1363    e_object_unref(E_OBJECT(subm));
1364 
1365    /* Only allow to change layer for windows in "normal" layers */
1366    e_menu_category_set(subm, "border/stacking");
1367    e_menu_category_data_set("border/stacking", ec);
1368 
1369    submi = e_menu_item_new(subm);
1370    e_menu_item_label_set(submi, _("Always on Top"));
1371    e_menu_item_radio_set(submi, 1);
1372    e_menu_item_radio_group_set(submi, 2);
1373    e_menu_item_toggle_set(submi, (ec->layer == E_LAYER_CLIENT_ABOVE ? 1 : 0));
1374    e_menu_item_callback_set(submi, _e_client_menu_cb_on_top, ec);
1375    e_menu_item_icon_edje_set(submi,
1376                              e_theme_edje_file_get("base/theme/borders",
1377                                                    "e/widgets/border/default/stack_on_top"),
1378                              "e/widgets/border/default/stack_on_top");
1379 
1380    submi = e_menu_item_new(subm);
1381    e_menu_item_label_set(submi, _("Normal"));
1382    e_menu_item_radio_set(submi, 1);
1383    e_menu_item_radio_group_set(submi, 2);
1384    e_menu_item_toggle_set(submi, (ec->layer == E_LAYER_CLIENT_NORMAL ? 1 : 0));
1385    e_menu_item_callback_set(submi, _e_client_menu_cb_normal, ec);
1386    e_menu_item_icon_edje_set(submi,
1387                              e_theme_edje_file_get("base/theme/borders",
1388                                                    "e/widgets/border/default/stack_normal"),
1389                              "e/widgets/border/default/stack_normal");
1390 
1391    submi = e_menu_item_new(subm);
1392    e_menu_item_label_set(submi, _("Always Below"));
1393    e_menu_item_radio_set(submi, 1);
1394    e_menu_item_radio_group_set(submi, 2);
1395    e_menu_item_toggle_set(submi, (ec->layer == E_LAYER_CLIENT_BELOW ? 1 : 0));
1396    e_menu_item_callback_set(submi, _e_client_menu_cb_below, ec);
1397    e_menu_item_icon_edje_set(submi,
1398                              e_theme_edje_file_get("base/theme/borders",
1399                                                    "e/widgets/border/default/stack_below"),
1400                              "e/widgets/border/default/stack_below");
1401 
1402    // Only allow to change layer for windows in "normal" layers
1403    if ((!ec->lock_user_stacking) &&
1404        ((ec->layer == 50) || (ec->layer == 100) || (ec->layer == 150)))
1405      {
1406         submi = e_menu_item_new(subm);
1407         e_menu_item_separator_set(submi, 1);
1408 
1409         submi = e_menu_item_new(subm);
1410         e_menu_item_label_set(submi, _("Raise"));
1411         e_menu_item_callback_set(submi, _e_client_menu_cb_raise, ec);
1412         e_menu_item_icon_edje_set(submi,
1413                                   e_theme_edje_file_get("base/theme/borders",
1414                                                         "e/widgets/border/default/stack_on_top"),
1415                                   "e/widgets/border/default/stack_on_top");
1416 
1417         submi = e_menu_item_new(subm);
1418         e_menu_item_label_set(submi, _("Lower"));
1419         e_menu_item_callback_set(submi, _e_client_menu_cb_lower, ec);
1420         e_menu_item_icon_edje_set(submi,
1421                                   e_theme_edje_file_get("base/theme/borders",
1422                                                         "e/widgets/border/default/stack_below"),
1423                                   "e/widgets/border/default/stack_below");
1424      }
1425 
1426    submi = e_menu_item_new(subm);
1427    e_menu_item_separator_set(submi, 1);
1428 
1429    if ((ec->netwm.type == E_WINDOW_TYPE_NORMAL) ||
1430        (ec->netwm.type == E_WINDOW_TYPE_UNKNOWN))
1431      {
1432         if ((ec->netwm.state.stacking != E_STACKING_BELOW) ||
1433             (!ec->user_skip_winlist) || (!ec->borderless))
1434           {
1435              submi = e_menu_item_new(subm);
1436              e_menu_item_label_set(submi, _("Pin to Desktop"));
1437              e_menu_item_callback_set(submi, _e_client_menu_cb_pin, ec);
1438              e_menu_item_icon_edje_set(submi,
1439                                        e_theme_edje_file_get("base/theme/borders",
1440                                                              "e/widgets/border/default/stick"),
1441                                        "e/widgets/border/default/stick");
1442           }
1443         if ((ec->netwm.state.stacking == E_STACKING_BELOW) &&
1444             (ec->user_skip_winlist) && (ec->borderless))
1445           {
1446              submi = e_menu_item_new(subm);
1447              e_menu_item_label_set(submi, _("Unpin from Desktop"));
1448              e_menu_item_callback_set(submi, _e_client_menu_cb_unpin, ec);
1449              e_menu_item_icon_edje_set(submi,
1450                                        e_theme_edje_file_get("base/theme/borders",
1451                                                              "e/widgets/border/default/stick"),
1452                                        "e/widgets/border/default/stick");
1453           }
1454      }
1455 }
1456 
1457 static void
_e_client_menu_cb_raise(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1458 _e_client_menu_cb_raise(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1459 {
1460    E_Client *ec = data;
1461 
1462    if ((!ec->lock_user_stacking) && (!ec->internal) &&
1463        ((ec->layer >= E_LAYER_CLIENT_DESKTOP) && (ec->layer <= E_LAYER_CLIENT_NORMAL)))
1464      {
1465         evas_object_raise(ec->frame);
1466      }
1467 }
1468 
1469 static void
_e_client_menu_cb_lower(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1470 _e_client_menu_cb_lower(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1471 {
1472    E_Client *ec = data;
1473 
1474    if ((!ec->lock_user_stacking) && (!ec->internal) &&
1475        ((ec->layer >= E_LAYER_CLIENT_DESKTOP) && (ec->layer <= E_LAYER_CLIENT_NORMAL)))
1476      {
1477         evas_object_lower(ec->frame);
1478      }
1479 }
1480 
1481 static void
_e_client_menu_cb_default_icon(void * data,E_Menu * m,E_Menu_Item * mi)1482 _e_client_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1483 {
1484    E_Client *ec;
1485    Evas_Object *o;
1486    unsigned char prev_icon_pref;
1487 
1488    ec = data;
1489    E_OBJECT_CHECK(ec);
1490 
1491    prev_icon_pref = ec->icon_preference;
1492    ec->icon_preference = E_ICON_PREF_E_DEFAULT;
1493    o = e_client_icon_add(ec, m->evas);
1494    ec->icon_preference = prev_icon_pref;
1495    mi->icon_object = o;
1496 }
1497 #ifndef HAVE_WAYLAND_ONLY
1498 static void
_e_client_menu_cb_netwm_icon(void * data,E_Menu * m,E_Menu_Item * mi)1499 _e_client_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1500 {
1501    E_Client *ec;
1502    Evas_Object *o;
1503 
1504    ec = data;
1505    E_OBJECT_CHECK(ec);
1506 
1507    if (ec->netwm.icons)
1508      {
1509         o = e_icon_add(m->evas);
1510         e_icon_data_set(o, ec->netwm.icons[0].data,
1511                         ec->netwm.icons[0].width,
1512                         ec->netwm.icons[0].height);
1513         e_icon_alpha_set(o, 1);
1514         mi->icon_object = o;
1515      }
1516 }
1517 #endif
1518 static void
_e_client_menu_cb_border_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1519 _e_client_menu_cb_border_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1520 {
1521    E_Menu *subm;
1522    E_Menu_Item *submi;
1523    E_Client *ec;
1524 
1525    if (!(ec = data)) return;
1526 
1527    subm = e_menu_new();
1528    e_object_data_set(E_OBJECT(subm), ec);
1529    e_menu_item_submenu_set(mi, subm);
1530    e_object_unref(E_OBJECT(subm));
1531 
1532    if (e_comp_object_frame_allowed(ec->frame) && e_configure_registry_exists("internal/borders_border"))
1533      {
1534         submi = e_menu_item_new(subm);
1535         e_menu_item_label_set(submi, _("Select Border Style"));
1536         e_menu_item_callback_set(submi, _e_client_menu_cb_border, ec);
1537         e_menu_item_icon_edje_set(submi,
1538                                   e_theme_edje_file_get("base/theme/borders",
1539                                                         "e/widgets/border/default/borderless"),
1540                                   "e/widgets/border/default/borderless");
1541 
1542         submi = e_menu_item_new(subm);
1543         e_menu_item_separator_set(submi, 1);
1544      }
1545 
1546    submi = e_menu_item_new(subm);
1547    e_menu_item_label_set(submi, _("Use Enlightenment Default Icon Preference"));
1548    e_menu_item_radio_set(submi, 1);
1549    e_menu_item_radio_group_set(submi, 2);
1550    e_menu_item_toggle_set(submi, (ec->icon_preference == E_ICON_PREF_E_DEFAULT ? 1 : 0));
1551    e_menu_item_realize_callback_set(submi, _e_client_menu_cb_default_icon, ec);
1552    e_menu_item_callback_set(submi, _e_client_menu_cb_iconpref_e, ec);
1553 #ifndef HAVE_WAYLAND_ONLY
1554    submi = e_menu_item_new(subm);
1555    e_menu_item_label_set(submi, _("Use Application Provided Icon"));
1556    e_menu_item_radio_set(submi, 1);
1557    e_menu_item_radio_group_set(submi, 2);
1558    e_menu_item_toggle_set(submi, (ec->icon_preference == E_ICON_PREF_NETWM ? 1 : 0));
1559    e_menu_item_realize_callback_set(submi, _e_client_menu_cb_netwm_icon, ec);
1560    e_menu_item_callback_set(submi, _e_client_menu_cb_iconpref_netwm, ec);
1561 #endif
1562    submi = e_menu_item_new(subm);
1563    e_menu_item_label_set(submi, _("Use User Defined Icon"));
1564    e_menu_item_radio_set(submi, 1);
1565    e_menu_item_radio_group_set(submi, 2);
1566    e_menu_item_toggle_set(submi, (ec->icon_preference == E_ICON_PREF_USER ? 1 : 0));
1567    e_util_desktop_menu_item_icon_add(ec->desktop, 16, submi);
1568    e_menu_item_callback_set(submi, _e_client_menu_cb_iconpref_user, ec);
1569    e_menu_item_separator_set(submi, 1);
1570 
1571    submi = e_menu_item_new(subm);
1572    e_menu_item_label_set(submi, _("Offer Resistance"));
1573    e_menu_item_check_set(submi, 1);
1574    e_menu_item_toggle_set(submi, (ec->offer_resistance ? 1 : 0));
1575    e_menu_item_callback_set(submi, _e_client_menu_cb_resistance, ec);
1576    e_menu_item_icon_edje_set(submi,
1577                              e_theme_edje_file_get("base/theme/borders",
1578                                                    "e/widgets/border/default/borderless"),
1579                              "e/widgets/border/default/borderless");
1580 }
1581 
1582 static void
_e_client_menu_cb_iconpref_e(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1583 _e_client_menu_cb_iconpref_e(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1584 {
1585    E_Client *ec;
1586 
1587    if (!(ec = data)) return;
1588 
1589    ec->icon_preference = E_ICON_PREF_E_DEFAULT;
1590    ec->changes.icon = 1;
1591    EC_CHANGED(ec);
1592 }
1593 
1594 static void
_e_client_menu_cb_iconpref_user(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1595 _e_client_menu_cb_iconpref_user(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1596 {
1597    E_Client *ec;
1598 
1599    if (!(ec = data)) return;
1600 
1601    ec->icon_preference = E_ICON_PREF_USER;
1602    ec->changes.icon = 1;
1603    EC_CHANGED(ec);
1604 }
1605 #ifndef HAVE_WAYLAND_ONLY
1606 static void
_e_client_menu_cb_iconpref_netwm(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1607 _e_client_menu_cb_iconpref_netwm(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1608 {
1609    E_Client *ec;
1610 
1611    if (!(ec = data)) return;
1612 
1613    ec->icon_preference = E_ICON_PREF_NETWM;
1614    ec->changes.icon = 1;
1615    EC_CHANGED(ec);
1616 }
1617 #endif
1618 static void
_e_client_menu_cb_skip_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1619 _e_client_menu_cb_skip_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1620 {
1621    E_Client *ec;
1622    E_Menu *subm;
1623    E_Menu_Item *submi;
1624 
1625    if (!(ec = data)) return;
1626 
1627    subm = e_menu_new();
1628    e_object_data_set(E_OBJECT(subm), ec);
1629    e_menu_item_submenu_set(mi, subm);
1630    e_object_unref(E_OBJECT(subm));
1631 
1632    submi = e_menu_item_new(subm);
1633    e_menu_item_label_set(submi, _("Window List"));
1634    e_menu_item_check_set(submi, 1);
1635    e_menu_item_toggle_set(submi, ec->user_skip_winlist);
1636    e_menu_item_callback_set(submi, _e_client_menu_cb_skip_winlist, ec);
1637    e_menu_item_icon_edje_set(submi,
1638                              e_theme_edje_file_get("base/theme/borders",
1639                                                    "e/widgets/border/default/skip_winlist"),
1640                              "e/widgets/border/default/skip_winlist");
1641 
1642    submi = e_menu_item_new(subm);
1643    e_menu_item_label_set(submi, _("Pager"));
1644    e_menu_item_check_set(submi, 1);
1645    e_menu_item_toggle_set(submi, ec->netwm.state.skip_pager);
1646    e_menu_item_callback_set(submi, _e_client_menu_cb_skip_pager, ec);
1647    e_menu_item_icon_edje_set(submi,
1648                              e_theme_edje_file_get("base/theme/borders",
1649                                                    "e/widgets/border/default/skip_pager"),
1650                              "e/widgets/border/default/skip_pager");
1651 
1652    submi = e_menu_item_new(subm);
1653    e_menu_item_label_set(submi, _("Taskbar"));
1654    e_menu_item_check_set(submi, 1);
1655    e_menu_item_toggle_set(submi, ec->netwm.state.skip_taskbar);
1656    e_menu_item_callback_set(submi, _e_client_menu_cb_skip_taskbar, ec);
1657    e_menu_item_icon_edje_set(submi,
1658                              e_theme_edje_file_get("base/theme/borders",
1659                                                    "e/widgets/border/default/skip_taskbar"),
1660                              "e/widgets/border/default/skip_taskbar");
1661 }
1662 
1663 static void
_e_client_menu_cb_fav_add(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1664 _e_client_menu_cb_fav_add(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1665 {
1666    E_Client *ec;
1667    Efreet_Menu *menu;
1668    char buf[PATH_MAX];
1669 
1670    if (!(ec = data)) return;
1671    e_user_dir_concat_static(buf, "applications/menu/favorite.menu");
1672    menu = efreet_menu_parse(buf);
1673    if (!menu)
1674      menu = efreet_menu_new("Favorites");
1675    if (!menu) return;
1676    efreet_menu_desktop_insert(menu, ec->desktop, -1);
1677    efreet_menu_save(menu, buf);
1678    efreet_menu_free(menu);
1679    e_int_menus_cache_clear();
1680 }
1681 
1682 static void
_e_client_menu_cb_kbdshrtct_add(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi EINA_UNUSED)1683 _e_client_menu_cb_kbdshrtct_add(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
1684 {
1685    E_Client *ec;
1686    E_Zone *zone;
1687 
1688    if (!(ec = data)) return;
1689    zone = e_zone_current_get();
1690    if (!zone) return;
1691    e_configure_registry_call("keyboard_and_mouse/key_bindings",
1692                              NULL, ec->desktop->exec);
1693 }
1694 
1695 static void
_e_client_menu_cb_ibar_add_pre(void * data,E_Menu * m EINA_UNUSED,E_Menu_Item * mi)1696 _e_client_menu_cb_ibar_add_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi)
1697 {
1698    E_Menu *sm;
1699    E_Client *ec;
1700    Eina_List *dirs;
1701    Eina_List *l;
1702    char buf[PATH_MAX], *file;
1703    size_t len;
1704 
1705    if (!(ec = data)) return;
1706    len = e_user_dir_concat_static(buf, "applications/bar");
1707    if (len + 1 >= sizeof(buf)) return;
1708    dirs = ecore_file_ls(buf);
1709    if (!dirs) return;
1710 
1711    buf[len] = '/';
1712    len++;
1713 
1714    sm = e_menu_new();
1715    EINA_LIST_FOREACH(dirs, l, file)
1716      {
1717         E_Menu_Item *smi;
1718 
1719         if (file[0] == '.') continue;
1720 
1721         eina_strlcpy(buf + len, file, sizeof(buf) - len);
1722         if (ecore_file_is_dir(buf))
1723           {
1724              smi = e_menu_item_new(sm);
1725              e_menu_item_label_set(smi, file);
1726              e_menu_item_callback_set(smi, _e_client_menu_cb_ibar_add, file);
1727           }
1728      }
1729    e_object_data_set(E_OBJECT(sm), ec);
1730    e_menu_item_submenu_set(mi, sm);
1731    e_object_unref(E_OBJECT(sm));
1732 }
1733 
1734 static void
_e_client_menu_cb_ibar_add(void * data,E_Menu * m,E_Menu_Item * mi EINA_UNUSED)1735 _e_client_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED)
1736 {
1737    E_Order *od;
1738    E_Client *ec;
1739    char buf[PATH_MAX];
1740 
1741    ec = e_object_data_get(E_OBJECT(m));
1742    if ((!ec) || (!ec->desktop)) return;
1743 
1744    e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s/.order",
1745                        (const char *)data);
1746    od = e_order_new(buf);
1747    if (!od) return;
1748    e_order_append(od, ec->desktop);
1749    e_object_del(E_OBJECT(od));
1750 }
1751 
1752 /*vim:ts=8 sw=3 sts=3 expandtab cino=>5n-3f0^-2{2(0W1st0*/
1753