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