3 static void _e_shelf_new_dialog_ok(void *data, char *text);
4 static void _e_shelf_del_cb(void *d);
5 static void _e_shelf_free(E_Shelf *es);
6 static void _e_shelf_gadcon_min_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
7 static void _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
8 static Evas_Object *_e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style);
9 static void _e_shelf_toggle_border_fix(E_Shelf *es);
10 static void _e_shelf_cb_menu_config(void *data, E_Menu *m, E_Menu_Item *mi);
11 static void _e_shelf_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
12 static void _e_shelf_cb_menu_contents(void *data, E_Menu *m, E_Menu_Item *mi);
13 static void _e_shelf_cb_confirm_dialog_yes(void *data);
14 static void _e_shelf_cb_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi);
15 static void _e_shelf_menu_append(E_Shelf *es, E_Menu *mn);
16 static void _e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn);
17 static void _e_shelf_cb_locked_set(void *data, int lock);
18 static void _e_shelf_cb_urgent_show(void *data);
19 static void _e_shelf_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
20 static Eina_Bool _e_shelf_cb_mouse_in(void *data, int type, void *event);
21 //static Eina_Bool _e_shelf_cb_mouse_out(void *data, int type, void *event);
22 //static void _e_shelf_cb_mouse_out2(E_Shelf *es, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Out *ev);
23 static int _e_shelf_cb_id_sort(const void *data1, const void *data2);
24 static void _e_shelf_cb_menu_rename(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__);
25 static Eina_Bool _e_shelf_cb_hide_animator(void *data);
26 static Eina_Bool _e_shelf_cb_hide_animator_timer(void *data);
27 static Eina_Bool _e_shelf_cb_hide_urgent_timer(void *data);
28 static Eina_Bool _e_shelf_cb_instant_hide_timer(void *data);
29 static void _e_shelf_menu_pre_cb(void *data, E_Menu *m);
30 static void _e_shelf_gadcon_client_remove(void *data, E_Gadcon_Client *gcc);
31 static int _e_shelf_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc);
32 static const char *_e_shelf_orient_icon_name_get(E_Shelf *s);
33 static void _e_shelf_bindings_add(E_Shelf *es);
34 static void _e_shelf_bindings_del(E_Shelf *es);
35 static Eina_Bool _e_shelf_on_current_desk(E_Shelf *es, E_Event_Zone_Edge *ev);
36 static void _e_shelf_cb_dummy_del(E_Shelf *, Evas *e, Evas_Object *obj, void *event_info);
37 static void _e_shelf_cb_dummy_moveresize(E_Shelf *, Evas *e, Evas_Object *obj, void *event_info);
39 static Eina_List *shelves = NULL;
40 static Eina_List *dummies = NULL;
41 static Eina_Hash *winid_shelves = NULL;
43 static int orientations[] =
45 [E_GADCON_ORIENT_FLOAT] = 2,
46 [E_GADCON_ORIENT_HORIZ] = 2,
47 [E_GADCON_ORIENT_VERT] = 2,
48 [E_GADCON_ORIENT_LEFT] = 37,
49 [E_GADCON_ORIENT_RIGHT] = 31,
50 [E_GADCON_ORIENT_TOP] = 29,
51 [E_GADCON_ORIENT_BOTTOM] = 23,
52 [E_GADCON_ORIENT_CORNER_TL] = 19,
53 [E_GADCON_ORIENT_CORNER_TR] = 17,
54 [E_GADCON_ORIENT_CORNER_BL] = 13,
55 [E_GADCON_ORIENT_CORNER_BR] = 11,
56 [E_GADCON_ORIENT_CORNER_LT] = 7,
57 [E_GADCON_ORIENT_CORNER_RT] = 5,
58 [E_GADCON_ORIENT_CORNER_LB] = 3,
59 [E_GADCON_ORIENT_CORNER_RB] = 2
62 static const char *orient_names[] =
64 [E_GADCON_ORIENT_FLOAT] = "Float",
65 [E_GADCON_ORIENT_HORIZ] = "Horizontal",
66 [E_GADCON_ORIENT_VERT] = "Vertical",
67 [E_GADCON_ORIENT_LEFT] = "Left",
68 [E_GADCON_ORIENT_RIGHT] = "Right",
69 [E_GADCON_ORIENT_TOP] = "Top",
70 [E_GADCON_ORIENT_BOTTOM] = "Bottom",
71 [E_GADCON_ORIENT_CORNER_TL] = "Top-left Corner",
72 [E_GADCON_ORIENT_CORNER_TR] = "Top-right Corner",
73 [E_GADCON_ORIENT_CORNER_BL] = "Bottom-left Corner",
74 [E_GADCON_ORIENT_CORNER_BR] = "Bottom-right Corner",
75 [E_GADCON_ORIENT_CORNER_LT] = "Left-top Corner",
76 [E_GADCON_ORIENT_CORNER_RT] = "Right-top Corner",
77 [E_GADCON_ORIENT_CORNER_LB] = "Left-bottom Corner",
78 [E_GADCON_ORIENT_CORNER_RB] = "Right-bottom Corner"
81 EAPI int E_EVENT_SHELF_ADD = -1;
82 EAPI int E_EVENT_SHELF_DEL = -1;
84 /* externally accessible functions */
88 E_EVENT_SHELF_ADD = ecore_event_type_new();
89 E_EVENT_SHELF_DEL = ecore_event_type_new();
94 e_shelf_shutdown(void)
96 if (x_fatal) return 1;
101 es = eina_list_data_get(shelves);
102 e_object_del(E_OBJECT(es));
109 e_shelf_config_update(void)
112 E_Config_Shelf *cf_es;
119 es = eina_list_data_get(shelves);
120 e_object_del(E_OBJECT(es));
123 EINA_LIST_FOREACH(e_config->shelves, l, cf_es)
127 if (cf_es->id <= 0) cf_es->id = id + 1;
128 zone = e_util_container_zone_number_get(cf_es->container, cf_es->zone);
130 e_shelf_config_new(zone, cf_es);
136 e_shelf_list_all(void)
138 Eina_List *d = NULL, *s = NULL, *ret = NULL;
141 s = eina_list_clone(shelves);
143 d = eina_list_clone(dummies);
145 ret = eina_list_merge(s, d);
154 shelves = eina_list_sort(shelves, -1, _e_shelf_cb_id_sort);
159 e_shelf_zone_dummy_new(E_Zone *zone, Evas_Object *obj, int id)
163 es = E_OBJECT_ALLOC(E_Shelf, E_SHELF_DUMMY_TYPE, _e_shelf_free);
164 if (!es) return NULL;
166 evas_object_geometry_get(obj, &es->x, &es->y, &es->w, &es->h);
167 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
168 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_del, es);
169 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
170 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_moveresize, es);
171 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
172 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_moveresize, es);
176 es->cfg = E_NEW(E_Config_Shelf, 1);
178 e_object_del_attach_func_set(E_OBJECT(es), _e_shelf_del_cb);
179 dummies = eina_list_append(dummies, es);
185 e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, int layer, int id)
191 es = E_OBJECT_ALLOC(E_Shelf, E_SHELF_TYPE, _e_shelf_free);
192 if (!es) return NULL;
199 e_object_del_attach_func_set(E_OBJECT(es), _e_shelf_del_cb);
200 e_zone_useful_geometry_dirty(zone);
203 es->popup = e_popup_new(zone, es->x, es->y, es->w, es->h);
204 e_popup_name_set(es->popup, "shelf");
205 e_popup_layer_set(es->popup, layer);
206 es->ee = es->popup->ecore_evas;
207 es->evas = es->popup->evas;
211 es->ee = zone->container->bg_ecore_evas;
212 es->evas = zone->container->bg_evas;
217 es->o_event = evas_object_rectangle_add(es->evas);
218 evas_object_color_set(es->o_event, 0, 0, 0, 0);
219 evas_object_resize(es->o_event, es->w, es->h);
220 evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_DOWN,
221 _e_shelf_cb_mouse_down, es);
224 eina_list_append(es->handlers,
225 ecore_event_handler_add(E_EVENT_ZONE_EDGE_MOVE,
226 _e_shelf_cb_mouse_in, es));
227 es->o_base = edje_object_add(es->evas);
228 es->name = eina_stringshare_add(name);
229 evas_object_resize(es->o_base, es->w, es->h);
231 e_shelf_style_set(es, style);
235 evas_object_show(es->o_event);
236 evas_object_show(es->o_base);
237 ecore_x_netwm_window_type_set(es->popup->evas_win,
238 ECORE_X_WINDOW_TYPE_DOCK);
242 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
243 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
244 evas_object_layer_set(es->o_event, layer);
245 evas_object_layer_set(es->o_base, layer);
249 e_gadcon_swallowed_new(es->name, es->id, es->o_base, "e.swallow.content");
251 if (!name) locname = _("Shelf #");
252 snprintf(buf, sizeof(buf), "%s %i", locname, es->id);
253 es->gadcon->location =
254 e_gadcon_location_new(buf, E_GADCON_SITE_SHELF,
255 _e_shelf_gadcon_client_add, es,
256 _e_shelf_gadcon_client_remove, es);
257 e_gadcon_location_register(es->gadcon->location);
258 // hmm dnd in ibar and ibox kill this. ok. need to look into this more
259 // es->gadcon->instant_edit = 1;
260 e_gadcon_min_size_request_callback_set(es->gadcon,
261 _e_shelf_gadcon_min_size_request, es);
263 e_gadcon_size_request_callback_set(es->gadcon,
264 _e_shelf_gadcon_size_request, es);
265 e_gadcon_frame_request_callback_set(es->gadcon,
266 _e_shelf_gadcon_frame_request, es);
267 e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP);
268 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
269 e_shelf_orient_string_get(es));
270 edje_object_signal_emit(es->o_base, buf, "e");
271 edje_object_message_signal_process(es->o_base);
272 e_gadcon_zone_set(es->gadcon, zone);
273 e_gadcon_ecore_evas_set(es->gadcon, es->ee);
274 e_gadcon_shelf_set(es->gadcon, es);
278 winid_shelves = eina_hash_string_superfast_new(NULL);
279 eina_hash_add(winid_shelves,
280 e_util_winid_str_get(es->popup->evas_win), es);
281 e_drop_xdnd_register_set(es->popup->evas_win, 1);
282 e_gadcon_xdnd_window_set(es->gadcon, es->popup->evas_win);
283 e_gadcon_dnd_window_set(es->gadcon, es->popup->evas_win);
287 e_drop_xdnd_register_set(es->zone->container->bg_win, 1);
288 e_gadcon_xdnd_window_set(es->gadcon, es->zone->container->bg_win);
289 e_gadcon_dnd_window_set(es->gadcon, es->zone->container->event_win);
290 evas_object_clip_set(es->o_base, es->zone->bg_clip_object);
292 e_gadcon_util_menu_attach_func_set(es->gadcon,
293 _e_shelf_cb_menu_items_append, es);
295 e_gadcon_util_lock_func_set(es->gadcon,
296 _e_shelf_cb_locked_set, es);
297 e_gadcon_util_urgent_show_func_set(es->gadcon,
298 _e_shelf_cb_urgent_show, es);
300 shelves = eina_list_append(shelves, es);
306 es->hide_origin = -1;
311 ev = E_NEW(E_Event_Shelf, 1);
313 ecore_event_add(E_EVENT_SHELF_ADD, ev, NULL, NULL);
320 e_shelf_rename_dialog(E_Shelf *es)
323 if (es->rename_dialog) return;
324 _e_shelf_cb_menu_rename(es, NULL, NULL);
328 e_shelf_zone_move_resize_handle(E_Zone *zone)
334 EINA_LIST_FOREACH(shelves, l, es)
336 if (es->zone == zone)
341 if (gc->min_size_request.func)
343 /* let gadcon container decrease to any size */
344 edje_extern_object_min_size_set(gc->o_container, 0, 0);
346 evas_object_smart_callback_call(gc->o_container, "min_size_request", NULL);
347 e_shelf_position_calc(es);
348 if (gc->min_size_request.func)
350 evas_object_geometry_get(gc->o_container, NULL, NULL, &w, &h);
351 /* fix gadcon container min size to current geometry */
352 edje_extern_object_min_size_set(gc->o_container, w, h);
359 e_shelf_populate(E_Shelf *es)
362 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
363 e_gadcon_populate(es->gadcon);
367 e_shelf_show(E_Shelf *es)
370 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
372 e_popup_show(es->popup);
375 evas_object_show(es->o_event);
376 evas_object_show(es->o_base);
381 e_shelf_hide(E_Shelf *es)
384 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
386 e_popup_hide(es->popup);
389 evas_object_hide(es->o_event);
390 evas_object_hide(es->o_base);
395 e_shelf_locked_set(E_Shelf *es, int lock)
399 e_shelf_toggle(es, 1);
407 e_shelf_toggle(es, es->toggle);
412 e_shelf_name_set(E_Shelf *es, const char *name)
416 if (es->name == name) return;
417 eina_stringshare_replace(&es->name, name);
418 eina_stringshare_replace(&es->cfg->name, name);
419 if (es->dummy) return;
420 e_gadcon_name_set(es->gadcon, name);
424 e_shelf_toggle(E_Shelf *es, int show)
427 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
430 if (es->locked) return;
431 es->interrupted = -1;
433 if ((show) && (es->hidden))
436 edje_object_signal_emit(es->o_base, "e,state,visible", "e");
437 if (es->instant_delay >= 0.0)
439 _e_shelf_cb_instant_hide_timer(es);
441 ecore_timer_add(es->cfg->hide_timeout,
442 _e_shelf_cb_hide_urgent_timer, es);
448 ecore_timer_del(es->hide_timer);
449 es->hide_timer = NULL;
451 if (!es->hide_animator)
453 ecore_animator_add(_e_shelf_cb_hide_animator, es);
456 else if ((!show) && (!es->hidden) && (!es->gadcon->editing) &&
459 edje_object_signal_emit(es->o_base, "e,state,hidden", "e");
460 if (es->instant_delay >= 0.0)
464 ecore_timer_del(es->hide_timer);
465 es->hide_timer = NULL;
468 if (!es->instant_timer)
470 ecore_timer_add(es->instant_delay,
471 _e_shelf_cb_instant_hide_timer, es);
475 if (es->hide_animator)
477 es->interrupted = show;
481 if (es->hide_timer) ecore_timer_del(es->hide_timer);
483 ecore_timer_add(es->cfg->hide_timeout,
484 _e_shelf_cb_hide_animator_timer, es);
490 e_shelf_urgent_show(E_Shelf *es)
492 e_shelf_toggle(es, 1);
497 e_shelf_move(E_Shelf *es, int x, int y)
500 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
504 e_popup_move(es->popup, es->x, es->y);
507 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
508 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
513 e_shelf_resize(E_Shelf *es, int w, int h)
516 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
519 if (es->popup) e_popup_resize(es->popup, es->w, es->h);
520 evas_object_resize(es->o_event, es->w, es->h);
521 evas_object_resize(es->o_base, es->w, es->h);
525 e_shelf_move_resize(E_Shelf *es, int x, int y, int w, int h)
528 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
534 e_popup_move_resize(es->popup, es->x, es->y, es->w, es->h);
537 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
538 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
540 evas_object_resize(es->o_event, es->w, es->h);
541 evas_object_resize(es->o_base, es->w, es->h);
545 e_shelf_layer_set(E_Shelf *es, int layer)
548 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
552 e_popup_layer_set(es->popup, es->layer);
555 evas_object_layer_set(es->o_event, es->layer);
556 evas_object_layer_set(es->o_base, es->layer);
561 e_shelf_save(E_Shelf *es)
564 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
567 es->cfg->orient = es->gadcon->orient;
568 if (es->cfg->style) eina_stringshare_del(es->cfg->style);
569 es->cfg->style = eina_stringshare_add(es->style);
573 E_Config_Shelf *cf_es;
575 cf_es = E_NEW(E_Config_Shelf, 1);
576 cf_es->name = eina_stringshare_add(es->name);
577 cf_es->container = es->zone->container->num;
578 cf_es->zone = es->zone->num;
579 if (es->popup) cf_es->popup = 1;
580 cf_es->layer = es->layer;
581 e_config->shelves = eina_list_append(e_config->shelves, cf_es);
582 cf_es->orient = es->gadcon->orient;
583 cf_es->style = eina_stringshare_add(es->style);
584 cf_es->fit_along = es->fit_along;
585 cf_es->fit_size = es->fit_size;
588 cf_es->hide_timeout = 1.0;
589 cf_es->hide_duration = 1.0;
590 #ifdef _F_SHELF_INPUT_CONTROL_
591 cf_es->disable_menu = 0;
595 e_config_save_queue();
599 e_shelf_unsave(E_Shelf *es)
602 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
607 e_shelf_orient(E_Shelf *es, E_Gadcon_Orient orient)
612 E_OBJECT_IF_NOT_TYPE(es, E_SHELF_DUMMY_TYPE)
613 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
617 e_gadcon_orient(es->gadcon, orient);
618 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
619 e_shelf_orient_string_get(es));
620 edje_object_signal_emit(es->o_base, buf, "e");
621 edje_object_message_signal_process(es->o_base);
622 e_gadcon_location_set_icon_name(es->gadcon->location,
623 _e_shelf_orient_icon_name_get(es));
625 e_zone_useful_geometry_dirty(es->zone);
629 e_shelf_orient_string_get(E_Shelf *es)
631 const char *sig = "";
633 switch (es->gadcon->orient)
635 case E_GADCON_ORIENT_FLOAT:
639 case E_GADCON_ORIENT_HORIZ:
643 case E_GADCON_ORIENT_VERT:
647 case E_GADCON_ORIENT_LEFT:
651 case E_GADCON_ORIENT_RIGHT:
655 case E_GADCON_ORIENT_TOP:
659 case E_GADCON_ORIENT_BOTTOM:
663 case E_GADCON_ORIENT_CORNER_TL:
667 case E_GADCON_ORIENT_CORNER_TR:
671 case E_GADCON_ORIENT_CORNER_BL:
675 case E_GADCON_ORIENT_CORNER_BR:
676 sig = "bottom_right";
679 case E_GADCON_ORIENT_CORNER_LT:
683 case E_GADCON_ORIENT_CORNER_RT:
687 case E_GADCON_ORIENT_CORNER_LB:
691 case E_GADCON_ORIENT_CORNER_RB:
692 sig = "right_bottom";
702 e_shelf_position_calc(E_Shelf *es)
704 E_Gadcon_Orient orient = E_GADCON_ORIENT_FLOAT;
705 int size = (40 * e_scale);
709 orient = es->cfg->orient;
710 size = es->cfg->size * e_scale;
713 orient = es->gadcon->orient;
716 case E_GADCON_ORIENT_FLOAT:
717 if (!es->fit_along) es->w = es->zone->w;
718 if (!es->fit_size) es->h = size;
721 case E_GADCON_ORIENT_HORIZ:
722 if (!es->fit_along) es->w = es->zone->w;
723 if (!es->fit_size) es->h = size;
724 es->x = (es->zone->w - es->w) / 2;
727 case E_GADCON_ORIENT_VERT:
728 if (!es->fit_along) es->h = es->zone->h;
729 if (!es->fit_size) es->w = size;
730 es->y = (es->zone->h - es->h) / 2;
733 case E_GADCON_ORIENT_LEFT:
734 if (!es->fit_along) es->h = es->zone->h;
735 if (!es->fit_size) es->w = size;
737 es->y = (es->zone->h - es->h) / 2;
740 case E_GADCON_ORIENT_RIGHT:
741 if (!es->fit_along) es->h = es->zone->h;
742 if (!es->fit_size) es->w = size;
743 es->x = es->zone->w - es->w;
744 es->y = (es->zone->h - es->h) / 2;
747 case E_GADCON_ORIENT_TOP:
748 if (!es->fit_along) es->w = es->zone->w;
749 if (!es->fit_size) es->h = size;
750 es->x = (es->zone->w - es->w) / 2;
754 case E_GADCON_ORIENT_BOTTOM:
755 if (!es->fit_along) es->w = es->zone->w;
756 if (!es->fit_size) es->h = size;
757 es->x = (es->zone->w - es->w) / 2;
758 es->y = es->zone->h - es->h;
761 case E_GADCON_ORIENT_CORNER_TL:
762 if (!es->fit_along) es->w = es->zone->w;
763 if (!es->fit_size) es->h = size;
768 case E_GADCON_ORIENT_CORNER_TR:
769 if (!es->fit_along) es->w = es->zone->w;
770 if (!es->fit_size) es->h = size;
771 es->x = es->zone->w - es->w;
775 case E_GADCON_ORIENT_CORNER_BL:
776 if (!es->fit_along) es->w = es->zone->w;
777 if (!es->fit_size) es->h = size;
779 es->y = es->zone->h - es->h;
782 case E_GADCON_ORIENT_CORNER_BR:
783 if (!es->fit_along) es->w = es->zone->w;
784 if (!es->fit_size) es->h = size;
785 es->x = es->zone->w - es->w;
786 es->y = es->zone->h - es->h;
789 case E_GADCON_ORIENT_CORNER_LT:
790 if (!es->fit_along) es->h = es->zone->h;
791 if (!es->fit_size) es->w = size;
796 case E_GADCON_ORIENT_CORNER_RT:
797 if (!es->fit_along) es->h = es->zone->h;
798 if (!es->fit_size) es->w = size;
799 es->x = es->zone->w - es->w;
803 case E_GADCON_ORIENT_CORNER_LB:
804 if (!es->fit_along) es->h = es->zone->h;
805 if (!es->fit_size) es->w = size;
807 es->y = es->zone->h - es->h;
810 case E_GADCON_ORIENT_CORNER_RB:
811 if (!es->fit_along) es->h = es->zone->h;
812 if (!es->fit_size) es->w = size;
813 es->x = es->zone->w - es->w;
814 es->y = es->zone->h - es->h;
821 es->hide_origin = -1;
823 e_shelf_move_resize(es, es->x, es->y, es->w, es->h);
827 e_shelf_toggle(es, 0);
829 e_zone_useful_geometry_dirty(es->zone);
830 _e_shelf_bindings_add(es);
834 Eina_Bool err = EINA_FALSE;
837 if (!es->zone) break;
838 if ((!es->cfg->popup) || (!es->cfg->autohide)) break;
839 switch (es->cfg->orient)
841 case E_GADCON_ORIENT_LEFT:
842 case E_GADCON_ORIENT_CORNER_LT:
843 case E_GADCON_ORIENT_CORNER_LB:
844 if (!e_zone_exists_direction(es->zone, E_ZONE_EDGE_LEFT)) break;
847 case E_GADCON_ORIENT_RIGHT:
848 case E_GADCON_ORIENT_CORNER_RT:
849 case E_GADCON_ORIENT_CORNER_RB:
850 if (!e_zone_exists_direction(es->zone, E_ZONE_EDGE_RIGHT)) break;
853 case E_GADCON_ORIENT_TOP:
854 case E_GADCON_ORIENT_CORNER_TL:
855 case E_GADCON_ORIENT_CORNER_TR:
856 if (!e_zone_exists_direction(es->zone, E_ZONE_EDGE_TOP)) break;
859 case E_GADCON_ORIENT_BOTTOM:
860 case E_GADCON_ORIENT_CORNER_BL:
861 case E_GADCON_ORIENT_CORNER_BR:
862 if (!e_zone_exists_direction(es->zone, E_ZONE_EDGE_BOTTOM)) break;
867 e_util_dialog_show(_("Shelf Autohide Error"), _("Shelf autohiding will not work properly<br>"
868 "with the current configuration; set your shelf to<br>"
869 "\"Below Everything\" or disable autohiding."));
875 e_shelf_style_set(E_Shelf *es, const char *style)
881 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
883 if (!es->o_base) return;
884 if (style != es->style)
885 eina_stringshare_replace(&es->style, style);
888 snprintf(buf, sizeof(buf), "e/shelf/%s/base", style);
890 snprintf(buf, sizeof(buf), "e/shelf/%s/base", "default");
892 if (!e_theme_edje_object_set(es->o_base, "base/theme/shelf", buf))
893 e_theme_edje_object_set(es->o_base, "base/theme/shelf",
894 "e/shelf/default/base");
896 option = edje_object_data_get(es->o_base, "hidden_state_size");
898 es->hidden_state_size = atoi(option);
900 es->hidden_state_size = 4;
901 option = edje_object_data_get(es->o_base, "instant_delay");
903 es->instant_delay = atof(option);
905 es->instant_delay = -1.0;
907 if (es->popup) e_popup_edje_bg_object_set(es->popup, es->o_base);
909 if (!es->gadcon) return;
910 e_gadcon_unpopulate(es->gadcon);
911 e_gadcon_populate(es->gadcon);
915 e_shelf_popup_set(E_Shelf *es, int popup)
917 /* FIXME: Needs to recreate the evas objects. */
919 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
921 if (!es->cfg) return;
922 if (((popup) && (es->popup)) || ((!popup) && (!es->popup))) return;
926 evas_object_clip_unset(es->o_base);
927 es->popup = e_popup_new(es->zone, es->x, es->y, es->w, es->h);
928 e_popup_name_set(es->popup, "shelf");
929 e_popup_layer_set(es->popup, es->cfg->layer);
931 es->ee = es->popup->ecore_evas;
932 es->evas = es->popup->evas;
933 evas_object_show(es->o_event);
934 evas_object_show(es->o_base);
935 e_popup_edje_bg_object_set(es->popup, es->o_base);
936 ecore_x_netwm_window_type_set(es->popup->evas_win,
937 ECORE_X_WINDOW_TYPE_DOCK);
939 e_drop_xdnd_register_set(es->popup->evas_win, 1);
940 e_gadcon_xdnd_window_set(es->gadcon, es->popup->evas_win);
941 e_gadcon_dnd_window_set(es->gadcon, es->popup->evas_win);
945 e_drop_xdnd_register_set(es->popup->evas_win, 0);
946 e_object_del(E_OBJECT(es->popup));
949 es->ee = es->zone->container->bg_ecore_evas;
950 es->evas = es->zone->container->bg_evas;
952 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
953 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
954 evas_object_layer_set(es->o_event, es->cfg->layer);
955 evas_object_layer_set(es->o_base, es->cfg->layer);
957 e_drop_xdnd_register_set(es->zone->container->bg_win, 1);
958 e_gadcon_xdnd_window_set(es->gadcon, es->zone->container->bg_win);
959 e_gadcon_dnd_window_set(es->gadcon, es->zone->container->event_win);
960 evas_object_clip_set(es->o_base, es->zone->bg_clip_object);
965 e_shelf_autohide_set(E_Shelf *es, Eina_Bool autohide)
968 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
970 autohide = !!autohide;
971 if ((es->cfg->autohide == autohide) && ((!!es->autohide) == autohide)) return;
972 es->cfg->autohide = autohide;
973 if (!es->cfg->autohide)
975 if (!es->autohide) return;
976 ecore_event_handler_del(es->autohide);
981 * see FIXME in _e_shelf_cb_mouse_in() for why these are commented out
983 eina_list_append(es->handlers,
984 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
985 _e_shelf_cb_mouse_in, es));
987 es->autohide = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
988 _e_shelf_cb_mouse_in, es);
991 eina_list_append(es->handlers,
992 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
993 _e_shelf_cb_mouse_out, es));
995 evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_OUT,
996 (Evas_Object_Event_Cb)_e_shelf_cb_mouse_out2, es);
1001 e_shelf_config_new(E_Zone *zone, E_Config_Shelf *cf_es)
1005 es = e_shelf_zone_new(zone, cf_es->name, cf_es->style,
1006 cf_es->popup, cf_es->layer, cf_es->id);
1007 if (!es) return NULL;
1009 if (!cf_es->hide_timeout) cf_es->hide_timeout = 1.0;
1010 if (!cf_es->hide_duration) cf_es->hide_duration = 1.0;
1012 es->fit_along = cf_es->fit_along;
1013 es->fit_size = cf_es->fit_size;
1014 #ifdef _F_SHELF_INPUT_CONTROL_
1015 es->disable_menu = cf_es->disable_menu;
1018 e_shelf_autohide_set(es, cf_es->autohide);
1019 e_shelf_orient(es, cf_es->orient);
1020 e_shelf_position_calc(es);
1021 e_shelf_populate(es);
1023 if (cf_es->desk_show_mode)
1027 E_Config_Shelf_Desk *sd;
1029 desk = e_desk_current_get(zone);
1030 EINA_LIST_FOREACH(cf_es->desk_list, ll, sd)
1032 if ((desk->x == sd->x) && (desk->y == sd->y))
1042 e_shelf_toggle(es, 0);
1046 EAPI E_Entry_Dialog *
1047 e_shelf_new_dialog(E_Zone *zone)
1051 snprintf(buf, sizeof(buf), "%s #%d", _("Shelf"), eina_list_count(e_config->shelves));
1052 return e_entry_dialog_show(_("Add New Shelf"), "preferences-desktop-shelf",
1053 _("Name:"), buf, NULL, NULL,
1054 _e_shelf_new_dialog_ok, NULL, zone);
1057 /* local subsystem functions */
1060 _e_shelf_new_dialog_ok(void *data, char *text)
1062 E_Config_Shelf *cfg, *es_cf;
1063 E_Zone *zone = data;
1066 unsigned long orient = 1;
1069 if ((!text) || (!text[0])) return;
1070 EINA_LIST_FOREACH(e_config->shelves, l, es_cf)
1072 if (strcmp(es_cf->name, text)) continue;
1073 e_util_dialog_internal(_("Shelf Error"), _("A shelf with that name already exists!"));
1077 cfg = E_NEW(E_Config_Shelf, 1);
1078 cfg->name = eina_stringshare_add(text);
1079 cfg->container = zone->container->num;
1080 cfg->zone = zone->num;
1083 EINA_LIST_FOREACH(e_config->shelves, l, es_cf)
1084 orient *= orientations[es_cf->orient];
1085 for (x = 3; x < (sizeof(orientations) / sizeof(orientations[0])); x++)
1086 if (orient % orientations[x])
1093 cfg->style = eina_stringshare_add("default");
1097 #ifdef _F_SHELF_INPUT_CONTROL_
1098 cfg->disable_menu = 0;
1101 e_config->shelves = eina_list_append(e_config->shelves, cfg);
1102 e_config_save_queue();
1104 es_cf = eina_list_data_get(eina_list_last(e_config->shelves));
1105 cfg->id = es_cf->id + 1;
1106 es = e_shelf_config_new(zone, cfg);
1107 if (es && es->gadcon)
1108 e_int_gadcon_config_shelf(es->gadcon);
1112 _e_shelf_del_cb(void *d)
1119 dummies = eina_list_remove(dummies, es);
1123 shelves = eina_list_remove(shelves, es);
1127 _e_shelf_free_cb(void *data __UNUSED__, void *event)
1129 E_Event_Shelf *ev = event;
1130 E_Shelf *es = ev->shelf;
1132 eina_stringshare_del(es->name);
1133 eina_stringshare_del(es->style);
1139 e_config->shelves = eina_list_remove(e_config->shelves, es->cfg);
1140 eina_stringshare_del(es->cfg->name);
1141 eina_stringshare_del(es->cfg->style);
1144 e_config_save_queue();
1151 _e_shelf_free(E_Shelf *es)
1156 _e_shelf_bindings_del(es);
1158 e_zone_useful_geometry_dirty(es->zone);
1159 E_FREE_LIST(es->handlers, ecore_event_handler_del);
1163 ecore_event_handler_del(es->autohide);
1164 es->autohide = NULL;
1169 ecore_timer_del(es->hide_timer);
1170 es->hide_timer = NULL;
1172 if (es->hide_animator)
1174 ecore_animator_del(es->hide_animator);
1175 es->hide_animator = NULL;
1177 if (es->instant_timer)
1179 ecore_timer_del(es->instant_timer);
1180 es->instant_timer = NULL;
1185 e_menu_post_deactivate_callback_set(es->menu, NULL, NULL);
1186 e_object_del(E_OBJECT(es->menu));
1191 evas_object_event_callback_del_full(es->o_base, EVAS_CALLBACK_DEL,
1192 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_del, es);
1193 evas_object_event_callback_del_full(es->o_base, EVAS_CALLBACK_MOVE,
1194 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_moveresize, es);
1195 evas_object_event_callback_del_full(es->o_base, EVAS_CALLBACK_RESIZE,
1196 (Evas_Object_Event_Cb)_e_shelf_cb_dummy_moveresize, es);
1200 e_gadcon_location_unregister(es->gadcon->location);
1201 e_gadcon_location_free(es->gadcon->location);
1202 if (es->cfg_delete) e_gadcon_config_del(es->gadcon);
1203 e_object_del(E_OBJECT(es->gadcon));
1206 if (es->config_dialog) e_object_del(E_OBJECT(es->config_dialog));
1207 es->config_dialog = NULL;
1208 evas_object_del(es->o_event);
1209 evas_object_del(es->o_base);
1210 es->o_base = es->o_event = NULL;
1213 e_drop_xdnd_register_set(es->popup->evas_win, 0);
1214 eina_hash_del(winid_shelves,
1215 e_util_winid_str_get(es->popup->evas_win), es);
1216 if (!eina_hash_population(winid_shelves))
1218 eina_hash_free(winid_shelves);
1219 winid_shelves = NULL;
1221 e_object_del(E_OBJECT(es->popup));
1225 ev = E_NEW(E_Event_Shelf, 1);
1227 ecore_event_add(E_EVENT_SHELF_DEL, ev, _e_shelf_free_cb, NULL);
1231 _e_shelf_gadcon_min_size_request(void *data __UNUSED__, E_Gadcon *gc __UNUSED__, Evas_Coord w __UNUSED__, Evas_Coord h __UNUSED__)
1237 _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h)
1240 Evas_Coord nx, ny, nw, nh, ww, hh, wantw, wanth;
1248 evas_object_geometry_get(gc->o_container, NULL, NULL, &ww, &hh);
1251 case E_GADCON_ORIENT_FLOAT:
1252 case E_GADCON_ORIENT_HORIZ:
1253 case E_GADCON_ORIENT_TOP:
1254 case E_GADCON_ORIENT_BOTTOM:
1255 case E_GADCON_ORIENT_CORNER_TL:
1256 case E_GADCON_ORIENT_CORNER_TR:
1257 case E_GADCON_ORIENT_CORNER_BL:
1258 case E_GADCON_ORIENT_CORNER_BR:
1259 if (!es->fit_along) w = ww;
1260 if (!es->fit_size) h = hh;
1263 case E_GADCON_ORIENT_VERT:
1264 case E_GADCON_ORIENT_LEFT:
1265 case E_GADCON_ORIENT_RIGHT:
1266 case E_GADCON_ORIENT_CORNER_LT:
1267 case E_GADCON_ORIENT_CORNER_RT:
1268 case E_GADCON_ORIENT_CORNER_LB:
1269 case E_GADCON_ORIENT_CORNER_RB:
1270 if (!es->fit_along) h = hh;
1271 if (!es->fit_size) w = ww;
1277 e_gadcon_swallowed_min_size_set(gc, w, h);
1278 edje_object_size_min_calc(es->o_base, &nw, &nh);
1283 case E_GADCON_ORIENT_FLOAT:
1284 if (!es->fit_along) nw = es->w;
1285 if (!es->fit_size) nh = es->h;
1286 if (nw > es->zone->w) nw = es->zone->w;
1287 if (nh > es->zone->h) nh = es->zone->h;
1288 /*if (nw != es->w)*/ nx = es->x + ((es->w - nw) / 2);
1289 /*if (nh != es->h)*/ ny = es->y + ((es->h - nh) / 2);
1292 case E_GADCON_ORIENT_HORIZ:
1293 if (!es->fit_along) nw = es->w;
1294 if (!es->fit_size) nh = es->h;
1295 if (nw > es->zone->w) nw = es->zone->w;
1296 if (nh > es->zone->h) nh = es->zone->h;
1297 /*if (nw != es->w)*/ nx = es->x + ((es->w - nw) / 2);
1300 case E_GADCON_ORIENT_VERT:
1301 if (!es->fit_along) nh = es->h;
1302 if (!es->fit_size) nw = es->w;
1303 if (nw > es->zone->w) nw = es->zone->w;
1304 if (nh > es->zone->h) nh = es->zone->h;
1305 /*if (nh != es->h)*/ ny = es->y + ((es->h - nh) / 2);
1308 case E_GADCON_ORIENT_LEFT:
1309 if (!es->fit_along) nh = es->h;
1310 if (!es->fit_size) nw = es->w;
1311 if (nw > es->zone->w) nw = es->zone->w;
1312 if (nh > es->zone->h) nh = es->zone->h;
1313 /*if (nh != es->h)*/ ny = (es->zone->h - nh) / 2;
1317 case E_GADCON_ORIENT_RIGHT:
1318 if (!es->fit_along) nh = es->h;
1319 if (!es->fit_size) nw = es->w;
1320 if (nw > es->zone->w) nw = es->zone->w;
1321 if (nh > es->zone->h) nh = es->zone->h;
1322 /*if (nh != es->h)*/ ny = (es->zone->h - nh) / 2;
1323 //nx = es->zone->w - nw;
1326 case E_GADCON_ORIENT_TOP:
1327 if (!es->fit_along) nw = es->w;
1328 if (!es->fit_size) nh = es->h;
1329 if (nw > es->zone->w) nw = es->zone->w;
1330 if (nh > es->zone->h) nh = es->zone->h;
1331 /*if (nw != es->w)*/ nx = (es->zone->w - nw) / 2;
1335 case E_GADCON_ORIENT_BOTTOM:
1336 if (!es->fit_along) nw = es->w;
1337 if (!es->fit_size) nh = es->h;
1338 if (nw > es->zone->w) nw = es->zone->w;
1339 if (nh > es->zone->h) nh = es->zone->h;
1340 /*if (nw != es->w)*/ nx = (es->zone->w - nw) / 2;
1341 //ny = es->zone->h - nh;
1344 case E_GADCON_ORIENT_CORNER_TL:
1345 if (!es->fit_along) nw = es->w;
1346 if (!es->fit_size) nh = es->h;
1347 if (nw > es->zone->w) nw = es->zone->w;
1348 if (nh > es->zone->h) nh = es->zone->h;
1349 /*if (nw != es->w)*/ nx = 0;
1353 case E_GADCON_ORIENT_CORNER_TR:
1354 if (!es->fit_along) nw = es->w;
1355 if (!es->fit_size) nh = es->h;
1356 if (nw > es->zone->w) nw = es->zone->w;
1357 if (nh > es->zone->h) nh = es->zone->h;
1358 /*if (nw != es->w)*/ nx = es->zone->w - nw;
1362 case E_GADCON_ORIENT_CORNER_BL:
1363 if (!es->fit_along) nw = es->w;
1364 if (!es->fit_size) nh = es->h;
1365 if (nw > es->zone->w) nw = es->zone->w;
1366 if (nh > es->zone->h) nh = es->zone->h;
1367 /*if (nw != es->w)*/ nx = 0;
1368 //ny = es->zone->h - nh;
1371 case E_GADCON_ORIENT_CORNER_BR:
1372 if (!es->fit_along) nw = es->w;
1373 if (!es->fit_size) nh = es->h;
1374 if (nw > es->zone->w) nw = es->zone->w;
1375 if (nh > es->zone->h) nh = es->zone->h;
1376 /*if (nw != es->w)*/ nx = es->zone->w - nw;
1377 //ny = es->zone->h - nh;
1380 case E_GADCON_ORIENT_CORNER_LT:
1381 if (!es->fit_along) nh = es->h;
1382 if (!es->fit_size) nw = es->w;
1383 if (nw > es->zone->w) nw = es->zone->w;
1384 if (nh > es->zone->h) nh = es->zone->h;
1385 /*if (nh != es->h)*/ ny = 0;
1389 case E_GADCON_ORIENT_CORNER_RT:
1390 if (!es->fit_along) nh = es->h;
1391 if (!es->fit_size) nw = es->w;
1392 if (nw > es->zone->w) nw = es->zone->w;
1393 if (nh > es->zone->h) nh = es->zone->h;
1394 /*if (nh != es->h)*/ ny = 0;
1395 //nx = es->zone->w - nw;
1398 case E_GADCON_ORIENT_CORNER_LB:
1399 if (!es->fit_along) nh = es->h;
1400 if (!es->fit_size) nw = es->w;
1401 if (nw > es->zone->w) nw = es->zone->w;
1402 if (nh > es->zone->h) nh = es->zone->h;
1403 /*if (nh != es->h)*/ ny = es->zone->h - nh;
1407 case E_GADCON_ORIENT_CORNER_RB:
1408 if (!es->fit_along) nh = es->h;
1409 if (!es->fit_size) nw = es->w;
1410 if (nw > es->zone->w) nw = es->zone->w;
1411 if (nh > es->zone->h) nh = es->zone->h;
1412 /*if (nh != es->h)*/ ny = es->zone->h - nh;
1413 //nx = es->zone->w - nw;
1421 e_gadcon_swallowed_min_size_set(gc, w, h);
1422 e_shelf_move_resize(es, nx, ny, nw, nh);
1423 e_zone_useful_geometry_dirty(es->zone);
1426 static Evas_Object *
1427 _e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style)
1434 o = edje_object_add(gcc->gadcon->evas);
1436 snprintf(buf, sizeof(buf), "e/shelf/%s/%s", es->style, style);
1437 if (!e_theme_edje_object_set(o, "base/theme/shelf", buf))
1439 /* if an inset style (e.g. plain) isn't implemented for a given
1440 * shelf style, fall back to the default one. no need for every
1441 * theme to implement the plain style */
1442 snprintf(buf, sizeof(buf), "e/shelf/default/%s", style);
1443 if (!e_theme_edje_object_set(o, "base/theme/shelf", buf))
1449 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
1450 e_shelf_orient_string_get(es));
1451 edje_object_signal_emit(es->o_base, buf, "e");
1452 edje_object_message_signal_process(o);
1457 _e_shelf_toggle_border_fix(E_Shelf *es)
1462 if ((es->cfg->overlap) || (!e_config->border_fix_on_shelf_toggle))
1465 EINA_LIST_FOREACH(e_border_client_list(), l, bd)
1467 if ((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_NONE)
1469 if (bd->lock_client_location) continue;
1472 if (!bd->shelf_fix.modified) continue;
1473 if (!--bd->shelf_fix.modified)
1475 e_border_move(bd, bd->shelf_fix.x, bd->shelf_fix.y);
1480 if (!E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
1481 es->x, es->y, es->w, es->h))
1486 if (!bd->shelf_fix.modified++)
1487 bd->shelf_fix.x = bd->x;
1488 bd->shelf_fix.y = bd->y;
1491 switch (es->gadcon->orient)
1493 case E_GADCON_ORIENT_TOP:
1494 case E_GADCON_ORIENT_CORNER_TL:
1495 case E_GADCON_ORIENT_CORNER_TR:
1497 e_border_move(bd, bd->x, bd->y + es->h);
1500 case E_GADCON_ORIENT_BOTTOM:
1501 case E_GADCON_ORIENT_CORNER_BL:
1502 case E_GADCON_ORIENT_CORNER_BR:
1504 e_border_move(bd, bd->x, bd->y - es->h);
1507 case E_GADCON_ORIENT_LEFT:
1508 case E_GADCON_ORIENT_CORNER_LB:
1509 case E_GADCON_ORIENT_CORNER_LT:
1511 e_border_move(bd, bd->x + es->w, bd->y);
1514 case E_GADCON_ORIENT_RIGHT:
1515 case E_GADCON_ORIENT_CORNER_RB:
1516 case E_GADCON_ORIENT_CORNER_RT:
1518 e_border_move(bd, bd->x - es->w, bd->y);
1529 max = bd->maximized;
1530 e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
1531 e_border_maximize(bd, max);
1537 _e_shelf_menu_item_free(void *data)
1541 es = e_object_data_get(data);
1542 e_shelf_locked_set(es, 0);
1543 e_object_unref(E_OBJECT(es));
1547 _e_shelf_menu_append(E_Shelf *es, E_Menu *mn)
1554 snprintf(buf, sizeof(buf), "%s", es->name);
1556 snprintf(buf, sizeof(buf), "%s %s", _("Shelf"),
1557 e_shelf_orient_string_get(es));
1559 e_shelf_locked_set(es, 1);
1561 subm = e_menu_new();
1562 mi = e_menu_item_new(mn);
1563 e_menu_item_label_set(mi, buf);
1564 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-shelf");
1565 e_menu_pre_activate_callback_set(subm, _e_shelf_menu_pre_cb, es);
1566 e_object_ref(E_OBJECT(es));
1567 e_object_free_attach_func_set(E_OBJECT(mi), _e_shelf_menu_item_free);
1568 e_object_data_set(E_OBJECT(mi), es);
1569 e_menu_item_submenu_set(mi, subm);
1570 e_object_unref(E_OBJECT(subm));
1572 mi = e_menu_item_new(mn);
1573 e_menu_item_separator_set(mi, 1);
1575 mi = e_menu_item_new(mn);
1576 if (es->gadcon->editing)
1577 e_menu_item_label_set(mi, _("Stop Moving Gadgets"));
1579 e_menu_item_label_set(mi, _("Begin Moving Gadgets"));
1580 e_util_menu_item_theme_icon_set(mi, "transform-scale");
1581 e_menu_item_callback_set(mi, _e_shelf_cb_menu_edit, es);
1585 _e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc __UNUSED__, E_Menu *mn)
1590 _e_shelf_menu_append(es, mn);
1594 _e_shelf_cb_locked_set(void *data, int lock)
1599 e_shelf_locked_set(es, lock);
1603 _e_shelf_cb_urgent_show(void *data)
1608 e_shelf_urgent_show(es);
1612 _e_shelf_cb_menu_config(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1617 if (!es->config_dialog) e_int_shelf_config(es);
1621 _e_shelf_cb_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1626 if (es->gadcon->editing)
1628 e_gadcon_edit_end(es->gadcon);
1629 e_shelf_toggle(es, 0);
1633 e_shelf_toggle(es, 1);
1634 e_gadcon_edit_begin(es->gadcon);
1639 _e_shelf_cb_menu_contents(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1644 if (!es->gadcon->config_dialog) e_int_gadcon_config_shelf(es->gadcon);
1648 _e_shelf_cb_confirm_dialog_destroy(void *data)
1653 e_object_unref(E_OBJECT(es));
1657 _e_shelf_cb_confirm_dialog_yes(void *data)
1662 if (e_object_is_del(E_OBJECT(es))) return;
1664 e_object_del(E_OBJECT(es));
1668 _e_shelf_cb_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1673 if (e_config->cnfmdlg_disabled)
1675 if (e_object_is_del(E_OBJECT(es))) return;
1677 e_object_del(E_OBJECT(es));
1679 e_config_save_queue();
1683 e_object_ref(E_OBJECT(es));
1684 e_confirm_dialog_show(_("Are you sure you want to delete this shelf?"),
1686 _("You requested to delete this shelf.<br>"
1688 "Are you sure you want to delete it?"),
1689 _("Delete"), _("Keep"),
1690 _e_shelf_cb_confirm_dialog_yes, NULL, data, NULL,
1691 _e_shelf_cb_confirm_dialog_destroy, data);
1695 _e_shelf_cb_menu_post(void *data, E_Menu *m __UNUSED__)
1700 if (!es->menu) return;
1701 e_object_del(E_OBJECT(es->menu));
1706 _e_shelf_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1708 Evas_Event_Mouse_Down *ev;
1718 if (es->cfg->autohide_show_action) e_shelf_toggle(es, 1);
1722 #ifdef _F_SHELF_INPUT_CONTROL_
1723 if (es->cfg->disable_menu) return;
1727 e_menu_post_deactivate_callback_set(mn, _e_shelf_cb_menu_post, es);
1730 _e_shelf_menu_pre_cb(es, mn);
1732 e_gadcon_canvas_zone_geometry_get(es->gadcon, &cx, &cy, NULL, NULL);
1733 e_menu_activate_mouse(mn,
1734 e_util_zone_current_get(e_manager_current_get()),
1736 cy + ev->output.y, 1, 1,
1737 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
1743 _e_shelf_cb_mouse_in(void *data, int type, void *event)
1748 if (es->cfg->autohide_show_action) return ECORE_CALLBACK_PASS_ON;
1750 if (type == E_EVENT_ZONE_EDGE_MOVE)
1752 E_Event_Zone_Edge *ev;
1756 if (es->zone != ev->zone) return ECORE_CALLBACK_PASS_ON;
1757 if (!_e_shelf_on_current_desk(es, ev)) return ECORE_CALLBACK_PASS_ON;
1759 switch (es->gadcon->orient)
1761 case E_GADCON_ORIENT_LEFT:
1762 case E_GADCON_ORIENT_CORNER_LT:
1763 case E_GADCON_ORIENT_CORNER_LB:
1764 if (((ev->edge == E_ZONE_EDGE_LEFT) ||
1765 (ev->edge == E_ZONE_EDGE_TOP_LEFT) ||
1766 (ev->edge == E_ZONE_EDGE_BOTTOM_LEFT)) &&
1767 (ev->y >= es->y) && (ev->y <= (es->y + es->h)))
1771 case E_GADCON_ORIENT_RIGHT:
1772 case E_GADCON_ORIENT_CORNER_RT:
1773 case E_GADCON_ORIENT_CORNER_RB:
1774 if (((ev->edge == E_ZONE_EDGE_RIGHT) ||
1775 (ev->edge == E_ZONE_EDGE_TOP_RIGHT) ||
1776 (ev->edge == E_ZONE_EDGE_BOTTOM_RIGHT)) &&
1777 (ev->y >= es->y) && (ev->y <= (es->y + es->h)))
1781 case E_GADCON_ORIENT_TOP:
1782 case E_GADCON_ORIENT_CORNER_TL:
1783 case E_GADCON_ORIENT_CORNER_TR:
1784 if (((ev->edge == E_ZONE_EDGE_TOP) ||
1785 (ev->edge == E_ZONE_EDGE_TOP_LEFT) ||
1786 (ev->edge == E_ZONE_EDGE_TOP_RIGHT)) &&
1787 (ev->x >= es->x) && (ev->x <= (es->x + es->w)))
1791 case E_GADCON_ORIENT_BOTTOM:
1792 case E_GADCON_ORIENT_CORNER_BL:
1793 case E_GADCON_ORIENT_CORNER_BR:
1794 if (((ev->edge == E_ZONE_EDGE_BOTTOM) ||
1795 (ev->edge == E_ZONE_EDGE_BOTTOM_LEFT) ||
1796 (ev->edge == E_ZONE_EDGE_BOTTOM_RIGHT)) &&
1797 (ev->x >= es->x) && (ev->x <= (es->x + es->w)))
1801 case E_GADCON_ORIENT_FLOAT:
1802 case E_GADCON_ORIENT_HORIZ:
1803 case E_GADCON_ORIENT_VERT:
1811 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1812 e_shelf_toggle(es, 1);
1815 e_shelf_toggle(es, 0);
1818 else if (type == ECORE_X_EVENT_MOUSE_IN)
1820 Ecore_X_Event_Mouse_In *ev;
1823 if ((!es->hidden) && (!es->menu))
1826 evas_object_geometry_get(es->o_event, &x, &y, &w, &h);
1827 if (!E_INSIDE(ev->x, ev->y, x, y, w, h))
1828 e_shelf_toggle(es, 0);
1830 if (!es->popup) return ECORE_CALLBACK_PASS_ON;
1831 if (ev->win == es->popup->evas_win)
1833 if (es->hidden || (!es->toggle))
1835 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1836 e_shelf_toggle(es, 1);
1841 else if (type == ECORE_EVENT_MOUSE_MOVE)
1843 Ecore_Event_Mouse_Move *ev;
1844 Eina_Bool inside = EINA_FALSE;
1847 /* FIXME: checking every mouse movement here is only necessary because of
1848 * shitty systray embedding xwindows into itself which generates inreliable
1849 * mouse in/out events. in the future, when we remove systray, we should go
1850 * back to mouse in/out events
1852 inside = (es->popup && ((ev->event_window == es->popup->evas_win)));
1855 (E_INSIDE(ev->root.x, ev->root.y, es->zone->x, es->zone->y, es->zone->w + 4, es->zone->h + 4)) &&
1856 (E_INSIDE(ev->root.x, ev->root.y, es->x, es->y, es->w, es->h))
1860 if (es->hidden || (!es->toggle))
1862 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1863 e_shelf_toggle(es, 1);
1868 if ((!es->hidden) && (es->toggle))
1869 e_shelf_toggle(es, 0);
1872 return ECORE_CALLBACK_PASS_ON;
1876 _e_shelf_cb_mouse_out2(E_Shelf *es, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Event_Mouse_Out *ev)
1880 evas_object_geometry_get(es->o_event, &x, &y, &w, &h);
1881 if (!E_INSIDE(ev->output.x, ev->output.y, x, y, w, h))
1882 e_shelf_toggle(es, 0);
1886 _e_shelf_cb_mouse_out(void *data, int type, void *event)
1893 if (type == ECORE_X_EVENT_MOUSE_OUT)
1895 Ecore_X_Event_Mouse_Out *ev;
1900 if (es->popup) win = es->popup->evas_win;
1901 else win = es->zone->container->event_win;
1902 if (ev->win != win) return ECORE_CALLBACK_PASS_ON;
1905 * ECORE_X_EVENT_DETAIL_INFERIOR means focus went to children windows
1906 * so do not hide shelf on this case (ie: systray base window, or
1909 * Problem: when child window get mouse out, shelf window will
1910 * not get mouse out itself, so it will stay visible and
1911 * autohide will fail.
1913 if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR)
1915 //fprintf(stderr, "SYSTRAYED\n");
1916 return ECORE_CALLBACK_PASS_ON;
1919 evas_object_geometry_get(es->o_event, &x, &y, &w, &h);
1920 if (!E_INSIDE(ev->x, ev->y, x, y, w, h))
1922 //fprintf(stderr, "EVENT: %d,%d %dx%d || MOUSE: %d,%d\n", x, y, w, h, ev->x, ev->y);
1923 e_shelf_toggle(es, 0);
1926 return ECORE_CALLBACK_PASS_ON;
1930 _e_shelf_cb_dummy_moveresize(E_Shelf *es, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1934 evas_object_geometry_get(obj, &x, &y, &w, &h);
1935 if ((x != es->x) || (y != es->y) || (w != es->w) || (h != es->h))
1937 es->x = x, es->y = y, es->w = w, es->h = h;
1938 e_zone_useful_geometry_dirty(es->zone);
1943 _e_shelf_cb_dummy_del(E_Shelf *es, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1945 e_object_free(E_OBJECT(es));
1949 _e_shelf_cb_id_sort(const void *data1, const void *data2)
1951 const E_Shelf *es1, *es2;
1955 if ((es1->id) < (es2->id)) return -1;
1956 else if (es1->id > es2->id)
1962 _e_shelf_cb_hide_animator(void *data)
1965 int step, hide_max = 0;
1968 switch (es->gadcon->orient)
1970 case E_GADCON_ORIENT_TOP:
1971 case E_GADCON_ORIENT_CORNER_TL:
1972 case E_GADCON_ORIENT_CORNER_TR:
1973 case E_GADCON_ORIENT_BOTTOM:
1974 case E_GADCON_ORIENT_CORNER_BL:
1975 case E_GADCON_ORIENT_CORNER_BR:
1976 hide_max = es->h - es->hidden_state_size - 1;
1977 if (es->hide_origin == -1) es->hide_origin = es->y;
1980 case E_GADCON_ORIENT_LEFT:
1981 case E_GADCON_ORIENT_CORNER_LB:
1982 case E_GADCON_ORIENT_CORNER_LT:
1983 case E_GADCON_ORIENT_RIGHT:
1984 case E_GADCON_ORIENT_CORNER_RB:
1985 case E_GADCON_ORIENT_CORNER_RT:
1986 hide_max = es->w - es->hidden_state_size;
1987 if (es->hide_origin == -1) es->hide_origin = es->x;
1990 case E_GADCON_ORIENT_FLOAT:
1991 case E_GADCON_ORIENT_HORIZ:
1992 case E_GADCON_ORIENT_VERT:
1997 step = (hide_max / e_config->framerate) / es->cfg->hide_duration;
1998 if (!step) step = 1;
2002 if (es->hide_step < hide_max)
2004 if (es->hide_step + step > hide_max)
2005 es->hide_step = hide_max;
2007 es->hide_step += step;
2013 if (es->hide_step > 0)
2015 if (es->hide_step < step)
2018 es->hide_step -= step;
2023 switch (es->gadcon->orient)
2025 case E_GADCON_ORIENT_TOP:
2026 case E_GADCON_ORIENT_CORNER_TL:
2027 case E_GADCON_ORIENT_CORNER_TR:
2028 e_shelf_move(es, es->x, es->hide_origin - es->hide_step);
2031 case E_GADCON_ORIENT_BOTTOM:
2032 case E_GADCON_ORIENT_CORNER_BL:
2033 case E_GADCON_ORIENT_CORNER_BR:
2034 e_shelf_move(es, es->x, es->hide_origin + es->hide_step);
2037 case E_GADCON_ORIENT_LEFT:
2038 case E_GADCON_ORIENT_CORNER_LB:
2039 case E_GADCON_ORIENT_CORNER_LT:
2040 e_shelf_move(es, es->hide_origin - es->hide_step, es->y);
2043 case E_GADCON_ORIENT_RIGHT:
2044 case E_GADCON_ORIENT_CORNER_RB:
2045 case E_GADCON_ORIENT_CORNER_RT:
2046 e_shelf_move(es, es->hide_origin + es->hide_step, es->y);
2049 case E_GADCON_ORIENT_FLOAT:
2050 case E_GADCON_ORIENT_HORIZ:
2051 case E_GADCON_ORIENT_VERT:
2056 return ECORE_CALLBACK_RENEW;
2059 es->hide_animator = NULL;
2060 if (es->interrupted > -1)
2061 e_shelf_toggle(es, es->interrupted);
2062 else if (es->urgent_show)
2063 e_shelf_toggle(es, 0);
2065 _e_shelf_toggle_border_fix(es);
2066 return ECORE_CALLBACK_CANCEL;
2070 _e_shelf_cb_hide_animator_timer(void *data)
2075 if (!es->hide_animator)
2076 es->hide_animator = ecore_animator_add(_e_shelf_cb_hide_animator, es);
2077 es->hide_timer = NULL;
2078 return ECORE_CALLBACK_CANCEL;
2082 _e_shelf_cb_hide_urgent_timer(void *data)
2087 es->hide_timer = NULL;
2088 if (es->urgent_show) e_shelf_toggle(es, 0);
2089 return ECORE_CALLBACK_CANCEL;
2093 _e_shelf_cb_instant_hide_timer(void *data)
2098 switch (es->gadcon->orient)
2100 case E_GADCON_ORIENT_TOP:
2101 case E_GADCON_ORIENT_CORNER_TL:
2102 case E_GADCON_ORIENT_CORNER_TR:
2104 e_shelf_move(es, es->x, es->y - es->h + es->hidden_state_size);
2106 e_shelf_move(es, es->x, es->y + es->h - es->hidden_state_size);
2109 case E_GADCON_ORIENT_BOTTOM:
2110 case E_GADCON_ORIENT_CORNER_BL:
2111 case E_GADCON_ORIENT_CORNER_BR:
2113 e_shelf_move(es, es->x, es->y + es->h - es->hidden_state_size);
2115 e_shelf_move(es, es->x, es->y - es->h + es->hidden_state_size);
2118 case E_GADCON_ORIENT_LEFT:
2119 case E_GADCON_ORIENT_CORNER_LB:
2120 case E_GADCON_ORIENT_CORNER_LT:
2122 e_shelf_move(es, es->x - es->w + es->hidden_state_size, es->y);
2124 e_shelf_move(es, es->x + es->w - es->hidden_state_size, es->y);
2127 case E_GADCON_ORIENT_RIGHT:
2128 case E_GADCON_ORIENT_CORNER_RB:
2129 case E_GADCON_ORIENT_CORNER_RT:
2131 e_shelf_move(es, es->x + es->w - es->hidden_state_size, es->y);
2133 e_shelf_move(es, es->x - es->w + es->hidden_state_size, es->y);
2139 es->instant_timer = NULL;
2140 _e_shelf_toggle_border_fix(es);
2141 return ECORE_CALLBACK_CANCEL;
2145 _e_shelf_cb_menu_rename_yes_cb(void *data, char *text)
2149 E_Config_Shelf *cf_es;
2151 if ((!text) || (!text[0])) return;
2152 if (!strcmp(text, es->cfg->name)) return;
2153 EINA_LIST_FOREACH(e_config->shelves, l, cf_es)
2154 if (!strcmp(cf_es->name, text))
2156 e_util_dialog_internal(_("Error"), _("A shelf with that name and id already exists!"));
2159 e_shelf_name_set(es, text);
2160 e_config_save_queue();
2164 _e_shelf_cb_menu_rename_cb(void *data)
2166 E_Shelf *es = e_object_data_get(data);
2167 es->rename_dialog = NULL;
2171 _e_shelf_cb_menu_rename(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
2174 if (es->rename_dialog) return;
2175 es->rename_dialog = e_entry_dialog_show(_("Rename Shelf"), "edit-rename",
2176 _("Name:"), es->name, NULL, NULL,
2177 _e_shelf_cb_menu_rename_yes_cb,
2179 e_object_data_set(E_OBJECT(es->rename_dialog), es);
2180 e_object_del_attach_func_set(E_OBJECT(es->rename_dialog),
2181 _e_shelf_cb_menu_rename_cb);
2185 _e_shelf_cb_menu_orient(void *data, E_Menu *m, E_Menu_Item *mi)
2189 int orient = E_GADCON_ORIENT_LEFT;
2192 EINA_LIST_FOREACH(m->items, l, mii)
2197 E_Config_Shelf *cf_es;
2199 if (es->cfg->orient == orient) return;
2200 es->cfg->orient = orient;
2203 cfd = es->config_dialog;
2204 es->config_dialog = NULL;
2205 e_object_del(E_OBJECT(es));
2206 es = e_shelf_config_new(zone, cf_es);
2207 es->config_dialog = cfd;
2215 _e_shelf_menu_orientation_pre_cb(void *data, E_Menu *m)
2221 if (m->items) return;
2223 for (orient = E_GADCON_ORIENT_LEFT; orient < E_GADCON_ORIENT_LAST; orient++)
2225 mi = e_menu_item_new(m);
2226 e_util_gadcon_orient_menu_item_icon_set(orient, mi);
2227 e_menu_item_radio_set(mi, 1);
2228 e_menu_item_radio_group_set(mi, 1);
2229 e_menu_item_label_set(mi, _(orient_names[orient]));
2230 e_menu_item_callback_set(mi, _e_shelf_cb_menu_orient, es);
2231 if (es->cfg->orient == orient)
2232 e_menu_item_toggle_set(mi, 1);
2237 _e_shelf_menu_pre_cb(void *data, E_Menu *m)
2244 e_menu_pre_activate_callback_set(m, NULL, NULL);
2246 mi = e_menu_item_new(m);
2247 e_menu_item_label_set(mi, _("Contents"));
2248 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-shelf");
2249 e_menu_item_callback_set(mi, _e_shelf_cb_menu_contents, es);
2251 mi = e_menu_item_new(m);
2252 e_menu_item_label_set(mi, _("Settings"));
2253 e_util_menu_item_theme_icon_set(mi, "configure");
2254 e_menu_item_callback_set(mi, _e_shelf_cb_menu_config, es);
2256 mi = e_menu_item_new(m);
2257 e_menu_item_label_set(mi, _("Orientation"));
2258 e_menu_item_callback_set(mi, _e_shelf_cb_menu_config, es);
2259 subm = e_menu_new();
2260 e_menu_pre_activate_callback_set(subm, _e_shelf_menu_orientation_pre_cb, es);
2261 e_object_data_set(E_OBJECT(subm), es);
2262 e_menu_item_submenu_set(mi, subm);
2263 e_object_unref(E_OBJECT(subm));
2265 mi = e_menu_item_new(m);
2266 e_menu_item_separator_set(mi, 1);
2268 mi = e_menu_item_new(m);
2269 e_menu_item_label_set(mi, _("Rename"));
2270 e_util_menu_item_theme_icon_set(mi, "edit-rename");
2271 e_menu_item_callback_set(mi, _e_shelf_cb_menu_rename, es);
2273 mi = e_menu_item_new(m);
2274 e_menu_item_label_set(mi, _("Delete"));
2275 e_util_menu_item_theme_icon_set(mi, "list-remove");
2276 e_menu_item_callback_set(mi, _e_shelf_cb_menu_delete, es);
2278 if (m->parent_item) return;
2280 mi = e_menu_item_new(m);
2281 e_menu_item_separator_set(mi, 1);
2283 mi = e_menu_item_new(m);
2284 if (es->gadcon->editing)
2285 e_menu_item_label_set(mi, _("Stop Moving Gadgets"));
2287 e_menu_item_label_set(mi, _("Begin Moving Gadgets"));
2288 e_util_menu_item_theme_icon_set(mi, "transform-scale");
2289 e_menu_item_callback_set(mi, _e_shelf_cb_menu_edit, es);
2293 _e_shelf_gadcon_client_remove(void *data, E_Gadcon_Client *gcc)
2300 e_gadcon_client_config_del(gc->cf, gcc->cf);
2301 e_gadcon_unpopulate(gc);
2302 e_gadcon_populate(gc);
2303 e_config_save_queue();
2307 _e_shelf_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc)
2314 if (!e_gadcon_client_config_new(gc, cc->name)) return 0;
2315 e_gadcon_unpopulate(gc);
2316 e_gadcon_populate(gc);
2317 e_config_save_queue();
2322 _e_shelf_orient_icon_name_get(E_Shelf *s)
2327 switch (s->cfg->orient)
2329 case E_GADCON_ORIENT_LEFT:
2330 name = "preferences-position-left";
2333 case E_GADCON_ORIENT_RIGHT:
2334 name = "preferences-position-right";
2337 case E_GADCON_ORIENT_TOP:
2338 name = "preferences-position-top";
2341 case E_GADCON_ORIENT_BOTTOM:
2342 name = "preferences-position-bottom";
2345 case E_GADCON_ORIENT_CORNER_TL:
2346 name = "preferences-position-top-left";
2349 case E_GADCON_ORIENT_CORNER_TR:
2350 name = "preferences-position-top-right";
2353 case E_GADCON_ORIENT_CORNER_BL:
2354 name = "preferences-position-bottom-left";
2357 case E_GADCON_ORIENT_CORNER_BR:
2358 name = "preferences-position-bottom-right";
2361 case E_GADCON_ORIENT_CORNER_LT:
2362 name = "preferences-position-left-top";
2365 case E_GADCON_ORIENT_CORNER_RT:
2366 name = "preferences-position-right-top";
2369 case E_GADCON_ORIENT_CORNER_LB:
2370 name = "preferences-position-left-bottom";
2373 case E_GADCON_ORIENT_CORNER_RB:
2374 name = "preferences-position-right-bottom";
2378 name = "preferences-desktop-shelf";
2385 _e_shelf_bindings_add(E_Shelf *es)
2389 /* TODO: This might delete edge windows, and then add them again further down. Should prevent this. */
2390 _e_shelf_bindings_del(es);
2392 /* Don't need edge binding if we don't hide shelf */
2393 if ((es->cfg) && (!es->cfg->autohide) &&
2394 (!es->cfg->autohide_show_action))
2397 snprintf(buf, sizeof(buf), "shelf.%d", es->id);
2398 switch (es->gadcon->orient)
2400 case E_GADCON_ORIENT_FLOAT:
2401 case E_GADCON_ORIENT_HORIZ:
2402 case E_GADCON_ORIENT_VERT:
2407 case E_GADCON_ORIENT_LEFT:
2408 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT,
2409 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2412 case E_GADCON_ORIENT_RIGHT:
2413 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT,
2414 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2417 case E_GADCON_ORIENT_TOP:
2418 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP,
2419 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2422 case E_GADCON_ORIENT_BOTTOM:
2423 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM,
2424 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2427 case E_GADCON_ORIENT_CORNER_TL:
2428 case E_GADCON_ORIENT_CORNER_LT:
2429 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP,
2430 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2431 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT,
2432 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2433 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_LEFT,
2434 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2437 case E_GADCON_ORIENT_CORNER_TR:
2438 case E_GADCON_ORIENT_CORNER_RT:
2439 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP,
2440 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2441 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT,
2442 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2443 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_RIGHT,
2444 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2447 case E_GADCON_ORIENT_CORNER_BL:
2448 case E_GADCON_ORIENT_CORNER_LB:
2449 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM,
2450 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2451 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT,
2452 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2453 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_LEFT,
2454 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2457 case E_GADCON_ORIENT_CORNER_BR:
2458 case E_GADCON_ORIENT_CORNER_RB:
2459 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM,
2460 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2461 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT,
2462 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2463 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_RIGHT,
2464 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2470 _e_shelf_bindings_del(E_Shelf *es)
2475 snprintf(buf, sizeof(buf), "shelf.%d", es->id);
2476 for (edge = E_ZONE_EDGE_LEFT; edge <= E_ZONE_EDGE_BOTTOM_LEFT; edge++)
2477 e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, edge,
2478 E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
2482 _e_shelf_on_current_desk(E_Shelf *es, E_Event_Zone_Edge *ev)
2484 E_Config_Shelf_Desk *sd;
2486 int on_current_desk = 0;
2487 int on_all_desks = 1;
2490 if (ev->zone != es->zone) return EINA_FALSE;
2491 EINA_LIST_FOREACH(es->cfg->desk_list, ll, sd)
2495 if ((sd->x == ev->zone->desk_x_current) &&
2496 (sd->y == ev->zone->desk_y_current))
2498 on_current_desk = 1;
2502 if ((!on_all_desks) && (!on_current_desk))