3 static void _e_border_cb_border_menu_end(void *data, E_Menu *m);
4 static void _e_border_menu_cb_locks(void *data, E_Menu *m, E_Menu_Item *mi);
5 static void _e_border_menu_cb_remember(void *data, E_Menu *m, E_Menu_Item *mi);
6 static void _e_border_menu_cb_border(void *data, E_Menu *m, E_Menu_Item *mi);
7 static void _e_border_menu_cb_close(void *data, E_Menu *m, E_Menu_Item *mi);
8 static void _e_border_menu_cb_iconify(void *data, E_Menu *m, E_Menu_Item *mi);
9 static void _e_border_menu_cb_kill(void *data, E_Menu *m, E_Menu_Item *mi);
10 static void _e_border_menu_cb_move(void *data, E_Menu *m, E_Menu_Item *mi);
11 static void _e_border_menu_cb_resize(void *data, E_Menu *m, E_Menu_Item *mi);
12 static void _e_border_menu_cb_maximize_pre(void *data, E_Menu *m, E_Menu_Item *mi);
13 static void _e_border_menu_cb_maximize(void *data, E_Menu *m, E_Menu_Item *mi);
14 static void _e_border_menu_cb_maximize_vertically(void *data, E_Menu *m, E_Menu_Item *mi);
15 static void _e_border_menu_cb_maximize_horizontally(void *data, E_Menu *m, E_Menu_Item *mi);
16 static void _e_border_menu_cb_unmaximize(void *data, E_Menu *m, E_Menu_Item *mi);
17 static void _e_border_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi);
18 static void _e_border_menu_cb_resistance(void *data, E_Menu *m, E_Menu_Item *mi);
19 static void _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi);
20 static void _e_border_menu_cb_application_pre(void *data, E_Menu *m, E_Menu_Item *mi);
21 static void _e_border_menu_cb_window_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi);
22 static void _e_border_menu_cb_placement_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi);
23 static void _e_border_menu_cb_prop(void *data, E_Menu *m, E_Menu_Item *mi);
24 static void _e_border_menu_cb_stick(void *data, E_Menu *m, E_Menu_Item *mi);
25 static void _e_border_menu_cb_stacking_pre(void *data, E_Menu *m, E_Menu_Item *mi);
26 static void _e_border_menu_cb_on_top(void *data, E_Menu *m, E_Menu_Item *mi);
27 static void _e_border_menu_cb_normal(void *data, E_Menu *m, E_Menu_Item *mi);
28 static void _e_border_menu_cb_below(void *data, E_Menu *m, E_Menu_Item *mi);
29 static void _e_border_menu_cb_fullscreen(void *data, E_Menu *m, E_Menu_Item *mi);
30 static void _e_border_menu_cb_skip_winlist(void *data, E_Menu *m, E_Menu_Item *mi);
31 static void _e_border_menu_cb_skip_pager(void *data, E_Menu *m, E_Menu_Item *mi);
32 static void _e_border_menu_cb_skip_taskbar(void *data, E_Menu *m, E_Menu_Item *mi);
33 static void _e_border_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi);
34 static void _e_border_menu_cb_sendto_pre(void *data, E_Menu *m, E_Menu_Item *mi);
35 static void _e_border_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi);
36 static void _e_border_menu_cb_pin(void *data, E_Menu *m, E_Menu_Item *mi);
37 static void _e_border_menu_cb_unpin(void *data, E_Menu *m, E_Menu_Item *mi);
38 static void _e_border_menu_cb_raise(void *data, E_Menu *m, E_Menu_Item *mi);
39 static void _e_border_menu_cb_lower(void *data, E_Menu *m, E_Menu_Item *mi);
40 static void _e_border_menu_cb_skip_pre(void *data, E_Menu *m, E_Menu_Item *mi);
41 static void _e_border_menu_cb_fav_add(void *data, E_Menu *m, E_Menu_Item *mi);
42 static void _e_border_menu_cb_kbdshrtct_add(void *data, E_Menu *m, E_Menu_Item *mi);
43 static void _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m, E_Menu_Item *mi);
44 static void _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi);
45 static void _e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi);
46 static void _e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi);
47 static void _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi);
48 static void _e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi);
49 static void _e_border_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi);
50 static void _e_border_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi);
53 e_int_border_menu_create(E_Border *bd)
59 if (bd->border_menu) return;
62 e_menu_category_set(m, "border");
63 e_menu_category_data_set("border", bd);
64 e_object_data_set(E_OBJECT(m), bd);
66 e_menu_post_deactivate_callback_set(m, _e_border_cb_border_menu_end, NULL);
70 if (bd->client.icccm.class)
71 snprintf(buf, sizeof(buf), "%s", bd->client.icccm.class);
73 snprintf(buf, sizeof(buf), _("Application"));
74 mi = e_menu_item_new(m);
75 e_menu_item_label_set(mi, buf);
76 e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_application_pre, bd);
78 e_util_desktop_menu_item_icon_add(bd->desktop, 16, mi);
81 mi = e_menu_item_new(m);
82 e_menu_item_label_set(mi, _("Window"));
83 e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_window_pre, bd);
84 e_menu_item_icon_edje_set(mi,
85 e_theme_edje_file_get("base/theme/borders",
86 "e/widgets/border/default/window"),
87 "e/widgets/border/default/window");
89 mi = e_menu_item_new(m);
90 e_menu_item_separator_set(mi, 1);
92 if ((!bd->sticky) && ((bd->zone->desk_x_count > 1) || (bd->zone->desk_y_count > 1)))
94 mi = e_menu_item_new(m);
95 e_menu_item_label_set(mi, _("Move to"));
96 e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_sendto_pre, bd);
97 e_menu_item_icon_edje_set(mi,
98 e_theme_edje_file_get("base/theme/borders",
99 "e/widgets/border/default/sendto"),
100 "e/widgets/border/default/sendto");
103 mi = e_menu_item_new(m);
104 e_menu_item_label_set(mi, _("Always on Top"));
105 e_menu_item_check_set(mi, 1);
106 e_menu_item_toggle_set(mi, (bd->layer == 150 ? 1 : 0));
107 if (bd->layer == 150)
108 e_menu_item_callback_set(mi, _e_border_menu_cb_normal, bd);
110 e_menu_item_callback_set(mi, _e_border_menu_cb_on_top, bd);
111 e_menu_item_icon_edje_set(mi,
112 e_theme_edje_file_get("base/theme/borders",
113 "e/widgets/border/default/stack_on_top"),
114 "e/widgets/border/default/stack_on_top");
116 if (!bd->lock_user_sticky)
118 mi = e_menu_item_new(m);
119 e_menu_item_label_set(mi, _("Sticky"));
120 e_menu_item_check_set(mi, 1);
121 e_menu_item_toggle_set(mi, (bd->sticky ? 1 : 0));
122 e_menu_item_callback_set(mi, _e_border_menu_cb_stick, bd);
123 e_menu_item_icon_edje_set(mi,
124 e_theme_edje_file_get("base/theme/borders",
125 "e/widgets/border/default/stick"),
126 "e/widgets/border/default/stick");
131 mi = e_menu_item_new(m);
132 e_menu_item_separator_set(mi, 1);
134 mi = e_menu_item_new(m);
135 e_menu_item_label_set(mi, _("Close"));
136 e_menu_item_callback_set(mi, _e_border_menu_cb_close, bd);
137 e_menu_item_icon_edje_set(mi,
138 e_theme_edje_file_get("base/theme/borders",
139 "e/widgets/border/default/close"),
140 "e/widgets/border/default/close");
145 e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_X_Time timestamp)
147 e_int_border_menu_create(bd);
149 e_menu_activate_key(bd->border_menu, bd->zone, x, y, 1, 1,
150 E_MENU_POP_DIRECTION_DOWN);
152 e_menu_activate_mouse(bd->border_menu, bd->zone, x, y, 1, 1,
153 E_MENU_POP_DIRECTION_DOWN, timestamp);
157 e_int_border_menu_del(E_Border *bd)
161 e_object_del(E_OBJECT(bd->border_menu));
162 bd->border_menu = NULL;
167 _e_border_cb_border_menu_end(void *data __UNUSED__, E_Menu *m)
171 bd = e_object_data_get(E_OBJECT(m));
174 /* If the border exists, delete all associated menus */
175 e_int_border_menu_del(bd);
179 /* Just delete this menu */
180 e_object_del(E_OBJECT(m));
185 _e_border_menu_cb_locks(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
190 if (bd->border_locks_dialog) return;
191 e_int_border_locks(bd);
195 _e_border_menu_cb_remember(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
200 if (bd->border_remember_dialog) return;
201 e_int_border_remember(bd);
205 _e_border_menu_cb_border(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
211 if (bd->border_border_dialog) return;
212 snprintf(buf, sizeof(buf), "%p", bd);
213 e_configure_registry_call("internal/borders_border", bd->zone->container, buf);
217 _e_border_menu_cb_close(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
222 if (!bd->lock_close) e_border_act_close_begin(bd);
226 _e_border_menu_cb_iconify(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
231 if (!bd->lock_user_iconify)
234 e_border_uniconify(bd);
236 e_border_iconify(bd);
241 _e_border_menu_cb_kill(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
247 if ((bd->lock_close) || (bd->internal)) return;
249 a = e_action_find("window_kill");
250 if ((a) && (a->func.go)) a->func.go(NULL, NULL);
254 _e_border_menu_cb_move(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
260 if (!bd->lock_user_location)
261 e_border_act_move_keyboard(bd);
265 _e_border_menu_cb_resize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
271 if (!bd->lock_user_size)
272 e_border_act_resize_keyboard(bd);
276 _e_border_menu_cb_maximize_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
282 if (!(bd = data)) return;
285 e_object_data_set(E_OBJECT(subm), bd);
286 e_menu_item_submenu_set(mi, subm);
288 if ((!bd->lock_user_fullscreen) && (!bd->shaded))
290 submi = e_menu_item_new(subm);
291 e_menu_item_label_set(submi, _("Fullscreen"));
292 e_menu_item_check_set(submi, 1);
293 e_menu_item_toggle_set(submi, bd->fullscreen);
294 e_menu_item_callback_set(submi, _e_border_menu_cb_fullscreen, bd);
295 e_menu_item_icon_edje_set(submi,
296 e_theme_edje_file_get("base/theme/borders",
297 "e/widgets/border/default/fullscreen"),
298 "e/widgets/border/default/fullscreen");
303 submi = e_menu_item_new(subm);
304 e_menu_item_label_set(submi, _("Maximize"));
305 e_menu_item_radio_set(submi, 1);
306 e_menu_item_radio_group_set(submi, 3);
307 e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH);
308 e_menu_item_callback_set(submi, _e_border_menu_cb_maximize, bd);
309 e_menu_item_icon_edje_set(submi,
310 e_theme_edje_file_get("base/theme/borders",
311 "e/widgets/border/default/maximize"),
312 "e/widgets/border/default/maximize");
314 submi = e_menu_item_new(subm);
315 e_menu_item_label_set(submi, _("Maximize vertically"));
316 e_menu_item_radio_set(submi, 1);
317 e_menu_item_radio_group_set(submi, 3);
318 e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL);
319 e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_vertically, bd);
320 e_menu_item_icon_edje_set(submi,
321 e_theme_edje_file_get("base/theme/borders",
322 "e/widgets/border/default/maximize"),
323 "e/widgets/border/default/maximize");
325 submi = e_menu_item_new(subm);
326 e_menu_item_label_set(submi, _("Maximize horizontally"));
327 e_menu_item_radio_set(submi, 1);
328 e_menu_item_radio_group_set(submi, 3);
329 e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL);
330 e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_horizontally, bd);
331 e_menu_item_icon_edje_set(submi,
332 e_theme_edje_file_get("base/theme/borders",
333 "e/widgets/border/default/maximize"),
334 "e/widgets/border/default/maximize");
336 submi = e_menu_item_new(subm);
337 e_menu_item_label_set(submi, _("Unmaximize"));
338 e_menu_item_radio_set(submi, 1);
339 e_menu_item_radio_group_set(submi, 3);
340 e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE);
341 e_menu_item_callback_set(submi, _e_border_menu_cb_unmaximize, bd);
342 e_menu_item_icon_edje_set(submi,
343 e_theme_edje_file_get("base/theme/borders",
344 "e/widgets/border/default/maximize"),
345 "e/widgets/border/default/maximize");
350 _e_border_menu_cb_maximize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
355 if (!bd->lock_user_maximize)
356 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
361 _e_border_menu_cb_maximize_vertically(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
366 if (!bd->lock_user_maximize)
368 if ((bd->maximized & E_MAXIMIZE_HORIZONTAL))
369 e_border_unmaximize(bd, E_MAXIMIZE_HORIZONTAL);
370 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
371 E_MAXIMIZE_VERTICAL);
376 _e_border_menu_cb_maximize_horizontally(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
381 if (!bd->lock_user_maximize)
383 if ((bd->maximized & E_MAXIMIZE_VERTICAL))
384 e_border_unmaximize(bd, E_MAXIMIZE_VERTICAL);
385 e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
386 E_MAXIMIZE_HORIZONTAL);
391 _e_border_menu_cb_unmaximize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
396 e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
400 _e_border_menu_cb_shade(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
405 if (!bd->lock_user_shade)
408 e_border_unshade(bd, E_DIRECTION_UP);
410 e_border_shade(bd, E_DIRECTION_UP);
415 _e_border_menu_cb_resistance(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
420 bd->offer_resistance = !bd->offer_resistance;
424 _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
429 e_desktop_border_edit(m->zone->container, bd);
433 _e_border_menu_cb_application_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
439 if (!(bd = data)) return;
442 e_object_data_set(E_OBJECT(subm), bd);
443 e_menu_item_submenu_set(mi, subm);
447 submi = e_menu_item_new(subm);
448 e_menu_item_label_set(submi, _("Edit Icon"));
449 e_menu_item_callback_set(submi, _e_border_menu_cb_icon_edit, bd);
450 e_util_desktop_menu_item_icon_add(bd->desktop, 16, submi);
452 else if (bd->client.icccm.class)
454 /* icons with no class useless to borders */
455 submi = e_menu_item_new(subm);
456 e_menu_item_label_set(submi, _("Create Icon"));
457 e_menu_item_callback_set(submi, _e_border_menu_cb_icon_edit, bd);
460 submi = e_menu_item_new(subm);
461 e_menu_item_separator_set(submi, 1);
463 submi = e_menu_item_new(subm);
464 e_menu_item_label_set(submi, _("Add to Favorites Menu"));
465 e_menu_item_callback_set(submi, _e_border_menu_cb_fav_add, bd);
466 e_util_menu_item_theme_icon_set(submi, "user-bookmarks");
468 submi = e_menu_item_new(subm);
469 e_menu_item_label_set(submi, _("Add to IBar"));
470 e_menu_item_submenu_pre_callback_set(submi,
471 _e_border_menu_cb_ibar_add_pre, bd);
472 e_util_menu_item_theme_icon_set(submi, "preferences-applications-ibar");
474 if (e_configure_registry_exists("keyboard_and_mouse/key_bindings"))
476 submi = e_menu_item_new(subm);
477 e_menu_item_label_set(submi, _("Create Keyboard Shortcut"));
478 e_menu_item_callback_set(submi, _e_border_menu_cb_kbdshrtct_add, bd);
479 e_util_menu_item_theme_icon_set(submi, "preferences-desktop-keyboard");
484 _e_border_menu_cb_window_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
490 if (!(bd = data)) return;
493 e_object_data_set(E_OBJECT(subm), bd);
494 e_menu_item_submenu_set(mi, subm);
496 submi = e_menu_item_new(subm);
497 e_menu_item_label_set(submi, _("Placement"));
498 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_placement_pre, bd);
499 e_menu_item_icon_edje_set(submi,
500 e_theme_edje_file_get("base/theme/borders",
501 "e/widgets/border/default/placement"),
502 "e/widgets/border/default/placement");
504 if ((!bd->lock_user_stacking) && (!bd->fullscreen))
506 submi = e_menu_item_new(subm);
507 e_menu_item_label_set(submi, _("Stacking"));
508 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_stacking_pre, bd);
509 e_menu_item_icon_edje_set(submi,
510 e_theme_edje_file_get("base/theme/borders",
511 "e/widgets/border/default/stacking"),
512 "e/widgets/border/default/stacking");
515 submi = e_menu_item_new(subm);
516 e_menu_item_separator_set(submi, 1);
518 submi = e_menu_item_new(subm);
519 e_menu_item_label_set(submi, _("Skip"));
520 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_skip_pre, bd);
521 e_menu_item_icon_edje_set(submi,
522 e_theme_edje_file_get("base/theme/borders",
523 "e/widgets/border/default/skip"),
524 "e/widgets/border/default/skip");
526 if (!bd->lock_border)
528 submi = e_menu_item_new(subm);
529 e_menu_item_label_set(submi, _("Border"));
530 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_border_pre, bd);
531 e_menu_item_icon_edje_set(submi,
532 e_theme_edje_file_get("base/theme/borders",
533 "e/widgets/border/default/borderless"),
534 "e/widgets/border/default/borderless");
537 submi = e_menu_item_new(subm);
538 e_menu_item_separator_set(submi, 1);
540 submi = e_menu_item_new(subm);
541 e_menu_item_label_set(submi, _("Locks"));
542 e_menu_item_callback_set(submi, _e_border_menu_cb_locks, bd);
543 e_menu_item_icon_edje_set(submi,
544 e_theme_edje_file_get("base/theme/borders",
545 "e/widgets/border/default/locks"),
546 "e/widgets/border/default/locks");
548 submi = e_menu_item_new(subm);
549 e_menu_item_label_set(submi, _("Remember"));
550 e_menu_item_callback_set(submi, _e_border_menu_cb_remember, bd);
551 e_menu_item_icon_edje_set(submi,
552 e_theme_edje_file_get("base/theme/borders",
553 "e/widgets/border/default/remember"),
554 "e/widgets/border/default/remember");
556 submi = e_menu_item_new(subm);
557 e_menu_item_separator_set(submi, 1);
559 if ((!bd->internal) && (!bd->lock_close))
561 submi = e_menu_item_new(subm);
562 e_menu_item_label_set(submi, _("Kill"));
563 e_menu_item_callback_set(submi, _e_border_menu_cb_kill, bd);
564 e_menu_item_icon_edje_set(submi,
565 e_theme_edje_file_get("base/theme/borders",
566 "e/widgets/border/default/kill"),
567 "e/widgets/border/default/kill");
570 submi = e_menu_item_new(subm);
571 e_menu_item_label_set(submi, _("ICCCM/NetWM"));
572 e_menu_item_callback_set(submi, _e_border_menu_cb_prop, bd);
573 e_menu_item_icon_edje_set(submi,
574 e_theme_edje_file_get("base/theme/borders",
575 "e/widgets/border/default/properties"),
576 "e/widgets/border/default/properties");
580 _e_border_menu_cb_placement_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
586 if (!(bd = data)) return;
589 e_object_data_set(E_OBJECT(subm), bd);
590 e_menu_item_submenu_set(mi, subm);
592 if ((!bd->sticky) && ((bd->zone->desk_x_count > 1) || (bd->zone->desk_y_count > 1)))
594 submi = e_menu_item_new(subm);
595 e_menu_item_label_set(submi, _("Move to"));
596 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_sendto_pre, bd);
597 e_menu_item_icon_edje_set(submi,
598 e_theme_edje_file_get("base/theme/borders",
599 "e/widgets/border/default/sendto"),
600 "e/widgets/border/default/sendto");
603 if (!bd->lock_user_sticky)
605 submi = e_menu_item_new(subm);
606 e_menu_item_label_set(submi, _("Sticky"));
607 e_menu_item_check_set(submi, 1);
608 e_menu_item_toggle_set(submi, (bd->sticky ? 1 : 0));
609 e_menu_item_callback_set(submi, _e_border_menu_cb_stick, bd);
610 e_menu_item_icon_edje_set(submi,
611 e_theme_edje_file_get("base/theme/borders",
612 "e/widgets/border/default/stick"),
613 "e/widgets/border/default/stick");
616 submi = e_menu_item_new(subm);
617 e_menu_item_separator_set(submi, 1);
619 if ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
620 (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN))
622 if (!(((bd->client.icccm.min_w == bd->client.icccm.max_w) &&
623 (bd->client.icccm.min_h == bd->client.icccm.max_h)) ||
624 (bd->lock_user_maximize)))
626 if ((!bd->lock_user_maximize) && (!bd->shaded))
628 submi = e_menu_item_new(subm);
629 e_menu_item_label_set(submi, _("Maximize"));
630 e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_maximize_pre, bd);
631 e_menu_item_icon_edje_set(submi,
632 e_theme_edje_file_get("base/theme/borders",
633 "e/widgets/border/default/maximize"),
634 "e/widgets/border/default/maximize");
638 if ((!bd->lock_user_iconify) && (!bd->fullscreen))
640 submi = e_menu_item_new(subm);
641 e_menu_item_label_set(submi, _("Iconify"));
642 e_menu_item_callback_set(submi, _e_border_menu_cb_iconify, bd);
643 e_menu_item_icon_edje_set(submi,
644 e_theme_edje_file_get("base/theme/borders",
645 "e/widgets/border/default/minimize"),
646 "e/widgets/border/default/minimize");
650 if ((!bd->lock_user_location) && (!bd->fullscreen) &&
651 (((bd->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip))
653 submi = e_menu_item_new(subm);
654 e_menu_item_label_set(submi, _("Move"));
655 e_menu_item_callback_set(submi, _e_border_menu_cb_move, bd);
656 e_menu_item_icon_edje_set(submi,
657 e_theme_edje_file_get("base/theme/borders",
658 "e/widgets/border/default/move_icon"),
659 "e/widgets/border/default/move_icon");
662 if (((!bd->lock_user_size) && (!bd->fullscreen) &&
663 (((bd->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip)) &&
664 ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
665 (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN)))
667 submi = e_menu_item_new(subm);
668 e_menu_item_label_set(submi, _("Resize"));
669 e_menu_item_callback_set(submi, _e_border_menu_cb_resize, bd);
670 e_menu_item_icon_edje_set(submi,
671 e_theme_edje_file_get("base/theme/borders",
672 "e/widgets/border/default/resize_icon"),
673 "e/widgets/border/default/resize_icon");
676 if ((!bd->lock_user_shade) && (!bd->fullscreen) && (!bd->maximized) &&
677 ((!bd->client.border.name) || (strcmp("borderless", bd->client.border.name))))
679 submi = e_menu_item_new(subm);
680 e_menu_item_label_set(submi, _("Shade"));
681 e_menu_item_check_set(submi, 1);
682 e_menu_item_toggle_set(submi, (bd->shaded ? 1 : 0));
683 e_menu_item_callback_set(submi, _e_border_menu_cb_shade, bd);
684 e_menu_item_icon_edje_set(submi,
685 e_theme_edje_file_get("base/theme/borders",
686 "e/widgets/border/default/shade"),
687 "e/widgets/border/default/shade");
692 _e_border_menu_cb_prop(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
697 e_int_border_prop(bd);
701 _e_border_menu_cb_stick(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
706 if (!bd->lock_user_sticky)
709 e_border_unstick(bd);
716 _e_border_menu_cb_on_top(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
721 if (bd->layer != 150)
723 e_border_layer_set(bd, 150);
724 e_hints_window_stacking_set(bd, E_STACKING_ABOVE);
729 _e_border_menu_cb_below(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
736 e_border_layer_set(bd, 50);
737 e_hints_window_stacking_set(bd, E_STACKING_BELOW);
742 _e_border_menu_cb_normal(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
747 if (bd->layer != 100)
749 e_border_layer_set(bd, 100);
750 e_hints_window_stacking_set(bd, E_STACKING_NONE);
755 _e_border_menu_cb_fullscreen(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
760 if (!(bd = data)) return;
762 if (!bd->lock_user_fullscreen)
764 toggle = e_menu_item_toggle_get(mi);
766 e_border_fullscreen(bd, e_config->fullscreen_policy);
768 e_border_unfullscreen(bd);
773 _e_border_menu_cb_skip_winlist(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
777 if (!(bd = data)) return;
779 if (((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus)) &&
780 (!bd->client.netwm.state.skip_taskbar))
781 bd->user_skip_winlist = e_menu_item_toggle_get(mi);
783 bd->user_skip_winlist = 0;
785 e_remember_update(bd);
789 _e_border_menu_cb_skip_pager(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
793 if (!(bd = data)) return;
795 if ((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus))
796 bd->client.netwm.state.skip_pager = e_menu_item_toggle_get(mi);
798 bd->client.netwm.state.skip_pager = 0;
800 e_remember_update(bd);
804 _e_border_menu_cb_skip_taskbar(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
808 if (!(bd = data)) return;
810 if ((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus))
811 bd->client.netwm.state.skip_taskbar = e_menu_item_toggle_get(mi);
813 bd->client.netwm.state.skip_taskbar = 0;
815 e_remember_update(bd);
819 _e_border_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi)
822 Evas_Object *o = NULL;
823 const char *bgfile = NULL;
827 E_OBJECT_CHECK(desk);
830 th = (tw * desk->zone->h) / desk->zone->w;
831 bgfile = e_bg_file_get(desk->zone->container->num, desk->zone->num,
833 o = e_thumb_icon_add(m->evas);
834 e_thumb_icon_file_set(o, bgfile, "e/desktop/background");
835 e_thumb_icon_size_set(o, tw, th);
836 e_thumb_icon_begin(o);
841 _e_border_menu_cb_sendto_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
853 desk_cur = e_desk_current_get(bd->zone);
854 zones = eina_list_count(bd->zone->container->zones);
857 e_object_data_set(E_OBJECT(subm), bd);
858 e_menu_item_submenu_set(mi, subm);
860 EINA_LIST_FOREACH(bd->zone->container->zones, l, zone)
864 snprintf (buf, sizeof(buf), _("Screen %d"), zone->num);
865 submi = e_menu_item_new(subm);
866 e_menu_item_label_set(submi, buf);
867 e_menu_item_disabled_set(submi, EINA_TRUE);
870 // FIXME: Remove labels and add deskpreview to menu.
871 // Evas_Object *o = e_widget_deskpreview_add(m->evas, 4, 2);
873 for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++)
877 desk = zone->desks[i];
878 submi = e_menu_item_new(subm);
879 e_menu_item_label_set(submi, desk->name);
880 e_menu_item_radio_set(submi, 1);
881 e_menu_item_radio_group_set(submi, 2);
882 if ((bd->zone == zone) && (desk_cur == desk))
883 e_menu_item_toggle_set(submi, 1);
885 e_menu_item_callback_set(submi, _e_border_menu_cb_sendto, desk);
886 e_menu_item_realize_callback_set(submi, _e_border_menu_cb_sendto_icon_pre,
893 _e_border_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
899 bd = e_object_data_get(E_OBJECT(m));
902 e_border_zone_set(bd, desk->zone);
903 e_border_desk_set(bd, desk);
908 _e_border_menu_cb_pin(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
912 bd = e_object_data_get(E_OBJECT(m));
913 if (bd) e_border_pinned_set(bd, 1);
917 _e_border_menu_cb_unpin(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
921 bd = e_object_data_get(E_OBJECT(m));
922 if (bd) e_border_pinned_set(bd, 0);
926 _e_border_menu_cb_stacking_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
932 if (!(bd = data)) return;
935 e_object_data_set(E_OBJECT(subm), bd);
936 e_menu_item_submenu_set(mi, subm);
938 /* Only allow to change layer for windows in "normal" layers */
939 e_menu_category_set(subm,"border/stacking");
940 e_menu_category_data_set("border/stacking",bd);
942 submi = e_menu_item_new(subm);
943 e_menu_item_label_set(submi, _("Always on Top"));
944 e_menu_item_radio_set(submi, 1);
945 e_menu_item_radio_group_set(submi, 2);
946 e_menu_item_toggle_set(submi, (bd->layer == 150 ? 1 : 0));
947 e_menu_item_callback_set(submi, _e_border_menu_cb_on_top, bd);
948 e_menu_item_icon_edje_set(submi,
949 e_theme_edje_file_get("base/theme/borders",
950 "e/widgets/border/default/stack_on_top"),
951 "e/widgets/border/default/stack_on_top");
953 submi = e_menu_item_new(subm);
954 e_menu_item_label_set(submi, _("Normal"));
955 e_menu_item_radio_set(submi, 1);
956 e_menu_item_radio_group_set(submi, 2);
957 e_menu_item_toggle_set(submi, (bd->layer == 100 ? 1 : 0));
958 e_menu_item_callback_set(submi, _e_border_menu_cb_normal, bd);
959 e_menu_item_icon_edje_set(submi,
960 e_theme_edje_file_get("base/theme/borders",
961 "e/widgets/border/default/stack_normal"),
962 "e/widgets/border/default/stack_normal");
964 submi = e_menu_item_new(subm);
965 e_menu_item_label_set(submi, _("Always Below"));
966 e_menu_item_radio_set(submi, 1);
967 e_menu_item_radio_group_set(submi, 2);
968 e_menu_item_toggle_set(submi, (bd->layer == 50 ? 1 : 0));
969 e_menu_item_callback_set(submi, _e_border_menu_cb_below, bd);
970 e_menu_item_icon_edje_set(submi,
971 e_theme_edje_file_get("base/theme/borders",
972 "e/widgets/border/default/stack_below"),
973 "e/widgets/border/default/stack_below");
975 submi = e_menu_item_new(subm);
976 e_menu_item_separator_set(submi, 1);
978 // Only allow to change layer for windows in "normal" layers
979 if ((!bd->lock_user_stacking) &&
980 ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
982 submi = e_menu_item_new(subm);
983 e_menu_item_label_set(submi, _("Raise"));
984 e_menu_item_callback_set(submi, _e_border_menu_cb_raise, bd);
985 e_menu_item_icon_edje_set(submi,
986 e_theme_edje_file_get("base/theme/borders",
987 "e/widgets/border/default/stack_on_top"),
988 "e/widgets/border/default/stack_on_top");
990 submi = e_menu_item_new(subm);
991 e_menu_item_label_set(submi, _("Lower"));
992 e_menu_item_callback_set(submi, _e_border_menu_cb_lower, bd);
993 e_menu_item_icon_edje_set(submi,
994 e_theme_edje_file_get("base/theme/borders",
995 "e/widgets/border/default/stack_below"),
996 "e/widgets/border/default/stack_below");
999 submi = e_menu_item_new(subm);
1000 e_menu_item_separator_set(submi, 1);
1002 if ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
1003 (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN))
1005 if ((bd->client.netwm.state.stacking != E_STACKING_BELOW) ||
1006 (!bd->user_skip_winlist) || (!bd->borderless))
1008 submi = e_menu_item_new(subm);
1009 e_menu_item_label_set(submi, _("Pin to Desktop"));
1010 e_menu_item_callback_set(submi, _e_border_menu_cb_pin, bd);
1011 e_menu_item_icon_edje_set(submi,
1012 e_theme_edje_file_get("base/theme/borders",
1013 "e/widgets/border/default/stick"),
1014 "e/widgets/border/default/stick");
1016 if ((bd->client.netwm.state.stacking == E_STACKING_BELOW) &&
1017 (bd->user_skip_winlist) && (bd->borderless))
1019 submi = e_menu_item_new(subm);
1020 e_menu_item_label_set(submi, _("Unpin from Desktop"));
1021 e_menu_item_callback_set(submi, _e_border_menu_cb_unpin, bd);
1022 e_menu_item_icon_edje_set(submi,
1023 e_theme_edje_file_get("base/theme/borders",
1024 "e/widgets/border/default/stick"),
1025 "e/widgets/border/default/stick");
1031 _e_border_menu_cb_raise(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1036 if ((!bd->lock_user_stacking) && (!bd->internal) &&
1037 ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
1044 _e_border_menu_cb_lower(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1049 if ((!bd->lock_user_stacking) && (!bd->internal) &&
1050 ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
1057 _e_border_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1061 unsigned char prev_icon_pref;
1066 o = e_icon_add(m->evas);
1067 prev_icon_pref = bd->icon_preference;
1068 bd->icon_preference = E_ICON_PREF_E_DEFAULT;
1069 e_icon_object_set(o, e_border_icon_add(bd, m->evas));
1070 bd->icon_preference = prev_icon_pref;
1071 mi->icon_object = o;
1075 _e_border_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1083 if (bd->client.netwm.icons)
1085 o = e_icon_add(m->evas);
1086 e_icon_data_set(o, bd->client.netwm.icons[0].data,
1087 bd->client.netwm.icons[0].width,
1088 bd->client.netwm.icons[0].height);
1089 e_icon_alpha_set(o, 1);
1090 mi->icon_object = o;
1095 _e_border_menu_cb_border_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1101 if (!(bd = data)) return;
1103 subm = e_menu_new();
1104 e_object_data_set(E_OBJECT(subm), bd);
1105 e_menu_item_submenu_set(mi, subm);
1107 if (e_configure_registry_exists("internal/borders_border"))
1109 submi = e_menu_item_new(subm);
1110 e_menu_item_label_set(submi, _("Select Border Style"));
1111 e_menu_item_callback_set(submi, _e_border_menu_cb_border, bd);
1112 e_menu_item_icon_edje_set(submi,
1113 e_theme_edje_file_get("base/theme/borders",
1114 "e/widgets/border/default/borderless"),
1115 "e/widgets/border/default/borderless");
1117 submi = e_menu_item_new(subm);
1118 e_menu_item_separator_set(submi, 1);
1121 submi = e_menu_item_new(subm);
1122 e_menu_item_label_set(submi, _("Use E17 Default Icon Preference"));
1123 e_menu_item_radio_set(submi, 1);
1124 e_menu_item_radio_group_set(submi, 2);
1125 e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_E_DEFAULT ? 1 : 0));
1126 e_menu_item_realize_callback_set(submi, _e_border_menu_cb_default_icon, bd);
1127 e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_e, bd);
1129 submi = e_menu_item_new(subm);
1130 e_menu_item_label_set(submi, _("Use Application Provided Icon "));
1131 e_menu_item_radio_set(submi, 1);
1132 e_menu_item_radio_group_set(submi, 2);
1133 e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_NETWM ? 1 : 0));
1134 e_menu_item_realize_callback_set(submi, _e_border_menu_cb_netwm_icon, bd);
1135 e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_netwm, bd);
1137 submi = e_menu_item_new(subm);
1138 e_menu_item_label_set(submi, _("Use User Defined Icon"));
1139 e_menu_item_radio_set(submi, 1);
1140 e_menu_item_radio_group_set(submi, 2);
1141 e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_USER ? 1 : 0));
1142 e_util_desktop_menu_item_icon_add(bd->desktop, 16, submi);
1143 e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_user, bd);
1144 e_menu_item_separator_set(submi, 1);
1146 submi = e_menu_item_new(subm);
1147 e_menu_item_label_set(submi, _("Offer Resistance"));
1148 e_menu_item_check_set(submi, 1);
1149 e_menu_item_toggle_set(submi, (bd->offer_resistance ? 1 : 0));
1150 e_menu_item_callback_set(submi, _e_border_menu_cb_resistance, bd);
1151 e_menu_item_icon_edje_set(submi,
1152 e_theme_edje_file_get("base/theme/borders",
1153 "e/widgets/border/default/borderless"),
1154 "e/widgets/border/default/borderless");
1158 _e_border_menu_cb_iconpref_e(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1162 if (!(bd = data)) return;
1164 bd->icon_preference = E_ICON_PREF_E_DEFAULT;
1165 bd->changes.icon = 1;
1170 _e_border_menu_cb_iconpref_user(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1174 if (!(bd = data)) return;
1176 bd->icon_preference = E_ICON_PREF_USER;
1177 bd->changes.icon = 1;
1182 _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1186 if (!(bd = data)) return;
1188 bd->icon_preference = E_ICON_PREF_NETWM;
1189 bd->changes.icon = 1;
1194 _e_border_menu_cb_skip_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1200 if (!(bd = data)) return;
1202 subm = e_menu_new();
1203 e_object_data_set(E_OBJECT(subm), bd);
1204 e_menu_item_submenu_set(mi, subm);
1206 submi = e_menu_item_new(subm);
1207 e_menu_item_label_set(submi, _("Window List"));
1208 e_menu_item_check_set(submi, 1);
1209 e_menu_item_toggle_set(submi, bd->user_skip_winlist);
1210 e_menu_item_callback_set(submi, _e_border_menu_cb_skip_winlist, bd);
1211 e_menu_item_icon_edje_set(submi,
1212 e_theme_edje_file_get("base/theme/borders",
1213 "e/widgets/border/default/skip_winlist"),
1214 "e/widgets/border/default/skip_winlist");
1216 submi = e_menu_item_new(subm);
1217 e_menu_item_label_set(submi, _("Pager"));
1218 e_menu_item_check_set(submi, 1);
1219 e_menu_item_toggle_set(submi, bd->client.netwm.state.skip_pager);
1220 e_menu_item_callback_set(submi, _e_border_menu_cb_skip_pager, bd);
1221 e_menu_item_icon_edje_set(submi,
1222 e_theme_edje_file_get("base/theme/borders",
1223 "e/widgets/border/default/skip_pager"),
1224 "e/widgets/border/default/skip_pager");
1226 submi = e_menu_item_new(subm);
1227 e_menu_item_label_set(submi, _("Taskbar"));
1228 e_menu_item_check_set(submi, 1);
1229 e_menu_item_toggle_set(submi, bd->client.netwm.state.skip_taskbar);
1230 e_menu_item_callback_set(submi, _e_border_menu_cb_skip_taskbar, bd);
1231 e_menu_item_icon_edje_set(submi,
1232 e_theme_edje_file_get("base/theme/borders",
1233 "e/widgets/border/default/skip_taskbar"),
1234 "e/widgets/border/default/skip_taskbar");
1238 _e_border_menu_cb_fav_add(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1244 if (!(bd = data)) return;
1245 e_user_dir_concat_static(buf, "applications/menu/favorite.menu");
1246 menu = efreet_menu_parse(buf);
1248 menu = efreet_menu_new("Favorites");
1250 efreet_menu_desktop_insert(menu, bd->desktop, -1);
1251 efreet_menu_save(menu, buf);
1252 efreet_menu_free(menu);
1256 _e_border_menu_cb_kbdshrtct_add(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1261 if (!(bd = data)) return;
1262 zone = e_util_zone_current_get(e_manager_current_get());
1264 e_configure_registry_call("keyboard_and_mouse/key_bindings",
1265 zone->container, bd->desktop->exec);
1269 _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1275 char buf[PATH_MAX], *file;
1278 if (!(bd = data)) return;
1279 len = e_user_dir_concat_static(buf, "applications/bar");
1280 if (len + 1 >= sizeof(buf)) return;
1281 dirs = ecore_file_ls(buf);
1288 EINA_LIST_FOREACH(dirs, l, file)
1292 if (file[0] == '.') continue;
1294 eina_strlcpy(buf + len, file, sizeof(buf) - len);
1295 if (ecore_file_is_dir(buf))
1297 smi = e_menu_item_new(sm);
1298 e_menu_item_label_set(smi, file);
1299 e_menu_item_callback_set(smi, _e_border_menu_cb_ibar_add, file);
1302 e_object_data_set(E_OBJECT(sm), bd);
1303 e_menu_item_submenu_set(mi, sm);
1307 _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
1313 bd = e_object_data_get(E_OBJECT(m));
1314 if ((!bd) || (!bd->desktop)) return;
1316 e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s/.order",
1317 (const char *)data);
1318 od = e_order_new(buf);
1320 e_order_append(od, bd->desktop);
1321 e_object_del(E_OBJECT(od));
1323 /*vim:ts=8 sw=3 sts=3 expandtab cino=>5n-3f0^-2{2(0W1st0*/