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