The problem that e17 couldn't move/resize window when the window fetch the rotation...
[platform/core/uifw/e17.git] / src / bin / e_int_border_menu.c
1 #include "e.h"
2
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_maximize_left(void *data, E_Menu *m, E_Menu_Item *mi);
17 static void _e_border_menu_cb_maximize_right(void *data, E_Menu *m, E_Menu_Item *mi);
18 static void _e_border_menu_cb_unmaximize(void *data, E_Menu *m, E_Menu_Item *mi);
19 static void _e_border_menu_cb_shade(void *data, E_Menu *m, E_Menu_Item *mi);
20 static void _e_border_menu_cb_resistance(void *data, E_Menu *m, E_Menu_Item *mi);
21 static void _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi);
22 static void _e_border_menu_cb_application_pre(void *data, E_Menu *m, E_Menu_Item *mi);
23 static void _e_border_menu_cb_window_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi);
24 static void _e_border_menu_cb_prop(void *data, E_Menu *m, E_Menu_Item *mi);
25 static void _e_border_menu_cb_stick(void *data, E_Menu *m, E_Menu_Item *mi);
26 static void _e_border_menu_cb_stacking_pre(void *data, E_Menu *m, E_Menu_Item *mi);
27 static void _e_border_menu_cb_on_top(void *data, E_Menu *m, E_Menu_Item *mi);
28 static void _e_border_menu_cb_normal(void *data, E_Menu *m, E_Menu_Item *mi);
29 static void _e_border_menu_cb_below(void *data, E_Menu *m, E_Menu_Item *mi);
30 static void _e_border_menu_cb_fullscreen(void *data, E_Menu *m, E_Menu_Item *mi);
31 static void _e_border_menu_cb_skip_winlist(void *data, E_Menu *m, E_Menu_Item *mi);
32 static void _e_border_menu_cb_skip_pager(void *data, E_Menu *m, E_Menu_Item *mi);
33 static void _e_border_menu_cb_skip_taskbar(void *data, E_Menu *m, E_Menu_Item *mi);
34 static void _e_border_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi);
35 static void _e_border_menu_cb_sendto_pre(void *data, E_Menu *m, E_Menu_Item *mi);
36 static void _e_border_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi);
37 static void _e_border_menu_cb_pin(void *data, E_Menu *m, E_Menu_Item *mi);
38 static void _e_border_menu_cb_unpin(void *data, E_Menu *m, E_Menu_Item *mi);
39 static void _e_border_menu_cb_raise(void *data, E_Menu *m, E_Menu_Item *mi);
40 static void _e_border_menu_cb_lower(void *data, E_Menu *m, E_Menu_Item *mi);
41 static void _e_border_menu_cb_skip_pre(void *data, E_Menu *m, E_Menu_Item *mi);
42 static void _e_border_menu_cb_fav_add(void *data, E_Menu *m, E_Menu_Item *mi);
43 static void _e_border_menu_cb_kbdshrtct_add(void *data, E_Menu *m, E_Menu_Item *mi);
44 static void _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m, E_Menu_Item *mi);
45 static void _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi);
46 static void _e_border_menu_cb_border_pre(void *data, E_Menu *m, E_Menu_Item *mi);
47 static void _e_border_menu_cb_iconpref_e(void *data, E_Menu *m, E_Menu_Item *mi);
48 static void _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m, E_Menu_Item *mi);
49 static void _e_border_menu_cb_iconpref_user(void *data, E_Menu *m, E_Menu_Item *mi);
50 static void _e_border_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi);
51 static void _e_border_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi);
52
53 static Eina_List *menu_hooks = NULL;
54
55 EAPI E_Border_Menu_Hook *
56 e_int_border_menu_hook_add(E_Border_Menu_Hook_Cb cb, const void *data)
57 {
58    E_Border_Menu_Hook *h;
59
60    if (!cb) return NULL;
61    h = E_NEW(E_Border_Menu_Hook, 1);
62    if (!h) return NULL;
63
64    h->cb = cb;
65    h->data = (void*)data;
66    menu_hooks = eina_list_append(menu_hooks, h);
67    return h;
68 }
69
70 EAPI void
71 e_int_border_menu_hook_del(E_Border_Menu_Hook *hook)
72 {
73    E_Border_Menu_Hook *h;
74    Eina_List *l;
75
76    if (!hook) return;
77
78    EINA_LIST_FOREACH(menu_hooks, l, h)
79      if (h == hook)
80        {
81           menu_hooks = eina_list_remove_list(menu_hooks, l);
82           free(h);
83           return;
84        }
85 }
86
87 EAPI void
88 e_int_border_menu_hooks_clear(void)
89 {
90    E_Border_Menu_Hook *h;
91    EINA_LIST_FREE(menu_hooks, h)
92      free(h);
93 }
94
95 EAPI void
96 e_int_border_menu_create(E_Border *bd)
97 {
98    E_Menu *m;
99    E_Menu_Item *mi;
100    Eina_List *l;
101    E_Border_Menu_Hook *h;
102    char buf[128];
103
104    if (bd->border_menu) return;
105
106    m = e_menu_new();
107    e_menu_category_set(m, "border");
108    e_menu_category_data_set("border", bd);
109    e_object_data_set(E_OBJECT(m), bd);
110    bd->border_menu = m;
111    e_menu_post_deactivate_callback_set(m, _e_border_cb_border_menu_end, NULL);
112
113    if (!bd->internal)
114      {
115         if (bd->client.icccm.class)
116           snprintf(buf, sizeof(buf), "%s", bd->client.icccm.class);
117         else
118           snprintf(buf, sizeof(buf), _("Application"));
119         mi = e_menu_item_new(m);
120         e_menu_item_label_set(mi, buf);
121         e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_application_pre, bd);
122         if (bd->desktop)
123           e_util_desktop_menu_item_icon_add(bd->desktop, 16, mi);
124      }
125
126    mi = e_menu_item_new(m);
127    e_menu_item_label_set(mi, _("Window"));
128    e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_window_pre, bd);
129    e_menu_item_icon_edje_set(mi,
130                              e_theme_edje_file_get("base/theme/borders",
131                                                    "e/widgets/border/default/window"),
132                              "e/widgets/border/default/window");
133
134    mi = e_menu_item_new(m);
135    e_menu_item_separator_set(mi, 1);
136
137    if ((!bd->sticky) && ((bd->zone->desk_x_count > 1) || (bd->zone->desk_y_count > 1)))
138      {
139         mi = e_menu_item_new(m);
140         e_menu_item_label_set(mi, _("Move to"));
141         e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_cb_sendto_pre, bd);
142         e_menu_item_icon_edje_set(mi,
143                                   e_theme_edje_file_get("base/theme/borders",
144                                                         "e/widgets/border/default/sendto"),
145                                   "e/widgets/border/default/sendto");
146      }
147
148    mi = e_menu_item_new(m);
149    e_menu_item_label_set(mi, _("Always on Top"));
150    e_menu_item_check_set(mi, 1);
151    e_menu_item_toggle_set(mi, (bd->layer == 150 ? 1 : 0));
152    if (bd->layer == 150)
153      e_menu_item_callback_set(mi, _e_border_menu_cb_normal, bd);
154    else
155      e_menu_item_callback_set(mi, _e_border_menu_cb_on_top, bd);
156    e_menu_item_icon_edje_set(mi,
157                              e_theme_edje_file_get("base/theme/borders",
158                                                    "e/widgets/border/default/stack_on_top"),
159                              "e/widgets/border/default/stack_on_top");
160
161    if (!bd->lock_user_sticky)
162      {
163         mi = e_menu_item_new(m);
164         e_menu_item_label_set(mi, _("Sticky"));
165         e_menu_item_check_set(mi, 1);
166         e_menu_item_toggle_set(mi, (bd->sticky ? 1 : 0));
167         e_menu_item_callback_set(mi, _e_border_menu_cb_stick, bd);
168         e_menu_item_icon_edje_set(mi,
169                                   e_theme_edje_file_get("base/theme/borders",
170                                                         "e/widgets/border/default/stick"),
171                                   "e/widgets/border/default/stick");
172      }
173
174    if ((!bd->lock_user_shade) && (!bd->fullscreen) && (!bd->maximized) &&
175        ((!bd->client.border.name) || (strcmp("borderless", bd->client.border.name))))
176      {
177         mi = e_menu_item_new(m);
178         e_menu_item_label_set(mi, _("Shade"));
179         e_menu_item_check_set(mi, 1);
180         e_menu_item_toggle_set(mi, (bd->shaded ? 1 : 0));
181         e_menu_item_callback_set(mi, _e_border_menu_cb_shade, bd);
182         e_menu_item_icon_edje_set(mi,
183                                   e_theme_edje_file_get("base/theme/borders",
184                                                         "e/widgets/border/default/shade"),
185                                   "e/widgets/border/default/shade");
186      }
187
188    if (!bd->lock_close)
189      {
190         mi = e_menu_item_new(m);
191         e_menu_item_separator_set(mi, 1);
192
193         mi = e_menu_item_new(m);
194         e_menu_item_label_set(mi, _("Close"));
195         e_menu_item_callback_set(mi, _e_border_menu_cb_close, bd);
196         e_menu_item_icon_edje_set(mi,
197                                   e_theme_edje_file_get("base/theme/borders",
198                                                         "e/widgets/border/default/close"),
199                                   "e/widgets/border/default/close");
200      }
201    EINA_LIST_FOREACH(menu_hooks, l, h)
202      h->cb(h->data, bd);
203 }
204
205 EAPI void
206 e_int_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key, Ecore_X_Time timestamp)
207 {
208    e_int_border_menu_create(bd);
209    if (key)
210      e_menu_activate_key(bd->border_menu, bd->zone, x, y, 1, 1,
211                          E_MENU_POP_DIRECTION_DOWN);
212    else
213      e_menu_activate_mouse(bd->border_menu, bd->zone, x, y, 1, 1,
214                            E_MENU_POP_DIRECTION_DOWN, timestamp);
215 }
216
217 EAPI void
218 e_int_border_menu_del(E_Border *bd)
219 {
220    if (bd->border_menu)
221      {
222         e_object_del(E_OBJECT(bd->border_menu));
223         bd->border_menu = NULL;
224      }
225 }
226
227 static void
228 _e_border_cb_border_menu_end(void *data __UNUSED__, E_Menu *m)
229 {
230    E_Border *bd;
231
232    bd = e_object_data_get(E_OBJECT(m));
233    if (bd)
234      {
235         /* If the border exists, delete all associated menus */
236         e_int_border_menu_del(bd);
237      }
238    else
239      {
240         /* Just delete this menu */
241         e_object_del(E_OBJECT(m));
242      }
243 }
244
245 static void
246 _e_border_menu_cb_locks(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
247 {
248    E_Border *bd;
249
250    bd = data;
251    if (bd->border_locks_dialog)
252      {
253         e_border_desk_set(bd->border_locks_dialog->dia->win->border, bd->desk);
254         e_win_raise(bd->border_locks_dialog->dia->win);
255         e_border_focus_set(bd->border_locks_dialog->dia->win->border, 1, 1);
256         return;
257      }
258    e_int_border_locks(bd);
259 }
260
261 static void
262 _e_border_menu_cb_remember(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
263 {
264    E_Border *bd;
265
266    bd = data;
267    if (bd->border_remember_dialog)
268      {
269         e_border_desk_set(bd->border_remember_dialog->dia->win->border, bd->desk);
270         e_win_raise(bd->border_remember_dialog->dia->win);
271         e_border_focus_set(bd->border_remember_dialog->dia->win->border, 1, 1);
272         return;
273      }
274    e_int_border_remember(bd);
275 }
276
277 static void
278 _e_border_menu_cb_border(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
279 {
280    E_Border *bd;
281    char buf[256];
282
283    bd = data;
284    if (bd->border_border_dialog)
285      {
286         e_border_desk_set(bd->border_border_dialog->dia->win->border, bd->desk);
287         e_win_raise(bd->border_border_dialog->dia->win);
288         e_border_focus_set(bd->border_border_dialog->dia->win->border, 1, 1);
289         return;
290      }
291    snprintf(buf, sizeof(buf), "%p", bd);
292    e_configure_registry_call("internal/borders_border", bd->zone->container, buf);
293 }
294
295 static void
296 _e_border_menu_cb_close(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
297 {
298    E_Border *bd;
299
300    bd = data;
301    if (!bd->lock_close) e_border_act_close_begin(bd);
302 }
303
304 static void
305 _e_border_menu_cb_iconify(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
306 {
307    E_Border *bd;
308
309    bd = data;
310    if (!bd->lock_user_iconify)
311      {
312         if (bd->iconic)
313           e_border_uniconify(bd);
314         else
315           e_border_iconify(bd);
316      }
317 }
318
319 static void
320 _e_border_menu_cb_kill(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
321 {
322    E_Action *a;
323    E_Border *bd;
324
325    bd = data;
326    if ((bd->lock_close) || (bd->internal)) return;
327
328    a = e_action_find("window_kill");
329    if ((a) && (a->func.go)) a->func.go(NULL, NULL);
330 }
331
332 static void
333 _e_border_menu_cb_move(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
334 {
335    E_Border *bd;
336
337    bd = data;
338
339    if (!bd->lock_user_location)
340      e_border_act_move_keyboard(bd);
341 }
342
343 static void
344 _e_border_menu_cb_resize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
345 {
346    E_Border *bd;
347
348    bd = data;
349
350    if (!bd->lock_user_size)
351      e_border_act_resize_keyboard(bd);
352 }
353
354 static void
355 _e_border_menu_cb_maximize_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
356 {
357    E_Menu *subm;
358    E_Menu_Item *submi;
359    E_Border *bd;
360
361    if (!(bd = data)) return;
362
363    subm = e_menu_new();
364    e_object_data_set(E_OBJECT(subm), bd);
365    e_menu_item_submenu_set(mi, subm);
366    e_object_unref(E_OBJECT(subm));
367
368    if ((!bd->lock_user_fullscreen) && (!bd->shaded))
369      {
370         submi = e_menu_item_new(subm);
371         e_menu_item_label_set(submi, _("Fullscreen"));
372         e_menu_item_check_set(submi, 1);
373         e_menu_item_toggle_set(submi, bd->fullscreen);
374         e_menu_item_callback_set(submi, _e_border_menu_cb_fullscreen, bd);
375         e_menu_item_icon_edje_set(submi,
376                                   e_theme_edje_file_get("base/theme/borders",
377                                                         "e/widgets/border/default/fullscreen"),
378                                   "e/widgets/border/default/fullscreen");
379      }
380
381    if (!bd->fullscreen)
382      {
383         submi = e_menu_item_new(subm);
384         e_menu_item_label_set(submi, _("Maximize"));
385         e_menu_item_radio_set(submi, 1);
386         e_menu_item_radio_group_set(submi, 3);
387         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_BOTH);
388         e_menu_item_callback_set(submi, _e_border_menu_cb_maximize, bd);
389         e_menu_item_icon_edje_set(submi,
390                                   e_theme_edje_file_get("base/theme/borders",
391                                                         "e/widgets/border/default/maximize"),
392                                   "e/widgets/border/default/maximize");
393
394         submi = e_menu_item_new(subm);
395         e_menu_item_label_set(submi, _("Maximize vertically"));
396         e_menu_item_radio_set(submi, 1);
397         e_menu_item_radio_group_set(submi, 3);
398         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_VERTICAL);
399         e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_vertically, bd);
400         e_menu_item_icon_edje_set(submi,
401                                   e_theme_edje_file_get("base/theme/borders",
402                                                         "e/widgets/border/default/maximize"),
403                                   "e/widgets/border/default/maximize");
404
405         submi = e_menu_item_new(subm);
406         e_menu_item_label_set(submi, _("Maximize horizontally"));
407         e_menu_item_radio_set(submi, 1);
408         e_menu_item_radio_group_set(submi, 3);
409         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_HORIZONTAL);
410         e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_horizontally, bd);
411         e_menu_item_icon_edje_set(submi,
412                                   e_theme_edje_file_get("base/theme/borders",
413                                                         "e/widgets/border/default/maximize"),
414                                   "e/widgets/border/default/maximize");
415
416         submi = e_menu_item_new(subm);
417         e_menu_item_label_set(submi, _("Maximize left"));
418         e_menu_item_radio_set(submi, 1);
419         e_menu_item_radio_group_set(submi, 3);
420         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_LEFT);
421         e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_left, bd);
422         e_menu_item_icon_edje_set(submi,
423                                   e_theme_edje_file_get("base/theme/borders",
424                                                         "e/widgets/border/default/maximize"),
425                                   "e/widgets/border/default/maximize");
426
427         submi = e_menu_item_new(subm);
428         e_menu_item_label_set(submi, _("Maximize right"));
429         e_menu_item_radio_set(submi, 1);
430         e_menu_item_radio_group_set(submi, 3);
431         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_RIGHT);
432         e_menu_item_callback_set(submi, _e_border_menu_cb_maximize_right, bd);
433         e_menu_item_icon_edje_set(submi,
434                                   e_theme_edje_file_get("base/theme/borders",
435                                                         "e/widgets/border/default/maximize"),
436                                   "e/widgets/border/default/maximize");
437
438         submi = e_menu_item_new(subm);
439         e_menu_item_label_set(submi, _("Unmaximize"));
440         e_menu_item_radio_set(submi, 1);
441         e_menu_item_radio_group_set(submi, 3);
442         e_menu_item_toggle_set(submi, (bd->maximized & E_MAXIMIZE_DIRECTION) == E_MAXIMIZE_NONE);
443         e_menu_item_callback_set(submi, _e_border_menu_cb_unmaximize, bd);
444         e_menu_item_icon_edje_set(submi,
445                                   e_theme_edje_file_get("base/theme/borders",
446                                                         "e/widgets/border/default/maximize"),
447                                   "e/widgets/border/default/maximize");
448      }
449 }
450
451 static void
452 _e_border_menu_cb_maximize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
453 {
454    E_Border *bd;
455
456    bd = data;
457    if (!bd->lock_user_maximize)
458      e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
459                        E_MAXIMIZE_BOTH);
460 }
461
462 static void
463 _e_border_menu_cb_maximize_vertically(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
464 {
465    E_Border *bd;
466
467    bd = data;
468    if (!bd->lock_user_maximize)
469      {
470         if ((bd->maximized & E_MAXIMIZE_HORIZONTAL))
471           e_border_unmaximize(bd, E_MAXIMIZE_HORIZONTAL);
472         e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
473                           E_MAXIMIZE_VERTICAL);
474      }
475 }
476
477 static void
478 _e_border_menu_cb_maximize_horizontally(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
479 {
480    E_Border *bd;
481
482    bd = data;
483    if (!bd->lock_user_maximize)
484      {
485         if ((bd->maximized & E_MAXIMIZE_VERTICAL))
486           e_border_unmaximize(bd, E_MAXIMIZE_VERTICAL);
487         e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
488                           E_MAXIMIZE_HORIZONTAL);
489      }
490 }
491
492 static void
493 _e_border_menu_cb_maximize_left(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
494 {
495    E_Border *bd;
496
497    bd = data;
498    if (!bd->lock_user_maximize)
499      {
500         if ((bd->maximized & E_MAXIMIZE_DIRECTION))
501           e_border_unmaximize(bd, bd->maximized & E_MAXIMIZE_DIRECTION);
502         e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
503                           E_MAXIMIZE_LEFT);
504      }
505 }
506
507 static void
508 _e_border_menu_cb_maximize_right(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
509 {
510    E_Border *bd;
511
512    bd = data;
513    if (!bd->lock_user_maximize)
514      {
515         if ((bd->maximized & E_MAXIMIZE_DIRECTION))
516           e_border_unmaximize(bd, bd->maximized & E_MAXIMIZE_DIRECTION);
517         e_border_maximize(bd, (e_config->maximize_policy & E_MAXIMIZE_TYPE) |
518                           E_MAXIMIZE_RIGHT);
519      }
520 }
521
522 static void
523 _e_border_menu_cb_unmaximize(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
524 {
525    E_Border *bd;
526
527    bd = data;
528    e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
529 }
530
531 static void
532 _e_border_menu_cb_shade(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
533 {
534    E_Border *bd;
535
536    bd = data;
537    if (!bd->lock_user_shade)
538      {
539         if (bd->shaded)
540           e_border_unshade(bd, E_DIRECTION_UP);
541         else
542           e_border_shade(bd, E_DIRECTION_UP);
543      }
544 }
545
546 static void
547 _e_border_menu_cb_resistance(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
548 {
549    E_Border *bd;
550
551    bd = data;
552    bd->offer_resistance = !bd->offer_resistance;
553 }
554
555 static void
556 _e_border_menu_cb_icon_edit(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
557 {
558    E_Border *bd;
559
560    bd = data;
561    e_desktop_border_edit(m->zone->container, bd);
562 }
563
564 static void
565 _e_border_menu_cb_application_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
566 {
567    E_Menu *subm;
568    E_Menu_Item *submi;
569    E_Border *bd;
570
571    if (!(bd = data)) return;
572
573    subm = e_menu_new();
574    e_object_data_set(E_OBJECT(subm), bd);
575    e_menu_item_submenu_set(mi, subm);
576    e_object_unref(E_OBJECT(subm));
577
578    if (bd->desktop)
579      {
580         submi = e_menu_item_new(subm);
581         e_menu_item_label_set(submi, _("Edit Icon"));
582         e_menu_item_callback_set(submi, _e_border_menu_cb_icon_edit, bd);
583         e_util_desktop_menu_item_icon_add(bd->desktop, 16, submi);
584      }
585    else if (bd->client.icccm.class)
586      {
587         /* icons with no class useless to borders */
588         submi = e_menu_item_new(subm);
589         e_menu_item_label_set(submi, _("Create Icon"));
590         e_menu_item_callback_set(submi, _e_border_menu_cb_icon_edit, bd);
591      }
592
593    submi = e_menu_item_new(subm);
594    e_menu_item_separator_set(submi, 1);
595
596    submi = e_menu_item_new(subm);
597    e_menu_item_label_set(submi, _("Add to Favorites Menu"));
598    e_menu_item_callback_set(submi, _e_border_menu_cb_fav_add, bd);
599    e_util_menu_item_theme_icon_set(submi, "user-bookmarks");
600
601    submi = e_menu_item_new(subm);
602    e_menu_item_label_set(submi, _("Add to IBar"));
603    e_menu_item_submenu_pre_callback_set(submi,
604                                         _e_border_menu_cb_ibar_add_pre, bd);
605    e_util_menu_item_theme_icon_set(submi, "preferences-applications-ibar");
606
607    if (e_configure_registry_exists("keyboard_and_mouse/key_bindings"))
608      {
609         submi = e_menu_item_new(subm);
610         e_menu_item_label_set(submi, _("Create Keyboard Shortcut"));
611         e_menu_item_callback_set(submi, _e_border_menu_cb_kbdshrtct_add, bd);
612         e_util_menu_item_theme_icon_set(submi, "preferences-desktop-keyboard");
613      }
614 }
615
616 static void
617 _e_border_menu_cb_window_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
618 {
619    E_Menu *subm;
620    E_Menu_Item *submi;
621    E_Border *bd;
622
623    if (!(bd = data)) return;
624
625    subm = e_menu_new();
626    e_object_data_set(E_OBJECT(subm), bd);
627    e_menu_item_submenu_set(mi, subm);
628    e_object_unref(E_OBJECT(subm));
629
630    if ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
631        (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN))
632      {
633         if (!(((bd->client.icccm.min_w == bd->client.icccm.max_w) &&
634                (bd->client.icccm.min_h == bd->client.icccm.max_h)) ||
635               (bd->lock_user_maximize)))
636           {
637              if ((!bd->lock_user_maximize) && (!bd->shaded))
638                {
639                   submi = e_menu_item_new(subm);
640                   e_menu_item_label_set(submi, _("Maximize"));
641                   e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_maximize_pre, bd);
642                   e_menu_item_icon_edje_set(submi,
643                                             e_theme_edje_file_get("base/theme/borders",
644                                                                   "e/widgets/border/default/maximize"),
645                                             "e/widgets/border/default/maximize");
646                }
647           }
648
649         if ((!bd->lock_user_iconify) && (!bd->fullscreen))
650           {
651              submi = e_menu_item_new(subm);
652              e_menu_item_label_set(submi, _("Iconify"));
653              e_menu_item_callback_set(submi, _e_border_menu_cb_iconify, bd);
654              e_menu_item_icon_edje_set(submi,
655                                        e_theme_edje_file_get("base/theme/borders",
656                                                              "e/widgets/border/default/minimize"),
657                                        "e/widgets/border/default/minimize");
658           }
659      }
660
661    if ((!bd->lock_user_location) && (!bd->fullscreen) &&
662        (((bd->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip))
663      {
664         submi = e_menu_item_new(subm);
665         e_menu_item_label_set(submi, _("Move"));
666         e_menu_item_callback_set(submi, _e_border_menu_cb_move, bd);
667         e_menu_item_icon_edje_set(submi,
668                                   e_theme_edje_file_get("base/theme/borders",
669                                                         "e/widgets/border/default/move_icon"),
670                                   "e/widgets/border/default/move_icon");
671      }
672
673    if (((!bd->lock_user_size) && (!bd->fullscreen) &&
674         (((bd->maximized & E_MAXIMIZE_DIRECTION) != E_MAXIMIZE_BOTH) || e_config->allow_manip)) &&
675        ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
676         (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN)))
677      {
678         submi = e_menu_item_new(subm);
679         e_menu_item_label_set(submi, _("Resize"));
680         e_menu_item_callback_set(submi, _e_border_menu_cb_resize, bd);
681         e_menu_item_icon_edje_set(submi,
682                                   e_theme_edje_file_get("base/theme/borders",
683                                                         "e/widgets/border/default/resize_icon"),
684                                   "e/widgets/border/default/resize_icon");
685      }
686
687    submi = e_menu_item_new(subm);
688    e_menu_item_separator_set(submi, 1);
689
690    if ((!bd->lock_user_stacking) && (!bd->fullscreen))
691      {
692         submi = e_menu_item_new(subm);
693         e_menu_item_label_set(submi, _("Stacking"));
694         e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_stacking_pre, bd);
695         e_menu_item_icon_edje_set(submi,
696                                   e_theme_edje_file_get("base/theme/borders",
697                                                         "e/widgets/border/default/stacking"),
698                                   "e/widgets/border/default/stacking");
699      }
700
701    submi = e_menu_item_new(subm);
702    e_menu_item_label_set(submi, _("Skip"));
703    e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_skip_pre, bd);
704    e_menu_item_icon_edje_set(submi,
705                              e_theme_edje_file_get("base/theme/borders",
706                                                    "e/widgets/border/default/skip"),
707                              "e/widgets/border/default/skip");
708
709    if (!bd->lock_border)
710      {
711         submi = e_menu_item_new(subm);
712         e_menu_item_label_set(submi, _("Border"));
713         e_menu_item_submenu_pre_callback_set(submi, _e_border_menu_cb_border_pre, bd);
714         e_menu_item_icon_edje_set(submi,
715                                   e_theme_edje_file_get("base/theme/borders",
716                                                         "e/widgets/border/default/borderless"),
717                                   "e/widgets/border/default/borderless");
718      }
719
720    submi = e_menu_item_new(subm);
721    e_menu_item_separator_set(submi, 1);
722
723    submi = e_menu_item_new(subm);
724    e_menu_item_label_set(submi, _("Locks"));
725    e_menu_item_callback_set(submi, _e_border_menu_cb_locks, bd);
726    e_menu_item_icon_edje_set(submi,
727                              e_theme_edje_file_get("base/theme/borders",
728                                                    "e/widgets/border/default/locks"),
729                              "e/widgets/border/default/locks");
730
731    submi = e_menu_item_new(subm);
732    e_menu_item_label_set(submi, _("Remember"));
733    e_menu_item_callback_set(submi, _e_border_menu_cb_remember, bd);
734    e_menu_item_icon_edje_set(submi,
735                              e_theme_edje_file_get("base/theme/borders",
736                                                    "e/widgets/border/default/remember"),
737                              "e/widgets/border/default/remember");
738
739    submi = e_menu_item_new(subm);
740    e_menu_item_separator_set(submi, 1);
741
742    if ((!bd->internal) && (!bd->lock_close))
743      {
744         submi = e_menu_item_new(subm);
745         e_menu_item_label_set(submi, _("Kill"));
746         e_menu_item_callback_set(submi, _e_border_menu_cb_kill, bd);
747         e_menu_item_icon_edje_set(submi,
748                                   e_theme_edje_file_get("base/theme/borders",
749                                                         "e/widgets/border/default/kill"),
750                                   "e/widgets/border/default/kill");
751      }
752
753    submi = e_menu_item_new(subm);
754    e_menu_item_label_set(submi, _("ICCCM/NetWM"));
755    e_menu_item_callback_set(submi, _e_border_menu_cb_prop, bd);
756    e_menu_item_icon_edje_set(submi,
757                              e_theme_edje_file_get("base/theme/borders",
758                                                    "e/widgets/border/default/properties"),
759                              "e/widgets/border/default/properties");
760 }
761
762 static void
763 _e_border_menu_cb_prop(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
764 {
765    E_Border *bd;
766
767    bd = data;
768    e_int_border_prop(bd);
769 }
770
771 static void
772 _e_border_menu_cb_stick(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
773 {
774    E_Border *bd;
775
776    bd = data;
777    if (!bd->lock_user_sticky)
778      {
779         if (bd->sticky)
780           e_border_unstick(bd);
781         else
782           e_border_stick(bd);
783      }
784 }
785
786 static void
787 _e_border_menu_cb_on_top(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
788 {
789    E_Border *bd;
790
791    bd = data;
792    if (bd->layer != 150)
793      {
794         e_border_layer_set(bd, 150);
795         e_hints_window_stacking_set(bd, E_STACKING_ABOVE);
796      }
797 }
798
799 static void
800 _e_border_menu_cb_below(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
801 {
802    E_Border *bd;
803
804    bd = data;
805    if (bd->layer != 50)
806      {
807         e_border_layer_set(bd, 50);
808         e_hints_window_stacking_set(bd, E_STACKING_BELOW);
809      }
810 }
811
812 static void
813 _e_border_menu_cb_normal(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
814 {
815    E_Border *bd;
816
817    bd = data;
818    if (bd->layer != 100)
819      {
820         e_border_layer_set(bd, 100);
821         e_hints_window_stacking_set(bd, E_STACKING_NONE);
822      }
823 }
824
825 static void
826 _e_border_menu_cb_fullscreen(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
827 {
828    E_Border *bd;
829    int toggle;
830
831    if (!(bd = data)) return;
832
833    if (!bd->lock_user_fullscreen)
834      {
835         toggle = e_menu_item_toggle_get(mi);
836         if (toggle)
837           e_border_fullscreen(bd, e_config->fullscreen_policy);
838         else
839           e_border_unfullscreen(bd);
840      }
841 }
842
843 static void
844 _e_border_menu_cb_skip_winlist(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
845 {
846    E_Border *bd;
847
848    if (!(bd = data)) return;
849
850    if (((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus)) &&
851        (!bd->client.netwm.state.skip_taskbar))
852      bd->user_skip_winlist = e_menu_item_toggle_get(mi);
853    else
854      bd->user_skip_winlist = 0;
855    bd->changed = 1;
856    e_remember_update(bd);
857 }
858
859 static void
860 _e_border_menu_cb_skip_pager(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
861 {
862    E_Border *bd;
863
864    if (!(bd = data)) return;
865
866    if ((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus))
867      bd->client.netwm.state.skip_pager = e_menu_item_toggle_get(mi);
868    else
869      bd->client.netwm.state.skip_pager = 0;
870    bd->changed = 1;
871    e_remember_update(bd);
872 }
873
874 static void
875 _e_border_menu_cb_skip_taskbar(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
876 {
877    E_Border *bd;
878
879    if (!(bd = data)) return;
880
881    if ((bd->client.icccm.accepts_focus) || (bd->client.icccm.take_focus))
882      bd->client.netwm.state.skip_taskbar = e_menu_item_toggle_get(mi);
883    else
884      bd->client.netwm.state.skip_taskbar = 0;
885    bd->changed = 1;
886    e_remember_update(bd);
887 }
888
889 static void
890 _e_border_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi)
891 {
892    E_Desk *desk = NULL;
893    Evas_Object *o = NULL;
894    const char *bgfile = NULL;
895    int tw = 0, th = 0;
896
897    desk = data;
898    E_OBJECT_CHECK(desk);
899
900    tw = 50;
901    th = (tw * desk->zone->h) / desk->zone->w;
902    bgfile = e_bg_file_get(desk->zone->container->num, desk->zone->num,
903                           desk->x, desk->y);
904    o = e_thumb_icon_add(m->evas);
905    e_thumb_icon_file_set(o, bgfile, "e/desktop/background");
906    e_thumb_icon_size_set(o, tw, th);
907    e_thumb_icon_begin(o);
908    mi->icon_object = o;
909 }
910
911 static void
912 _e_border_menu_cb_sendto_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
913 {
914    E_Menu *subm;
915    E_Menu_Item *submi;
916    E_Border *bd;
917    E_Desk *desk_cur;
918    E_Zone *zone;
919    Eina_List *l = NULL;
920    char buf[128];
921    int zones, i;
922
923    bd = data;
924    desk_cur = e_desk_current_get(bd->zone);
925    zones = eina_list_count(bd->zone->container->zones);
926
927    subm = e_menu_new();
928    e_object_data_set(E_OBJECT(subm), bd);
929    e_menu_item_submenu_set(mi, subm);
930    e_object_unref(E_OBJECT(subm));
931
932    EINA_LIST_FOREACH(bd->zone->container->zones, l, zone)
933      {
934         if (zones > 1)
935           {
936              snprintf(buf, sizeof(buf), _("Screen %d"), zone->num);
937              submi = e_menu_item_new(subm);
938              e_menu_item_label_set(submi, buf);
939              e_menu_item_disabled_set(submi, EINA_TRUE);
940           }
941
942 // FIXME: Remove labels and add deskpreview to menu.
943 // Evas_Object *o = e_widget_deskpreview_add(m->evas, 4, 2);
944
945         for (i = 0; i < zone->desk_x_count * zone->desk_y_count; i++)
946           {
947              E_Desk *desk;
948
949              desk = zone->desks[i];
950              submi = e_menu_item_new(subm);
951              e_menu_item_label_set(submi, desk->name);
952              e_menu_item_radio_set(submi, 1);
953              e_menu_item_radio_group_set(submi, 2);
954              if ((bd->zone == zone) && (desk_cur == desk))
955                e_menu_item_toggle_set(submi, 1);
956              else
957                e_menu_item_callback_set(submi, _e_border_menu_cb_sendto, desk);
958              e_menu_item_realize_callback_set(submi, _e_border_menu_cb_sendto_icon_pre,
959                                               desk);
960           }
961      }
962 }
963
964 static void
965 _e_border_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
966 {
967    E_Desk *desk;
968    E_Border *bd;
969
970    desk = data;
971    bd = e_object_data_get(E_OBJECT(m));
972    if ((bd) && (desk))
973      {
974         e_border_zone_set(bd, desk->zone);
975         e_border_desk_set(bd, desk);
976      }
977 }
978
979 static void
980 _e_border_menu_cb_pin(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
981 {
982    E_Border *bd;
983
984    bd = e_object_data_get(E_OBJECT(m));
985    if (bd) e_border_pinned_set(bd, 1);
986 }
987
988 static void
989 _e_border_menu_cb_unpin(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
990 {
991    E_Border *bd;
992
993    bd = e_object_data_get(E_OBJECT(m));
994    if (bd) e_border_pinned_set(bd, 0);
995 }
996
997 static void
998 _e_border_menu_cb_stacking_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
999 {
1000    E_Menu *subm;
1001    E_Menu_Item *submi;
1002    E_Border *bd;
1003
1004    if (!(bd = data)) return;
1005
1006    subm = e_menu_new();
1007    e_object_data_set(E_OBJECT(subm), bd);
1008    e_menu_item_submenu_set(mi, subm);
1009    e_object_unref(E_OBJECT(subm));
1010
1011    /* Only allow to change layer for windows in "normal" layers */
1012    e_menu_category_set(subm, "border/stacking");
1013    e_menu_category_data_set("border/stacking", bd);
1014
1015    submi = e_menu_item_new(subm);
1016    e_menu_item_label_set(submi, _("Always on Top"));
1017    e_menu_item_radio_set(submi, 1);
1018    e_menu_item_radio_group_set(submi, 2);
1019    e_menu_item_toggle_set(submi, (bd->layer == 150 ? 1 : 0));
1020    e_menu_item_callback_set(submi, _e_border_menu_cb_on_top, bd);
1021    e_menu_item_icon_edje_set(submi,
1022                              e_theme_edje_file_get("base/theme/borders",
1023                                                    "e/widgets/border/default/stack_on_top"),
1024                              "e/widgets/border/default/stack_on_top");
1025
1026    submi = e_menu_item_new(subm);
1027    e_menu_item_label_set(submi, _("Normal"));
1028    e_menu_item_radio_set(submi, 1);
1029    e_menu_item_radio_group_set(submi, 2);
1030    e_menu_item_toggle_set(submi, (bd->layer == 100 ? 1 : 0));
1031    e_menu_item_callback_set(submi, _e_border_menu_cb_normal, bd);
1032    e_menu_item_icon_edje_set(submi,
1033                              e_theme_edje_file_get("base/theme/borders",
1034                                                    "e/widgets/border/default/stack_normal"),
1035                              "e/widgets/border/default/stack_normal");
1036
1037    submi = e_menu_item_new(subm);
1038    e_menu_item_label_set(submi, _("Always Below"));
1039    e_menu_item_radio_set(submi, 1);
1040    e_menu_item_radio_group_set(submi, 2);
1041    e_menu_item_toggle_set(submi, (bd->layer == 50 ? 1 : 0));
1042    e_menu_item_callback_set(submi, _e_border_menu_cb_below, bd);
1043    e_menu_item_icon_edje_set(submi,
1044                              e_theme_edje_file_get("base/theme/borders",
1045                                                    "e/widgets/border/default/stack_below"),
1046                              "e/widgets/border/default/stack_below");
1047
1048    submi = e_menu_item_new(subm);
1049    e_menu_item_separator_set(submi, 1);
1050
1051    // Only allow to change layer for windows in "normal" layers
1052    if ((!bd->lock_user_stacking) &&
1053        ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
1054      {
1055         submi = e_menu_item_new(subm);
1056         e_menu_item_label_set(submi, _("Raise"));
1057         e_menu_item_callback_set(submi, _e_border_menu_cb_raise, bd);
1058         e_menu_item_icon_edje_set(submi,
1059                                   e_theme_edje_file_get("base/theme/borders",
1060                                                         "e/widgets/border/default/stack_on_top"),
1061                                   "e/widgets/border/default/stack_on_top");
1062
1063         submi = e_menu_item_new(subm);
1064         e_menu_item_label_set(submi, _("Lower"));
1065         e_menu_item_callback_set(submi, _e_border_menu_cb_lower, bd);
1066         e_menu_item_icon_edje_set(submi,
1067                                   e_theme_edje_file_get("base/theme/borders",
1068                                                         "e/widgets/border/default/stack_below"),
1069                                   "e/widgets/border/default/stack_below");
1070      }
1071
1072    submi = e_menu_item_new(subm);
1073    e_menu_item_separator_set(submi, 1);
1074
1075    if ((bd->client.netwm.type == ECORE_X_WINDOW_TYPE_NORMAL) ||
1076        (bd->client.netwm.type == ECORE_X_WINDOW_TYPE_UNKNOWN))
1077      {
1078         if ((bd->client.netwm.state.stacking != E_STACKING_BELOW) ||
1079             (!bd->user_skip_winlist) || (!bd->borderless))
1080           {
1081              submi = e_menu_item_new(subm);
1082              e_menu_item_label_set(submi, _("Pin to Desktop"));
1083              e_menu_item_callback_set(submi, _e_border_menu_cb_pin, bd);
1084              e_menu_item_icon_edje_set(submi,
1085                                        e_theme_edje_file_get("base/theme/borders",
1086                                                              "e/widgets/border/default/stick"),
1087                                        "e/widgets/border/default/stick");
1088           }
1089         if ((bd->client.netwm.state.stacking == E_STACKING_BELOW) &&
1090             (bd->user_skip_winlist) && (bd->borderless))
1091           {
1092              submi = e_menu_item_new(subm);
1093              e_menu_item_label_set(submi, _("Unpin from Desktop"));
1094              e_menu_item_callback_set(submi, _e_border_menu_cb_unpin, bd);
1095              e_menu_item_icon_edje_set(submi,
1096                                        e_theme_edje_file_get("base/theme/borders",
1097                                                              "e/widgets/border/default/stick"),
1098                                        "e/widgets/border/default/stick");
1099           }
1100      }
1101 }
1102
1103 static void
1104 _e_border_menu_cb_raise(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1105 {
1106    E_Border *bd;
1107
1108    bd = data;
1109    if ((!bd->lock_user_stacking) && (!bd->internal) &&
1110        ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
1111      {
1112         e_border_raise(bd);
1113      }
1114 }
1115
1116 static void
1117 _e_border_menu_cb_lower(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1118 {
1119    E_Border *bd;
1120
1121    bd = data;
1122    if ((!bd->lock_user_stacking) && (!bd->internal) &&
1123        ((bd->layer == 50) || (bd->layer == 100) || (bd->layer == 150)))
1124      {
1125         e_border_lower(bd);
1126      }
1127 }
1128
1129 static void
1130 _e_border_menu_cb_default_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1131 {
1132    E_Border *bd;
1133    Evas_Object *o;
1134    unsigned char prev_icon_pref;
1135
1136    bd = data;
1137    E_OBJECT_CHECK(bd);
1138
1139    prev_icon_pref = bd->icon_preference;
1140    bd->icon_preference = E_ICON_PREF_E_DEFAULT;
1141    o = e_border_icon_add(bd, m->evas);
1142    bd->icon_preference = prev_icon_pref;
1143    mi->icon_object = o;
1144 }
1145
1146 static void
1147 _e_border_menu_cb_netwm_icon(void *data, E_Menu *m, E_Menu_Item *mi)
1148 {
1149    E_Border *bd;
1150    Evas_Object *o;
1151
1152    bd = data;
1153    E_OBJECT_CHECK(bd);
1154
1155    if (bd->client.netwm.icons)
1156      {
1157         o = e_icon_add(m->evas);
1158         e_icon_data_set(o, bd->client.netwm.icons[0].data,
1159                         bd->client.netwm.icons[0].width,
1160                         bd->client.netwm.icons[0].height);
1161         e_icon_alpha_set(o, 1);
1162         mi->icon_object = o;
1163      }
1164 }
1165
1166 static void
1167 _e_border_menu_cb_border_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1168 {
1169    E_Menu *subm;
1170    E_Menu_Item *submi;
1171    E_Border *bd;
1172
1173    if (!(bd = data)) return;
1174
1175    subm = e_menu_new();
1176    e_object_data_set(E_OBJECT(subm), bd);
1177    e_menu_item_submenu_set(mi, subm);
1178    e_object_unref(E_OBJECT(subm));
1179
1180    if (e_configure_registry_exists("internal/borders_border"))
1181      {
1182         submi = e_menu_item_new(subm);
1183         e_menu_item_label_set(submi, _("Select Border Style"));
1184         e_menu_item_callback_set(submi, _e_border_menu_cb_border, bd);
1185         e_menu_item_icon_edje_set(submi,
1186                                   e_theme_edje_file_get("base/theme/borders",
1187                                                         "e/widgets/border/default/borderless"),
1188                                   "e/widgets/border/default/borderless");
1189
1190         submi = e_menu_item_new(subm);
1191         e_menu_item_separator_set(submi, 1);
1192      }
1193
1194    submi = e_menu_item_new(subm);
1195    e_menu_item_label_set(submi, _("Use Enlightenment Default Icon Preference"));
1196    e_menu_item_radio_set(submi, 1);
1197    e_menu_item_radio_group_set(submi, 2);
1198    e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_E_DEFAULT ? 1 : 0));
1199    e_menu_item_realize_callback_set(submi, _e_border_menu_cb_default_icon, bd);
1200    e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_e, bd);
1201
1202    submi = e_menu_item_new(subm);
1203    e_menu_item_label_set(submi, _("Use Application Provided Icon"));
1204    e_menu_item_radio_set(submi, 1);
1205    e_menu_item_radio_group_set(submi, 2);
1206    e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_NETWM ? 1 : 0));
1207    e_menu_item_realize_callback_set(submi, _e_border_menu_cb_netwm_icon, bd);
1208    e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_netwm, bd);
1209
1210    submi = e_menu_item_new(subm);
1211    e_menu_item_label_set(submi, _("Use User Defined Icon"));
1212    e_menu_item_radio_set(submi, 1);
1213    e_menu_item_radio_group_set(submi, 2);
1214    e_menu_item_toggle_set(submi, (bd->icon_preference == E_ICON_PREF_USER ? 1 : 0));
1215    e_util_desktop_menu_item_icon_add(bd->desktop, 16, submi);
1216    e_menu_item_callback_set(submi, _e_border_menu_cb_iconpref_user, bd);
1217    e_menu_item_separator_set(submi, 1);
1218
1219    submi = e_menu_item_new(subm);
1220    e_menu_item_label_set(submi, _("Offer Resistance"));
1221    e_menu_item_check_set(submi, 1);
1222    e_menu_item_toggle_set(submi, (bd->offer_resistance ? 1 : 0));
1223    e_menu_item_callback_set(submi, _e_border_menu_cb_resistance, bd);
1224    e_menu_item_icon_edje_set(submi,
1225                              e_theme_edje_file_get("base/theme/borders",
1226                                                    "e/widgets/border/default/borderless"),
1227                              "e/widgets/border/default/borderless");
1228 }
1229
1230 static void
1231 _e_border_menu_cb_iconpref_e(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1232 {
1233    E_Border *bd;
1234
1235    if (!(bd = data)) return;
1236
1237    bd->icon_preference = E_ICON_PREF_E_DEFAULT;
1238    bd->changes.icon = 1;
1239    bd->changed = 1;
1240 }
1241
1242 static void
1243 _e_border_menu_cb_iconpref_user(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1244 {
1245    E_Border *bd;
1246
1247    if (!(bd = data)) return;
1248
1249    bd->icon_preference = E_ICON_PREF_USER;
1250    bd->changes.icon = 1;
1251    bd->changed = 1;
1252 }
1253
1254 static void
1255 _e_border_menu_cb_iconpref_netwm(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1256 {
1257    E_Border *bd;
1258
1259    if (!(bd = data)) return;
1260
1261    bd->icon_preference = E_ICON_PREF_NETWM;
1262    bd->changes.icon = 1;
1263    bd->changed = 1;
1264 }
1265
1266 static void
1267 _e_border_menu_cb_skip_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1268 {
1269    E_Border *bd;
1270    E_Menu *subm;
1271    E_Menu_Item *submi;
1272
1273    if (!(bd = data)) return;
1274
1275    subm = e_menu_new();
1276    e_object_data_set(E_OBJECT(subm), bd);
1277    e_menu_item_submenu_set(mi, subm);
1278    e_object_unref(E_OBJECT(subm));
1279
1280    submi = e_menu_item_new(subm);
1281    e_menu_item_label_set(submi, _("Window List"));
1282    e_menu_item_check_set(submi, 1);
1283    e_menu_item_toggle_set(submi, bd->user_skip_winlist);
1284    e_menu_item_callback_set(submi, _e_border_menu_cb_skip_winlist, bd);
1285    e_menu_item_icon_edje_set(submi,
1286                              e_theme_edje_file_get("base/theme/borders",
1287                                                    "e/widgets/border/default/skip_winlist"),
1288                              "e/widgets/border/default/skip_winlist");
1289
1290    submi = e_menu_item_new(subm);
1291    e_menu_item_label_set(submi, _("Pager"));
1292    e_menu_item_check_set(submi, 1);
1293    e_menu_item_toggle_set(submi, bd->client.netwm.state.skip_pager);
1294    e_menu_item_callback_set(submi, _e_border_menu_cb_skip_pager, bd);
1295    e_menu_item_icon_edje_set(submi,
1296                              e_theme_edje_file_get("base/theme/borders",
1297                                                    "e/widgets/border/default/skip_pager"),
1298                              "e/widgets/border/default/skip_pager");
1299
1300    submi = e_menu_item_new(subm);
1301    e_menu_item_label_set(submi, _("Taskbar"));
1302    e_menu_item_check_set(submi, 1);
1303    e_menu_item_toggle_set(submi, bd->client.netwm.state.skip_taskbar);
1304    e_menu_item_callback_set(submi, _e_border_menu_cb_skip_taskbar, bd);
1305    e_menu_item_icon_edje_set(submi,
1306                              e_theme_edje_file_get("base/theme/borders",
1307                                                    "e/widgets/border/default/skip_taskbar"),
1308                              "e/widgets/border/default/skip_taskbar");
1309 }
1310
1311 static void
1312 _e_border_menu_cb_fav_add(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1313 {
1314    E_Border *bd;
1315    Efreet_Menu *menu;
1316    char buf[PATH_MAX];
1317
1318    if (!(bd = data)) return;
1319    e_user_dir_concat_static(buf, "applications/menu/favorite.menu");
1320    menu = efreet_menu_parse(buf);
1321    if (!menu)
1322      menu = efreet_menu_new("Favorites");
1323    if (!menu) return;
1324    efreet_menu_desktop_insert(menu, bd->desktop, -1);
1325    efreet_menu_save(menu, buf);
1326    efreet_menu_free(menu);
1327 }
1328
1329 static void
1330 _e_border_menu_cb_kbdshrtct_add(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1331 {
1332    E_Border *bd;
1333    E_Zone *zone;
1334
1335    if (!(bd = data)) return;
1336    zone = e_util_zone_current_get(e_manager_current_get());
1337    if (!zone) return;
1338    e_configure_registry_call("keyboard_and_mouse/key_bindings",
1339                              zone->container, bd->desktop->exec);
1340 }
1341
1342 static void
1343 _e_border_menu_cb_ibar_add_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
1344 {
1345    E_Menu *sm;
1346    E_Border *bd;
1347    Eina_List *dirs;
1348    Eina_List *l;
1349    char buf[PATH_MAX], *file;
1350    size_t len;
1351
1352    if (!(bd = data)) return;
1353    len = e_user_dir_concat_static(buf, "applications/bar");
1354    if (len + 1 >= sizeof(buf)) return;
1355    dirs = ecore_file_ls(buf);
1356    if (!dirs) return;
1357
1358    buf[len] = '/';
1359    len++;
1360
1361    sm = e_menu_new();
1362    EINA_LIST_FOREACH(dirs, l, file)
1363      {
1364         E_Menu_Item *smi;
1365
1366         if (file[0] == '.') continue;
1367
1368         eina_strlcpy(buf + len, file, sizeof(buf) - len);
1369         if (ecore_file_is_dir(buf))
1370           {
1371              smi = e_menu_item_new(sm);
1372              e_menu_item_label_set(smi, file);
1373              e_menu_item_callback_set(smi, _e_border_menu_cb_ibar_add, file);
1374           }
1375      }
1376    e_object_data_set(E_OBJECT(sm), bd);
1377    e_menu_item_submenu_set(mi, sm);
1378    e_object_unref(E_OBJECT(sm));
1379 }
1380
1381 static void
1382 _e_border_menu_cb_ibar_add(void *data, E_Menu *m, E_Menu_Item *mi __UNUSED__)
1383 {
1384    E_Order *od;
1385    E_Border *bd;
1386    char buf[PATH_MAX];
1387
1388    bd = e_object_data_get(E_OBJECT(m));
1389    if ((!bd) || (!bd->desktop)) return;
1390
1391    e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s/.order",
1392                        (const char *)data);
1393    od = e_order_new(buf);
1394    if (!od) return;
1395    e_order_append(od, bd->desktop);
1396    e_object_del(E_OBJECT(od));
1397 }
1398
1399 /*vim:ts=8 sw=3 sts=3 expandtab cino=>5n-3f0^-2{2(0W1st0*/