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