3 static void _e_shelf_free(E_Shelf *es);
4 static void _e_shelf_gadcon_min_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
5 static void _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
6 static Evas_Object *_e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style);
7 static void _e_shelf_toggle_border_fix(E_Shelf *es);
8 static void _e_shelf_cb_menu_config(void *data, E_Menu *m, E_Menu_Item *mi);
9 static void _e_shelf_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
10 static void _e_shelf_cb_menu_contents(void *data, E_Menu *m, E_Menu_Item *mi);
11 static void _e_shelf_cb_confirm_dialog_yes(void *data);
12 static void _e_shelf_cb_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi);
13 static void _e_shelf_menu_append(E_Shelf *es, E_Menu *mn);
14 static void _e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn);
15 static void _e_shelf_cb_locked_set(void *data, int lock);
16 static void _e_shelf_cb_urgent_show(void *data);
17 static void _e_shelf_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
18 static Eina_Bool _e_shelf_cb_mouse_in(void *data, int type, void *event);
19 static Eina_Bool _e_shelf_cb_mouse_out(void *data, int type, void *event);
20 static int _e_shelf_cb_id_sort(const void *data1, const void *data2);
21 static Eina_Bool _e_shelf_cb_hide_animator(void *data);
22 static Eina_Bool _e_shelf_cb_hide_animator_timer(void *data);
23 static Eina_Bool _e_shelf_cb_hide_urgent_timer(void *data);
24 static Eina_Bool _e_shelf_cb_instant_hide_timer(void *data);
25 static void _e_shelf_menu_pre_cb(void *data, E_Menu *m);
26 static void _e_shelf_gadcon_client_remove(void *data, E_Gadcon_Client *gcc);
27 static int _e_shelf_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc);
28 static const char * _e_shelf_orient_icon_name_get(E_Shelf *s);
29 static void _e_shelf_bindings_add(E_Shelf *es);
30 static void _e_shelf_bindings_del(E_Shelf *es);
31 static Eina_Bool _e_shelf_on_current_desk(E_Shelf *es, E_Event_Zone_Edge *ev);
33 static Eina_List *shelves = NULL;
34 static Eina_Hash *winid_shelves = NULL;
36 /* externally accessible functions */
44 e_shelf_shutdown(void)
46 if (x_fatal) return 1;
51 es = eina_list_data_get(shelves);
52 e_object_del(E_OBJECT(es));
59 e_shelf_config_update(void)
62 E_Config_Shelf *cf_es;
69 es = eina_list_data_get(shelves);
70 e_object_del(E_OBJECT(es));
73 EINA_LIST_FOREACH(e_config->shelves, l, cf_es)
77 if (cf_es->id <= 0) cf_es->id = id + 1;
78 zone = e_util_container_zone_id_get(cf_es->container, cf_es->zone);
80 e_shelf_config_new(zone, cf_es);
88 shelves = eina_list_sort(shelves, -1, _e_shelf_cb_id_sort);
93 e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, int layer, int id)
100 es = E_OBJECT_ALLOC(E_Shelf, E_SHELF_TYPE, _e_shelf_free);
101 if (!es) return NULL;
108 e_zone_useful_geometry_dirty(zone);
111 es->popup = e_popup_new(zone, es->x, es->y, es->w, es->h);
112 e_popup_name_set(es->popup, "shelf");
113 e_popup_layer_set(es->popup, layer);
114 es->ee = es->popup->ecore_evas;
115 es->evas = es->popup->evas;
119 es->ee = zone->container->bg_ecore_evas;
120 es->evas = zone->container->bg_evas;
124 es->style = eina_stringshare_add(style);
126 es->o_event = evas_object_rectangle_add(es->evas);
127 evas_object_color_set(es->o_event, 0, 0, 0, 0);
128 evas_object_resize(es->o_event, es->w, es->h);
129 evas_object_event_callback_add(es->o_event, EVAS_CALLBACK_MOUSE_DOWN, _e_shelf_cb_mouse_down, es);
131 /* TODO: We should have a mouse out on the evas object if we are on the desktop */
132 es->handlers = eina_list_append(es->handlers,
133 ecore_event_handler_add(E_EVENT_ZONE_EDGE_MOVE, _e_shelf_cb_mouse_in, es));
134 es->handlers = eina_list_append(es->handlers,
135 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _e_shelf_cb_mouse_in, es));
136 es->handlers = eina_list_append(es->handlers,
137 ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _e_shelf_cb_mouse_in, es));
138 es->handlers = eina_list_append(es->handlers,
139 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT, _e_shelf_cb_mouse_out, es));
141 es->o_base = edje_object_add(es->evas);
142 es->name = eina_stringshare_add(name);
143 snprintf(buf, sizeof(buf), "e/shelf/%s/base", es->style);
144 evas_object_resize(es->o_base, es->w, es->h);
145 if (!e_theme_edje_object_set(es->o_base, "base/theme/shelf", buf))
146 e_theme_edje_object_set(es->o_base, "base/theme/shelf",
147 "e/shelf/default/base");
150 evas_object_show(es->o_event);
151 evas_object_show(es->o_base);
152 e_popup_edje_bg_object_set(es->popup, es->o_base);
153 ecore_x_netwm_window_type_set(es->popup->evas_win, ECORE_X_WINDOW_TYPE_DOCK);
157 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
158 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
159 evas_object_layer_set(es->o_event, layer);
160 evas_object_layer_set(es->o_base, layer);
163 es->gadcon = e_gadcon_swallowed_new(es->name, es->id, es->o_base, "e.swallow.content");
165 if (!name) locname = _("Shelf #");
166 snprintf(buf, sizeof(buf), "%s %i", locname, es->id);
167 es->gadcon->location = e_gadcon_location_new(buf, E_GADCON_SITE_SHELF, _e_shelf_gadcon_client_add, es, _e_shelf_gadcon_client_remove, es);
168 e_gadcon_location_register(es->gadcon->location);
169 // hmm dnd in ibar and ibox kill this. ok. need to look into this more
170 // es->gadcon->instant_edit = 1;
171 e_gadcon_min_size_request_callback_set(es->gadcon,
172 _e_shelf_gadcon_min_size_request, es);
174 e_gadcon_size_request_callback_set(es->gadcon,
175 _e_shelf_gadcon_size_request, es);
176 e_gadcon_frame_request_callback_set(es->gadcon,
177 _e_shelf_gadcon_frame_request, es);
178 e_gadcon_orient(es->gadcon, E_GADCON_ORIENT_TOP);
179 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
180 e_shelf_orient_string_get(es));
181 edje_object_signal_emit(es->o_base, buf, "e");
182 edje_object_message_signal_process(es->o_base);
183 e_gadcon_zone_set(es->gadcon, zone);
184 e_gadcon_ecore_evas_set(es->gadcon, es->ee);
185 e_gadcon_shelf_set(es->gadcon, es);
189 winid_shelves = eina_hash_string_superfast_new(NULL);
190 eina_hash_add(winid_shelves,
191 e_util_winid_str_get(es->popup->evas_win), es);
192 e_drop_xdnd_register_set(es->popup->evas_win, 1);
193 e_gadcon_xdnd_window_set(es->gadcon, es->popup->evas_win);
194 e_gadcon_dnd_window_set(es->gadcon, es->popup->evas_win);
198 e_drop_xdnd_register_set(es->zone->container->bg_win, 1);
199 e_gadcon_xdnd_window_set(es->gadcon, es->zone->container->bg_win);
200 e_gadcon_dnd_window_set(es->gadcon, es->zone->container->event_win);
202 e_gadcon_util_menu_attach_func_set(es->gadcon,
203 _e_shelf_cb_menu_items_append, es);
205 e_gadcon_util_lock_func_set(es->gadcon,
206 _e_shelf_cb_locked_set, es);
207 e_gadcon_util_urgent_show_func_set(es->gadcon,
208 _e_shelf_cb_urgent_show, es);
210 shelves = eina_list_append(shelves, es);
216 option = edje_object_data_get(es->o_base, "hidden_state_size");
218 es->hidden_state_size = atoi(option);
220 es->hidden_state_size = 4;
221 option = edje_object_data_get(es->o_base, "instant_delay");
223 es->instant_delay = atof(option);
225 es->instant_delay = -1.0;
227 es->hide_origin = -1;
233 e_shelf_zone_move_resize_handle(E_Zone *zone)
239 EINA_LIST_FOREACH(shelves, l, es)
241 if (es->zone == zone)
246 if (gc->min_size_request.func)
248 /* let gadcon container decrease to any size */
249 edje_extern_object_min_size_set(gc->o_container, 0, 0);
251 evas_object_smart_callback_call (gc->o_container, "min_size_request", NULL);
252 e_shelf_position_calc(es);
253 if (gc->min_size_request.func)
255 evas_object_geometry_get(gc->o_container, NULL, NULL, &w, &h);
256 /* fix gadcon container min size to current geometry */
257 edje_extern_object_min_size_set(gc->o_container, w, h);
264 e_shelf_populate(E_Shelf *es)
267 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
268 e_gadcon_populate(es->gadcon);
272 e_shelf_show(E_Shelf *es)
275 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
277 e_popup_show(es->popup);
280 evas_object_show(es->o_event);
281 evas_object_show(es->o_base);
286 e_shelf_hide(E_Shelf *es)
289 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
291 e_popup_hide(es->popup);
294 evas_object_hide(es->o_event);
295 evas_object_hide(es->o_base);
300 e_shelf_locked_set(E_Shelf *es, int lock)
304 e_shelf_toggle(es, 1);
312 e_shelf_toggle(es, es->toggle);
317 e_shelf_toggle(E_Shelf *es, int show)
320 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
323 if (es->locked) return;
324 es->interrupted = -1;
326 if ((show) && (es->hidden))
329 edje_object_signal_emit(es->o_base, "e,state,visible", "e");
330 if (es->instant_delay >= 0.0)
332 _e_shelf_cb_instant_hide_timer(es);
334 ecore_timer_add(es->cfg->hide_timeout,
335 _e_shelf_cb_hide_urgent_timer, es);
341 ecore_timer_del(es->hide_timer);
342 es->hide_timer = NULL;
344 if (!es->hide_animator)
346 ecore_animator_add(_e_shelf_cb_hide_animator, es);
349 else if ((!show) && (!es->hidden) && (!es->gadcon->editing) &&
352 edje_object_signal_emit(es->o_base, "e,state,hidden", "e");
353 if (es->instant_delay >= 0.0)
357 ecore_timer_del(es->hide_timer);
358 es->hide_timer = NULL;
361 if (!es->instant_timer)
363 ecore_timer_add(es->instant_delay,
364 _e_shelf_cb_instant_hide_timer, es);
368 if (es->hide_animator)
370 es->interrupted = show;
374 if (es->hide_timer) ecore_timer_del(es->hide_timer);
376 ecore_timer_add(es->cfg->hide_timeout,
377 _e_shelf_cb_hide_animator_timer, es);
383 e_shelf_urgent_show(E_Shelf *es)
385 e_shelf_toggle(es, 1);
390 e_shelf_move(E_Shelf *es, int x, int y)
393 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
397 e_popup_move(es->popup, es->x, es->y);
400 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
401 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
406 e_shelf_resize(E_Shelf *es, int w, int h)
409 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
412 if (es->popup) e_popup_resize(es->popup, es->w, es->h);
413 evas_object_resize(es->o_event, es->w, es->h);
414 evas_object_resize(es->o_base, es->w, es->h);
418 e_shelf_move_resize(E_Shelf *es, int x, int y, int w, int h)
421 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
427 e_popup_move_resize(es->popup, es->x, es->y, es->w, es->h);
430 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
431 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
433 evas_object_resize(es->o_event, es->w, es->h);
434 evas_object_resize(es->o_base, es->w, es->h);
438 e_shelf_layer_set(E_Shelf *es, int layer)
441 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
445 e_popup_layer_set(es->popup, es->layer);
448 evas_object_layer_set(es->o_event, es->layer);
449 evas_object_layer_set(es->o_base, es->layer);
454 e_shelf_save(E_Shelf *es)
457 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
460 es->cfg->orient = es->gadcon->orient;
461 if (es->cfg->style) eina_stringshare_del(es->cfg->style);
462 es->cfg->style = eina_stringshare_add(es->style);
466 E_Config_Shelf *cf_es;
468 cf_es = E_NEW(E_Config_Shelf, 1);
469 cf_es->name = eina_stringshare_add(es->name);
470 cf_es->container = es->zone->container->num;
471 cf_es->zone = es->zone->num;
472 if (es->popup) cf_es->popup = 1;
473 cf_es->layer = es->layer;
474 e_config->shelves = eina_list_append(e_config->shelves, cf_es);
475 cf_es->orient = es->gadcon->orient;
476 cf_es->style = eina_stringshare_add(es->style);
477 cf_es->fit_along = es->fit_along;
478 cf_es->fit_size = es->fit_size;
481 cf_es->hide_timeout = 1.0;
482 cf_es->hide_duration = 1.0;
485 e_config_save_queue();
489 e_shelf_unsave(E_Shelf *es)
492 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
495 e_config->shelves = eina_list_remove(e_config->shelves, es->cfg);
496 eina_stringshare_del(es->cfg->name);
497 if (es->cfg->style) eina_stringshare_del(es->cfg->style);
503 e_shelf_orient(E_Shelf *es, E_Gadcon_Orient orient)
508 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
510 e_gadcon_orient(es->gadcon, orient);
511 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
512 e_shelf_orient_string_get(es));
513 edje_object_signal_emit(es->o_base, buf, "e");
514 edje_object_message_signal_process(es->o_base);
515 e_gadcon_location_set_icon_name(es->gadcon->location, _e_shelf_orient_icon_name_get(es));
516 e_zone_useful_geometry_dirty(es->zone);
520 e_shelf_orient_string_get(E_Shelf *es)
522 const char *sig = "";
524 switch (es->gadcon->orient)
526 case E_GADCON_ORIENT_FLOAT:
529 case E_GADCON_ORIENT_HORIZ:
532 case E_GADCON_ORIENT_VERT:
535 case E_GADCON_ORIENT_LEFT:
538 case E_GADCON_ORIENT_RIGHT:
541 case E_GADCON_ORIENT_TOP:
544 case E_GADCON_ORIENT_BOTTOM:
547 case E_GADCON_ORIENT_CORNER_TL:
550 case E_GADCON_ORIENT_CORNER_TR:
553 case E_GADCON_ORIENT_CORNER_BL:
556 case E_GADCON_ORIENT_CORNER_BR:
557 sig = "bottom_right";
559 case E_GADCON_ORIENT_CORNER_LT:
562 case E_GADCON_ORIENT_CORNER_RT:
565 case E_GADCON_ORIENT_CORNER_LB:
568 case E_GADCON_ORIENT_CORNER_RB:
569 sig = "right_bottom";
578 e_shelf_position_calc(E_Shelf *es)
580 E_Gadcon_Orient orient = E_GADCON_ORIENT_FLOAT;
585 orient = es->cfg->orient;
586 size = es->cfg->size * e_scale;
589 orient = es->gadcon->orient;
592 case E_GADCON_ORIENT_FLOAT:
593 if (!es->fit_along) es->w = es->zone->w;
594 if (!es->fit_size) es->h = size;
596 case E_GADCON_ORIENT_HORIZ:
597 if (!es->fit_along) es->w = es->zone->w;
598 if (!es->fit_size) es->h = size;
599 es->x = (es->zone->w - es->w) / 2;
601 case E_GADCON_ORIENT_VERT:
602 if (!es->fit_along) es->h = es->zone->h;
603 if (!es->fit_size) es->w = size;
604 es->y = (es->zone->h - es->h) / 2;
606 case E_GADCON_ORIENT_LEFT:
607 if (!es->fit_along) es->h = es->zone->h;
608 if (!es->fit_size) es->w = size;
610 es->y = (es->zone->h - es->h) / 2;
612 case E_GADCON_ORIENT_RIGHT:
613 if (!es->fit_along) es->h = es->zone->h;
614 if (!es->fit_size) es->w = size;
615 es->x = es->zone->w - es->w;
616 es->y = (es->zone->h - es->h) / 2;
618 case E_GADCON_ORIENT_TOP:
619 if (!es->fit_along) es->w = es->zone->w;
620 if (!es->fit_size) es->h = size;
621 es->x = (es->zone->w - es->w) / 2;
624 case E_GADCON_ORIENT_BOTTOM:
625 if (!es->fit_along) es->w = es->zone->w;
626 if (!es->fit_size) es->h = size;
627 es->x = (es->zone->w - es->w) / 2;
628 es->y = es->zone->h - es->h;
630 case E_GADCON_ORIENT_CORNER_TL:
631 if (!es->fit_along) es->w = es->zone->w;
632 if (!es->fit_size) es->h = size;
636 case E_GADCON_ORIENT_CORNER_TR:
637 if (!es->fit_along) es->w = es->zone->w;
638 if (!es->fit_size) es->h = size;
639 es->x = es->zone->w - es->w;
642 case E_GADCON_ORIENT_CORNER_BL:
643 if (!es->fit_along) es->w = es->zone->w;
644 if (!es->fit_size) es->h = size;
646 es->y = es->zone->h - es->h;
648 case E_GADCON_ORIENT_CORNER_BR:
649 if (!es->fit_along) es->w = es->zone->w;
650 if (!es->fit_size) es->h = size;
651 es->x = es->zone->w - es->w;
652 es->y = es->zone->h - es->h;
654 case E_GADCON_ORIENT_CORNER_LT:
655 if (!es->fit_along) es->h = es->zone->h;
656 if (!es->fit_size) es->w = size;
660 case E_GADCON_ORIENT_CORNER_RT:
661 if (!es->fit_along) es->h = es->zone->h;
662 if (!es->fit_size) es->w = size;
663 es->x = es->zone->w - es->w;
666 case E_GADCON_ORIENT_CORNER_LB:
667 if (!es->fit_along) es->h = es->zone->h;
668 if (!es->fit_size) es->w = size;
670 es->y = es->zone->h - es->h;
672 case E_GADCON_ORIENT_CORNER_RB:
673 if (!es->fit_along) es->h = es->zone->h;
674 if (!es->fit_size) es->w = size;
675 es->x = es->zone->w - es->w;
676 es->y = es->zone->h - es->h;
682 es->hide_origin = -1;
684 e_shelf_move_resize(es, es->x, es->y, es->w, es->h);
688 e_shelf_toggle(es, 0);
690 e_zone_useful_geometry_dirty(es->zone);
691 _e_shelf_bindings_add(es);
695 e_shelf_style_set(E_Shelf *es, const char *style)
701 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
703 if (!es->o_base) return;
704 if (es->style) eina_stringshare_del(es->style);
705 es->style = eina_stringshare_add(style);
708 snprintf(buf, sizeof(buf), "e/shelf/%s/base", style);
710 snprintf(buf, sizeof(buf), "e/shelf/%s/base", "default");
712 if (!e_theme_edje_object_set(es->o_base, "base/theme/shelf", buf))
713 e_theme_edje_object_set(es->o_base, "base/theme/shelf",
714 "e/shelf/default/base");
716 option = edje_object_data_get(es->o_base, "hidden_state_size");
718 es->hidden_state_size = atoi(option);
720 es->hidden_state_size = 4;
721 option = edje_object_data_get(es->o_base, "instant_delay");
723 es->instant_delay = atof(option);
725 es->instant_delay = -1.0;
727 e_gadcon_unpopulate(es->gadcon);
728 e_gadcon_populate(es->gadcon);
732 e_shelf_popup_set(E_Shelf *es, int popup)
734 /* FIXME: Needs to recreate the evas objects. */
736 E_OBJECT_TYPE_CHECK(es, E_SHELF_TYPE);
738 if (!es->cfg) return;
739 if (((popup) && (es->popup)) || ((!popup) && (!es->popup))) return;
743 es->popup = e_popup_new(es->zone, es->x, es->y, es->w, es->h);
744 e_popup_name_set(es->popup, "shelf");
745 e_popup_layer_set(es->popup, es->cfg->layer);
747 es->ee = es->popup->ecore_evas;
748 es->evas = es->popup->evas;
749 evas_object_show(es->o_event);
750 evas_object_show(es->o_base);
751 e_popup_edje_bg_object_set(es->popup, es->o_base);
752 ecore_x_netwm_window_type_set(es->popup->evas_win, ECORE_X_WINDOW_TYPE_DOCK);
754 e_drop_xdnd_register_set(es->popup->evas_win, 1);
755 e_gadcon_xdnd_window_set(es->gadcon, es->popup->evas_win);
756 e_gadcon_dnd_window_set(es->gadcon, es->popup->evas_win);
760 e_drop_xdnd_register_set(es->popup->evas_win, 0);
761 e_object_del(E_OBJECT(es->popup));
764 es->ee = es->zone->container->bg_ecore_evas;
765 es->evas = es->zone->container->bg_evas;
767 evas_object_move(es->o_event, es->zone->x + es->x, es->zone->y + es->y);
768 evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
769 evas_object_layer_set(es->o_event, es->cfg->layer);
770 evas_object_layer_set(es->o_base, es->cfg->layer);
772 e_drop_xdnd_register_set(es->zone->container->bg_win, 1);
773 e_gadcon_xdnd_window_set(es->gadcon, es->zone->container->bg_win);
774 e_gadcon_dnd_window_set(es->gadcon, es->zone->container->event_win);
779 e_shelf_config_new(E_Zone *zone, E_Config_Shelf *cf_es)
783 es = e_shelf_zone_new(zone, cf_es->name, cf_es->style,
784 cf_es->popup, cf_es->layer, cf_es->id);
785 if (!es) return NULL;
787 if (!cf_es->hide_timeout) cf_es->hide_timeout = 1.0;
788 if (!cf_es->hide_duration) cf_es->hide_duration = 1.0;
790 es->fit_along = cf_es->fit_along;
791 es->fit_size = cf_es->fit_size;
793 e_shelf_orient(es, cf_es->orient);
794 e_shelf_position_calc(es);
795 e_shelf_populate(es);
797 if (cf_es->desk_show_mode)
801 E_Config_Shelf_Desk *sd;
803 desk = e_desk_current_get(zone);
804 EINA_LIST_FOREACH(cf_es->desk_list, ll, sd)
806 if ((desk->x == sd->x) && (desk->y == sd->y))
816 e_shelf_toggle(es, 0);
820 /* local subsystem functions */
822 _e_shelf_free(E_Shelf *es)
824 _e_shelf_bindings_del(es);
826 e_gadcon_location_unregister(es->gadcon->location);
827 e_gadcon_location_free(es->gadcon->location);
828 e_zone_useful_geometry_dirty(es->zone);
829 E_FREE_LIST(es->handlers, ecore_event_handler_del);
831 e_object_del(E_OBJECT(es->gadcon));
834 ecore_timer_del(es->hide_timer);
835 es->hide_timer = NULL;
837 if (es->hide_animator)
839 ecore_animator_del(es->hide_animator);
840 es->hide_animator = NULL;
842 if (es->instant_timer)
844 ecore_timer_del(es->instant_timer);
845 es->instant_timer = NULL;
850 e_menu_post_deactivate_callback_set(es->menu, NULL, NULL);
851 e_object_del(E_OBJECT(es->menu));
854 if (es->config_dialog) e_object_del(E_OBJECT(es->config_dialog));
855 shelves = eina_list_remove(shelves, es);
856 eina_stringshare_del(es->name);
857 eina_stringshare_del(es->style);
858 evas_object_del(es->o_event);
859 evas_object_del(es->o_base);
862 e_drop_xdnd_register_set(es->popup->evas_win, 0);
863 eina_hash_del(winid_shelves,
864 e_util_winid_str_get(es->popup->evas_win), es);
865 if (!eina_hash_population(winid_shelves))
867 eina_hash_free(winid_shelves);
868 winid_shelves = NULL;
870 e_object_del(E_OBJECT(es->popup));
876 _e_shelf_gadcon_min_size_request(void *data __UNUSED__, E_Gadcon *gc __UNUSED__, Evas_Coord w __UNUSED__, Evas_Coord h __UNUSED__)
882 _e_shelf_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h)
885 Evas_Coord nx, ny, nw, nh, ww, hh, wantw, wanth;
893 evas_object_geometry_get(gc->o_container, NULL, NULL, &ww, &hh);
896 case E_GADCON_ORIENT_FLOAT:
897 case E_GADCON_ORIENT_HORIZ:
898 case E_GADCON_ORIENT_TOP:
899 case E_GADCON_ORIENT_BOTTOM:
900 case E_GADCON_ORIENT_CORNER_TL:
901 case E_GADCON_ORIENT_CORNER_TR:
902 case E_GADCON_ORIENT_CORNER_BL:
903 case E_GADCON_ORIENT_CORNER_BR:
904 if (!es->fit_along) w = ww;
905 if (!es->fit_size) h = hh;
907 case E_GADCON_ORIENT_VERT:
908 case E_GADCON_ORIENT_LEFT:
909 case E_GADCON_ORIENT_RIGHT:
910 case E_GADCON_ORIENT_CORNER_LT:
911 case E_GADCON_ORIENT_CORNER_RT:
912 case E_GADCON_ORIENT_CORNER_LB:
913 case E_GADCON_ORIENT_CORNER_RB:
914 if (!es->fit_along) h = hh;
915 if (!es->fit_size) w = ww;
920 e_gadcon_swallowed_min_size_set(gc, w, h);
921 edje_object_size_min_calc(es->o_base, &nw, &nh);
926 case E_GADCON_ORIENT_FLOAT:
927 if (!es->fit_along) nw = es->w;
928 if (!es->fit_size) nh = es->h;
929 if (nw > es->zone->w) nw = es->zone->w;
930 if (nh > es->zone->h) nh = es->zone->h;
931 if (nw != es->w) nx = es->x + ((es->w - nw) / 2);
933 case E_GADCON_ORIENT_HORIZ:
934 if (!es->fit_along) nw = es->w;
935 if (!es->fit_size) nh = es->h;
936 if (nw > es->zone->w) nw = es->zone->w;
937 if (nh > es->zone->h) nh = es->zone->h;
938 if (nw != es->w) nx = es->x + ((es->w - nw) / 2);
940 case E_GADCON_ORIENT_VERT:
941 if (!es->fit_along) nh = es->h;
942 if (!es->fit_size) nw = es->w;
943 if (nw > es->zone->w) nw = es->zone->w;
944 if (nh > es->zone->h) nh = es->zone->h;
945 if (nh != es->h) ny = es->y + ((es->h - nh) / 2);
947 case E_GADCON_ORIENT_LEFT:
948 if (!es->fit_along) nh = es->h;
949 if (!es->fit_size) nw = es->w;
950 if (nw > es->zone->w) nw = es->zone->w;
951 if (nh > es->zone->h) nh = es->zone->h;
952 if (nh != es->h) ny = (es->zone->h - nh) / 2;
955 case E_GADCON_ORIENT_RIGHT:
956 if (!es->fit_along) nh = es->h;
957 if (!es->fit_size) nw = es->w;
958 if (nw > es->zone->w) nw = es->zone->w;
959 if (nh > es->zone->h) nh = es->zone->h;
960 if (nh != es->h) ny = (es->zone->h - nh) / 2;
961 // nx = es->zone->w - nw;
963 case E_GADCON_ORIENT_TOP:
964 if (!es->fit_along) nw = es->w;
965 if (!es->fit_size) nh = es->h;
966 if (nw > es->zone->w) nw = es->zone->w;
967 if (nh > es->zone->h) nh = es->zone->h;
968 if (nw != es->w) nx = (es->zone->w - nw) / 2;
971 case E_GADCON_ORIENT_BOTTOM:
972 if (!es->fit_along) nw = es->w;
973 if (!es->fit_size) nh = es->h;
974 if (nw > es->zone->w) nw = es->zone->w;
975 if (nh > es->zone->h) nh = es->zone->h;
976 if (nw != es->w) nx = (es->zone->w - nw) / 2;
977 //ny = es->zone->h - nh;
979 case E_GADCON_ORIENT_CORNER_TL:
980 if (!es->fit_along) nw = es->w;
981 if (!es->fit_size) nh = es->h;
982 if (nw > es->zone->w) nw = es->zone->w;
983 if (nh > es->zone->h) nh = es->zone->h;
984 if (nw != es->w) nx = 0;
987 case E_GADCON_ORIENT_CORNER_TR:
988 if (!es->fit_along) nw = es->w;
989 if (!es->fit_size) nh = es->h;
990 if (nw > es->zone->w) nw = es->zone->w;
991 if (nh > es->zone->h) nh = es->zone->h;
992 nx = es->zone->w - nw;
995 case E_GADCON_ORIENT_CORNER_BL:
996 if (!es->fit_along) nw = es->w;
997 if (!es->fit_size) nh = es->h;
998 if (nw > es->zone->w) nw = es->zone->w;
999 if (nh > es->zone->h) nh = es->zone->h;
1000 if (nw != es->w) nx = 0;
1001 // ny = es->zone->h - nh;
1003 case E_GADCON_ORIENT_CORNER_BR:
1004 if (!es->fit_along) nw = es->w;
1005 if (!es->fit_size) nh = es->h;
1006 if (nw > es->zone->w) nw = es->zone->w;
1007 if (nh > es->zone->h) nh = es->zone->h;
1008 nx = es->zone->w - nw;
1009 //ny = es->zone->h - nh;
1011 case E_GADCON_ORIENT_CORNER_LT:
1012 if (!es->fit_along) nh = es->h;
1013 if (!es->fit_size) nw = es->w;
1014 if (nw > es->zone->w) nw = es->zone->w;
1015 if (nh > es->zone->h) nh = es->zone->h;
1016 if (nh != es->h) ny = 0;
1019 case E_GADCON_ORIENT_CORNER_RT:
1020 if (!es->fit_along) nh = es->h;
1021 if (!es->fit_size) nw = es->w;
1022 if (nw > es->zone->w) nw = es->zone->w;
1023 if (nh > es->zone->h) nh = es->zone->h;
1024 if (nh != es->h) ny = 0;
1025 // nx = es->zone->w - nw;
1027 case E_GADCON_ORIENT_CORNER_LB:
1028 if (!es->fit_along) nh = es->h;
1029 if (!es->fit_size) nw = es->w;
1030 if (nw > es->zone->w) nw = es->zone->w;
1031 if (nh > es->zone->h) nh = es->zone->h;
1032 if (nh != es->h) ny = es->zone->h - nh;
1035 case E_GADCON_ORIENT_CORNER_RB:
1036 if (!es->fit_along) nh = es->h;
1037 if (!es->fit_size) nw = es->w;
1038 if (nw > es->zone->w) nw = es->zone->w;
1039 if (nh > es->zone->h) nh = es->zone->h;
1040 if (nh != es->h) ny = es->zone->h - nh;
1041 // nx = es->zone->w - nw;
1048 e_gadcon_swallowed_min_size_set(gc, w, h);
1049 e_shelf_move_resize(es, nx, ny, nw, nh);
1050 e_zone_useful_geometry_dirty(es->zone);
1053 static Evas_Object *
1054 _e_shelf_gadcon_frame_request(void *data, E_Gadcon_Client *gcc, const char *style)
1061 o = edje_object_add(gcc->gadcon->evas);
1063 snprintf(buf, sizeof(buf), "e/shelf/%s/%s", es->style, style);
1064 if (!e_theme_edje_object_set(o, "base/theme/shelf", buf))
1066 /* if an inset style (e.g. plain) isn't implemented for a given
1067 * shelf style, fall back to the default one. no need for every
1068 * theme to implement the plain style */
1069 snprintf(buf, sizeof(buf), "e/shelf/default/%s", style);
1070 if (!e_theme_edje_object_set(o, "base/theme/shelf", buf))
1076 snprintf(buf, sizeof(buf), "e,state,orientation,%s",
1077 e_shelf_orient_string_get(es));
1078 edje_object_signal_emit(es->o_base, buf, "e");
1079 edje_object_message_signal_process(o);
1084 _e_shelf_toggle_border_fix(E_Shelf *es)
1089 if ((es->cfg->overlap) || (!e_config->border_fix_on_shelf_toggle))
1092 EINA_LIST_FOREACH(e_border_client_list(), l, bd)
1094 if ((bd->maximized & E_MAXIMIZE_TYPE) == E_MAXIMIZE_NONE)
1096 if (bd->lock_client_location) continue;
1099 if (!bd->shelf_fix.modified) continue;
1100 if (!--bd->shelf_fix.modified)
1102 e_border_move(bd, bd->shelf_fix.x, bd->shelf_fix.y);
1107 if (!E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
1108 es->x, es->y, es->w, es->h))
1113 if (!bd->shelf_fix.modified++)
1114 bd->shelf_fix.x = bd->x;
1115 bd->shelf_fix.y = bd->y;
1118 switch (es->gadcon->orient)
1120 case E_GADCON_ORIENT_TOP:
1121 case E_GADCON_ORIENT_CORNER_TL:
1122 case E_GADCON_ORIENT_CORNER_TR:
1124 e_border_move(bd, bd->x, bd->y + es->h);
1126 case E_GADCON_ORIENT_BOTTOM:
1127 case E_GADCON_ORIENT_CORNER_BL:
1128 case E_GADCON_ORIENT_CORNER_BR:
1130 e_border_move(bd, bd->x, bd->y - es->h);
1132 case E_GADCON_ORIENT_LEFT:
1133 case E_GADCON_ORIENT_CORNER_LB:
1134 case E_GADCON_ORIENT_CORNER_LT:
1136 e_border_move(bd, bd->x + es->w, bd->y);
1138 case E_GADCON_ORIENT_RIGHT:
1139 case E_GADCON_ORIENT_CORNER_RB:
1140 case E_GADCON_ORIENT_CORNER_RT:
1142 e_border_move(bd, bd->x - es->w, bd->y);
1152 max = bd->maximized;
1153 e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
1154 e_border_maximize(bd, max);
1160 _e_shelf_menu_item_free(void *data)
1164 es = e_object_data_get(data);
1165 e_shelf_locked_set(es, 0);
1169 _e_shelf_menu_append(E_Shelf *es, E_Menu *mn)
1176 name = e_shelf_orient_string_get (es);
1177 snprintf(buf, sizeof(buf), "Shelf %s", name);
1179 e_shelf_locked_set(es, 1);
1181 subm = e_menu_new();
1182 mi = e_menu_item_new(mn);
1183 e_menu_item_label_set(mi, buf);
1184 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-shelf");
1185 e_menu_pre_activate_callback_set(subm, _e_shelf_menu_pre_cb, es);
1186 e_object_free_attach_func_set(E_OBJECT(mi), _e_shelf_menu_item_free);
1187 e_object_data_set(E_OBJECT(mi), es);
1188 e_menu_item_submenu_set(mi, subm);
1192 _e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc __UNUSED__, E_Menu *mn)
1197 _e_shelf_menu_append(es, mn);
1201 _e_shelf_cb_locked_set(void *data, int lock)
1206 e_shelf_locked_set(es, lock);
1210 _e_shelf_cb_urgent_show(void *data)
1215 e_shelf_urgent_show(es);
1219 _e_shelf_cb_menu_config(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1224 if (!es->config_dialog) e_int_shelf_config(es);
1228 _e_shelf_cb_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1233 if (es->gadcon->editing)
1235 e_gadcon_edit_end(es->gadcon);
1236 e_shelf_toggle(es, 0);
1240 e_shelf_toggle(es, 1);
1241 e_gadcon_edit_begin(es->gadcon);
1246 _e_shelf_cb_menu_contents(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1251 if (!es->gadcon->config_dialog) e_int_gadcon_config_shelf(es->gadcon);
1255 _e_shelf_cb_confirm_dialog_destroy(void *data)
1260 e_object_unref(E_OBJECT(es));
1264 _e_shelf_cb_confirm_dialog_yes(void *data)
1266 E_Config_Shelf *cfg;
1271 if (e_object_is_del(E_OBJECT(es))) return;
1272 e_object_del(E_OBJECT(es));
1273 e_config->shelves = eina_list_remove(e_config->shelves, cfg);
1274 if (cfg->name) eina_stringshare_del(cfg->name);
1275 if (cfg->style) eina_stringshare_del(cfg->style);
1278 e_config_save_queue();
1283 _e_shelf_cb_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1286 E_Config_Shelf *cfg;
1289 if (e_config->cnfmdlg_disabled)
1292 if (e_object_is_del(E_OBJECT(es))) return;
1293 e_object_del(E_OBJECT(es));
1294 e_config->shelves = eina_list_remove(e_config->shelves, cfg);
1295 if (cfg->name) eina_stringshare_del(cfg->name);
1296 if (cfg->style) eina_stringshare_del(cfg->style);
1299 e_config_save_queue();
1303 e_object_ref(E_OBJECT(es));
1304 e_confirm_dialog_show(_("Are you sure you want to delete this shelf?"), "enlightenment",
1305 _("You requested to delete this shelf.<br>"
1307 "Are you sure you want to delete it?"), NULL, NULL,
1308 _e_shelf_cb_confirm_dialog_yes, NULL, data, NULL,
1309 _e_shelf_cb_confirm_dialog_destroy, data);
1313 _e_shelf_cb_menu_post(void *data, E_Menu *m __UNUSED__)
1318 if (!es->menu) return;
1319 e_object_del(E_OBJECT(es->menu));
1324 _e_shelf_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1326 Evas_Event_Mouse_Down *ev;
1336 if (es->cfg->autohide_show_action) e_shelf_toggle(es, 1);
1340 e_menu_post_deactivate_callback_set(mn, _e_shelf_cb_menu_post, es);
1343 _e_shelf_menu_pre_cb(es, mn);
1345 e_gadcon_canvas_zone_geometry_get(es->gadcon, &cx, &cy, NULL, NULL);
1346 e_menu_activate_mouse(mn,
1347 e_util_zone_current_get(e_manager_current_get()),
1349 cy + ev->output.y, 1, 1,
1350 E_MENU_POP_DIRECTION_AUTO, ev->timestamp);
1356 _e_shelf_cb_mouse_in(void *data, int type, void *event)
1361 if (es->cfg->autohide_show_action) return ECORE_CALLBACK_PASS_ON;
1363 if (type == E_EVENT_ZONE_EDGE_MOVE)
1365 E_Event_Zone_Edge *ev;
1369 if (es->zone != ev->zone) return ECORE_CALLBACK_PASS_ON;
1370 if (!_e_shelf_on_current_desk(es, ev)) return ECORE_CALLBACK_PASS_ON;
1372 switch (es->gadcon->orient)
1374 case E_GADCON_ORIENT_FLOAT:
1375 case E_GADCON_ORIENT_HORIZ:
1376 case E_GADCON_ORIENT_VERT:
1379 case E_GADCON_ORIENT_LEFT:
1380 case E_GADCON_ORIENT_CORNER_LT:
1381 case E_GADCON_ORIENT_CORNER_LB:
1382 if (((ev->edge == E_ZONE_EDGE_LEFT) ||
1383 (ev->edge == E_ZONE_EDGE_TOP_LEFT) ||
1384 (ev->edge == E_ZONE_EDGE_BOTTOM_LEFT)) &&
1385 (ev->y >= es->y) && (ev->y <= (es->y + es->h)))
1388 case E_GADCON_ORIENT_RIGHT:
1389 case E_GADCON_ORIENT_CORNER_RT:
1390 case E_GADCON_ORIENT_CORNER_RB:
1391 if (((ev->edge == E_ZONE_EDGE_RIGHT) ||
1392 (ev->edge == E_ZONE_EDGE_TOP_RIGHT) ||
1393 (ev->edge == E_ZONE_EDGE_BOTTOM_RIGHT)) &&
1394 (ev->y >= es->y) && (ev->y <= (es->y + es->h)))
1397 case E_GADCON_ORIENT_TOP:
1398 case E_GADCON_ORIENT_CORNER_TL:
1399 case E_GADCON_ORIENT_CORNER_TR:
1400 if (((ev->edge == E_ZONE_EDGE_TOP) ||
1401 (ev->edge == E_ZONE_EDGE_TOP_LEFT) ||
1402 (ev->edge == E_ZONE_EDGE_TOP_RIGHT)) &&
1403 (ev->x >= es->x) && (ev->x <= (es->x + es->w)))
1406 case E_GADCON_ORIENT_BOTTOM:
1407 case E_GADCON_ORIENT_CORNER_BL:
1408 case E_GADCON_ORIENT_CORNER_BR:
1409 if (((ev->edge == E_ZONE_EDGE_BOTTOM) ||
1410 (ev->edge == E_ZONE_EDGE_BOTTOM_LEFT) ||
1411 (ev->edge == E_ZONE_EDGE_BOTTOM_RIGHT)) &&
1412 (ev->x >= es->x) && (ev->x <= (es->x + es->w)))
1419 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1420 e_shelf_toggle(es, 1);
1423 e_shelf_toggle(es, 0);
1425 else if (type == ECORE_X_EVENT_MOUSE_IN)
1427 Ecore_X_Event_Mouse_In *ev;
1430 if (!es->popup) return ECORE_CALLBACK_PASS_ON;
1431 if (ev->win == es->popup->evas_win)
1433 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1434 e_shelf_toggle(es, 1);
1437 else if (type == ECORE_EVENT_MOUSE_MOVE)
1439 Ecore_Event_Mouse_Move *ev;
1442 if (!es->popup) return ECORE_CALLBACK_PASS_ON;
1443 if (ev->event_window == es->popup->evas_win)
1445 edje_object_signal_emit(es->o_base, "e,state,focused", "e");
1446 e_shelf_toggle(es, 1);
1449 return ECORE_CALLBACK_PASS_ON;
1453 _e_shelf_cb_mouse_out(void *data, int type, void *event)
1460 if (type == ECORE_X_EVENT_MOUSE_OUT)
1462 Ecore_X_Event_Mouse_Out *ev;
1466 if (es->popup) win = es->popup->evas_win;
1467 else win = es->zone->container->event_win;
1468 if (ev->win != win) return ECORE_CALLBACK_PASS_ON;
1471 * ECORE_X_EVENT_DETAIL_INFERIOR means focus went to children windows
1472 * so do not hide shelf on this case (ie: systray base window, or
1475 * Problem: when child window get mouse out, shelf window will
1476 * not get mouse out itself, so it will stay visible and
1477 * autohide will fail.
1479 if (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR) return ECORE_CALLBACK_PASS_ON;
1481 e_shelf_toggle(es, 0);
1483 return ECORE_CALLBACK_PASS_ON;
1487 _e_shelf_cb_id_sort(const void *data1, const void *data2)
1489 const E_Shelf *es1, *es2;
1493 if ((es1->id) < (es2->id)) return -1;
1494 else if (es1->id > es2->id) return 1;
1499 _e_shelf_cb_hide_animator(void *data)
1502 int step, hide_max = 0;
1505 switch (es->gadcon->orient)
1507 case E_GADCON_ORIENT_TOP:
1508 case E_GADCON_ORIENT_CORNER_TL:
1509 case E_GADCON_ORIENT_CORNER_TR:
1510 case E_GADCON_ORIENT_BOTTOM:
1511 case E_GADCON_ORIENT_CORNER_BL:
1512 case E_GADCON_ORIENT_CORNER_BR:
1513 hide_max = es->h - es->hidden_state_size;
1514 if (es->hide_origin == -1) es->hide_origin = es->y;
1516 case E_GADCON_ORIENT_LEFT:
1517 case E_GADCON_ORIENT_CORNER_LB:
1518 case E_GADCON_ORIENT_CORNER_LT:
1519 case E_GADCON_ORIENT_RIGHT:
1520 case E_GADCON_ORIENT_CORNER_RB:
1521 case E_GADCON_ORIENT_CORNER_RT:
1522 hide_max = es->w - es->hidden_state_size;
1523 if (es->hide_origin == -1) es->hide_origin = es->x;
1525 case E_GADCON_ORIENT_FLOAT:
1526 case E_GADCON_ORIENT_HORIZ:
1527 case E_GADCON_ORIENT_VERT:
1531 step = (hide_max / e_config->framerate) / es->cfg->hide_duration;
1532 if (!step) step = 1;
1536 if (es->hide_step < hide_max)
1538 if (es->hide_step + step > hide_max)
1539 es->hide_step = hide_max;
1541 es->hide_step += step;
1547 if (es->hide_step > 0)
1549 if (es->hide_step < step)
1552 es->hide_step -= step;
1557 switch (es->gadcon->orient)
1559 case E_GADCON_ORIENT_TOP:
1560 case E_GADCON_ORIENT_CORNER_TL:
1561 case E_GADCON_ORIENT_CORNER_TR:
1562 e_shelf_move(es, es->x, es->hide_origin - es->hide_step);
1564 case E_GADCON_ORIENT_BOTTOM:
1565 case E_GADCON_ORIENT_CORNER_BL:
1566 case E_GADCON_ORIENT_CORNER_BR:
1567 e_shelf_move(es, es->x, es->hide_origin + es->hide_step);
1569 case E_GADCON_ORIENT_LEFT:
1570 case E_GADCON_ORIENT_CORNER_LB:
1571 case E_GADCON_ORIENT_CORNER_LT:
1572 e_shelf_move(es, es->hide_origin - es->hide_step, es->y);
1574 case E_GADCON_ORIENT_RIGHT:
1575 case E_GADCON_ORIENT_CORNER_RB:
1576 case E_GADCON_ORIENT_CORNER_RT:
1577 e_shelf_move(es, es->hide_origin + es->hide_step, es->y);
1579 case E_GADCON_ORIENT_FLOAT:
1580 case E_GADCON_ORIENT_HORIZ:
1581 case E_GADCON_ORIENT_VERT:
1585 return ECORE_CALLBACK_RENEW;
1588 es->hide_animator = NULL;
1589 if (es->interrupted > -1)
1590 e_shelf_toggle(es, es->interrupted);
1591 else if (es->urgent_show)
1592 e_shelf_toggle(es, 0);
1594 _e_shelf_toggle_border_fix(es);
1595 return ECORE_CALLBACK_CANCEL;
1599 _e_shelf_cb_hide_animator_timer(void *data)
1604 if (!es->hide_animator)
1605 es->hide_animator = ecore_animator_add(_e_shelf_cb_hide_animator, es);
1606 es->hide_timer = NULL;
1607 return ECORE_CALLBACK_CANCEL;
1611 _e_shelf_cb_hide_urgent_timer(void *data)
1616 es->hide_timer = NULL;
1617 if (es->urgent_show) e_shelf_toggle(es, 0);
1618 return ECORE_CALLBACK_CANCEL;
1622 _e_shelf_cb_instant_hide_timer(void *data)
1627 switch (es->gadcon->orient)
1629 case E_GADCON_ORIENT_TOP:
1630 case E_GADCON_ORIENT_CORNER_TL:
1631 case E_GADCON_ORIENT_CORNER_TR:
1633 e_shelf_move(es, es->x, es->y - es->h + es->hidden_state_size);
1635 e_shelf_move(es, es->x, es->y + es->h - es->hidden_state_size);
1637 case E_GADCON_ORIENT_BOTTOM:
1638 case E_GADCON_ORIENT_CORNER_BL:
1639 case E_GADCON_ORIENT_CORNER_BR:
1641 e_shelf_move(es, es->x, es->y + es->h - es->hidden_state_size);
1643 e_shelf_move(es, es->x, es->y - es->h + es->hidden_state_size);
1645 case E_GADCON_ORIENT_LEFT:
1646 case E_GADCON_ORIENT_CORNER_LB:
1647 case E_GADCON_ORIENT_CORNER_LT:
1649 e_shelf_move(es, es->x - es->w + es->hidden_state_size, es->y);
1651 e_shelf_move(es, es->x + es->w - es->hidden_state_size, es->y);
1653 case E_GADCON_ORIENT_RIGHT:
1654 case E_GADCON_ORIENT_CORNER_RB:
1655 case E_GADCON_ORIENT_CORNER_RT:
1657 e_shelf_move(es, es->x + es->w - es->hidden_state_size, es->y);
1659 e_shelf_move(es, es->x - es->w + es->hidden_state_size, es->y);
1664 es->instant_timer = NULL;
1665 _e_shelf_toggle_border_fix(es);
1666 return ECORE_CALLBACK_CANCEL;
1670 _e_shelf_menu_pre_cb(void *data, E_Menu *m)
1676 e_menu_pre_activate_callback_set(m, NULL, NULL);
1678 mi = e_menu_item_new(m);
1679 if (es->gadcon->editing)
1680 e_menu_item_label_set(mi, _("Stop Moving/Resizing Gadgets"));
1682 e_menu_item_label_set(mi, _("Begin Moving/Resizing Gadgets"));
1683 e_util_menu_item_theme_icon_set(mi, "transform-scale");
1684 e_menu_item_callback_set(mi, _e_shelf_cb_menu_edit, es);
1686 mi = e_menu_item_new(m);
1687 e_menu_item_separator_set(mi, 1);
1689 mi = e_menu_item_new(m);
1690 e_menu_item_label_set(mi, _("Contents"));
1691 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-shelf");
1692 e_menu_item_callback_set(mi, _e_shelf_cb_menu_contents, es);
1694 mi = e_menu_item_new(m);
1695 e_menu_item_label_set(mi, _("Settings"));
1696 e_util_menu_item_theme_icon_set(mi, "configure");
1697 e_menu_item_callback_set(mi, _e_shelf_cb_menu_config, es);
1699 mi = e_menu_item_new(m);
1700 e_menu_item_separator_set(mi, 1);
1702 mi = e_menu_item_new(m);
1703 e_menu_item_label_set(mi, _("Delete"));
1704 e_util_menu_item_theme_icon_set(mi, "list-remove");
1705 e_menu_item_callback_set(mi, _e_shelf_cb_menu_delete, es);
1709 _e_shelf_gadcon_client_remove(void *data, E_Gadcon_Client *gcc)
1716 e_gadcon_client_config_del(gc->cf, gcc->cf);
1717 e_gadcon_unpopulate(gc);
1718 e_gadcon_populate(gc);
1719 e_config_save_queue();
1723 _e_shelf_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc)
1730 if (!e_gadcon_client_config_new(gc, cc->name)) return 0;
1731 e_gadcon_unpopulate(gc);
1732 e_gadcon_populate(gc);
1733 e_config_save_queue();
1738 _e_shelf_orient_icon_name_get(E_Shelf * s)
1743 switch (s->cfg->orient)
1745 case E_GADCON_ORIENT_LEFT:
1746 name = "preferences-position-left";
1748 case E_GADCON_ORIENT_RIGHT:
1749 name = "preferences-position-right";
1751 case E_GADCON_ORIENT_TOP:
1752 name = "preferences-position-top";
1754 case E_GADCON_ORIENT_BOTTOM:
1755 name = "preferences-position-bottom";
1757 case E_GADCON_ORIENT_CORNER_TL:
1758 name = "preferences-position-top-left";
1760 case E_GADCON_ORIENT_CORNER_TR:
1761 name = "preferences-position-top-right";
1763 case E_GADCON_ORIENT_CORNER_BL:
1764 name = "preferences-position-bottom-left";
1766 case E_GADCON_ORIENT_CORNER_BR:
1767 name = "preferences-position-bottom-right";
1769 case E_GADCON_ORIENT_CORNER_LT:
1770 name = "preferences-position-left-top";
1772 case E_GADCON_ORIENT_CORNER_RT:
1773 name = "preferences-position-right-top";
1775 case E_GADCON_ORIENT_CORNER_LB:
1776 name = "preferences-position-left-bottom";
1778 case E_GADCON_ORIENT_CORNER_RB:
1779 name = "preferences-position-right-bottom";
1782 name = "preferences-desktop-shelf";
1789 _e_shelf_bindings_add(E_Shelf *es)
1793 /* TODO: This might delete edge windows, and then add them again further down. Should prevent this. */
1794 _e_shelf_bindings_del(es);
1796 /* Don't need edge binding if we don't hide shelf */
1797 if ((!es->cfg->autohide) && (!es->cfg->autohide_show_action)) return;
1799 snprintf(buf, sizeof(buf), "shelf.%d", es->id);
1800 switch (es->gadcon->orient)
1802 case E_GADCON_ORIENT_FLOAT:
1803 case E_GADCON_ORIENT_HORIZ:
1804 case E_GADCON_ORIENT_VERT:
1807 case E_GADCON_ORIENT_LEFT:
1808 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1810 case E_GADCON_ORIENT_RIGHT:
1811 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1813 case E_GADCON_ORIENT_TOP:
1814 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1816 case E_GADCON_ORIENT_BOTTOM:
1817 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1819 case E_GADCON_ORIENT_CORNER_TL:
1820 case E_GADCON_ORIENT_CORNER_LT:
1821 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1822 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1823 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1825 case E_GADCON_ORIENT_CORNER_TR:
1826 case E_GADCON_ORIENT_CORNER_RT:
1827 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1828 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1829 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_TOP_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1831 case E_GADCON_ORIENT_CORNER_BL:
1832 case E_GADCON_ORIENT_CORNER_LB:
1833 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1834 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1835 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_LEFT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1837 case E_GADCON_ORIENT_CORNER_BR:
1838 case E_GADCON_ORIENT_CORNER_RB:
1839 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1840 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1841 e_bindings_edge_add(E_BINDING_CONTEXT_ZONE, E_ZONE_EDGE_BOTTOM_RIGHT, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1847 _e_shelf_bindings_del(E_Shelf *es)
1852 snprintf(buf, sizeof(buf), "shelf.%d", es->id);
1853 for (edge = E_ZONE_EDGE_LEFT; edge <= E_ZONE_EDGE_BOTTOM_LEFT; edge++)
1854 e_bindings_edge_del(E_BINDING_CONTEXT_ZONE, edge, E_BINDING_MODIFIER_NONE, 1, buf, NULL, 0);
1858 _e_shelf_on_current_desk(E_Shelf *es, E_Event_Zone_Edge *ev)
1860 E_Config_Shelf_Desk *sd;
1862 int on_current_desk = 0;
1863 int on_all_desks = 1;
1865 EINA_LIST_FOREACH(es->cfg->desk_list, ll, sd)
1869 if ((sd->x == ev->zone->desk_x_current) && (sd->y == ev->zone->desk_y_current))
1871 on_current_desk = 1;
1875 if (!on_all_desks && !on_current_desk)