2 #include "e_mod_main.h"
3 #include "e_mod_gadman.h"
4 #include "e_mod_config.h"
7 static void _attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu);
8 static void _save_widget_position(E_Gadcon_Client *gcc);
9 static void _apply_widget_position(E_Gadcon_Client *gcc);
10 static char *_get_bind_text(const char* action);
11 static void _on_menu_layer(E_Gadcon_Client *gcc, Gadman_Layer_Type layer);
12 static E_Gadcon_Client *_gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_Config_Gadcon_Client *src_cf);
14 static Evas_Object* _create_mover(E_Gadcon *gc);
15 static Evas_Object* _get_mover(E_Gadcon_Client *gcc);
16 static E_Gadcon* _gadman_gadcon_new(const char* name, Gadman_Layer_Type layer, E_Zone *zone, E_Gadcon_Location * loc);
18 static void on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch);
20 static void on_top(void *data, Evas_Object *o, const char *em, const char *src);
21 static void on_right(void *data, Evas_Object *o, const char *em, const char *src);
22 static void on_down(void *data, Evas_Object *o, const char *em, const char *src);
23 static void on_left(void *data, Evas_Object *o, const char *em, const char *src);
24 static void on_move(void *data, Evas_Object *o, const char *em, const char *src);
26 static void on_frame_click(void *data, Evas *e, Evas_Object *obj, void *event_info);
27 static void on_bg_click(void *data, Evas_Object *o, const char *em, const char *src);
28 static void on_hide_stop(void *data __UNUSED__, Evas_Object *o __UNUSED__,
29 const char *em __UNUSED__, const char *src __UNUSED__);
31 static void on_menu_style_plain(void *data, E_Menu *m, E_Menu_Item *mi);
32 static void on_menu_style_inset(void *data, E_Menu *m, E_Menu_Item *mi);
33 static void on_menu_style_float(void *data, E_Menu *m, E_Menu_Item *mi);
34 static void on_menu_style_horiz(void *data, E_Menu *m, E_Menu_Item *mi);
35 static void on_menu_style_vert(void *data, E_Menu *m, E_Menu_Item *mi);
36 static void on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi);
37 static void on_menu_layer_top(void *data, E_Menu *m, E_Menu_Item *mi);
38 static void on_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi);
39 static void on_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
40 static void on_menu_add(void *data, E_Menu *m, E_Menu_Item *mi);
42 static int _e_gadman_client_add (void *data __UNUSED__, const E_Gadcon_Client_Class *cc);
43 static void _e_gadman_client_remove (void *data __UNUSED__, E_Gadcon_Client *gcc);
45 E_Gadcon_Client *current = NULL;
47 static E_Gadcon_Location *location = NULL;
51 gadman_init(E_Module *m)
57 Man = calloc(1, sizeof(Manager));
61 Man->container = e_container_current_get(e_manager_current_get());
62 Man->width = Man->container->w;
63 Man->height = Man->container->h;
65 /* Check if composite is enable */
66 if (ecore_x_screen_is_composited(0) || e_config->use_composite)
67 Man->use_composite = 1;
69 /* with this we can trap screen resolution change (a better way?)*/
70 e_container_shape_change_callback_add(Man->container, on_shape_change, NULL);
72 /* create and register "desktop" location */
73 location = e_gadcon_location_new("Desktop", E_GADCON_SITE_DESKTOP,
74 _e_gadman_client_add, NULL,
75 _e_gadman_client_remove, NULL);
76 e_gadcon_location_set_icon_name(location, "preferences-desktop");
77 e_gadcon_location_register(location);
79 /* iterating through zones - and making gadmans on each */
80 EINA_LIST_FOREACH(Man->container->zones, l, zone)
82 const char *layer_name[] = {"gadman", "gadman_top"};
85 for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
89 gc = _gadman_gadcon_new(layer_name[layer], layer, zone, location);
90 Man->gadcons[layer] = eina_list_append(Man->gadcons[layer], gc);
101 e_gadcon_location_unregister(location);
102 e_container_shape_change_callback_del(Man->container, on_shape_change, NULL);
104 for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
106 EINA_LIST_FREE(Man->gadcons[layer], gc)
108 e_gadcon_unpopulate(gc);
109 e_gadcon_custom_del(gc);
112 e_config->gadcons = eina_list_remove(e_config->gadcons, gc);
113 eina_stringshare_del(gc->name);
115 if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog));
118 evas_object_del(Man->movers[layer]);
121 if (Man->icon_name) eina_stringshare_del(Man->icon_name);
126 e_canvas_del(Man->top_ee);
127 //ecore_evas_free(Man->top_ee);
134 gadman_populate_class(void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc)
136 Gadman_Layer_Type layer = (Gadman_Layer_Type)(long)data;
137 const Eina_List *l, *ll;
138 E_Config_Gadcon_Client *cf_gcc;
139 E_Gadcon_Client *gcc = NULL;
141 EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc)
143 if (cf_gcc->name && cc->name && !strcmp(cf_gcc->name, cc->name) && (gc->cf->zone == gc->zone->num))
145 EINA_LIST_FOREACH(Man->gadgets[layer], ll, gcc)
147 if ((gcc->cf) && (gcc->cf->id) && (cf_gcc->id))
148 if (gcc->cf->id == cf_gcc->id) break;
150 if (!gcc) gadman_gadget_place(cf_gcc, layer, gc->zone);
156 gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer)
161 EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
162 if (gc->zone == zone) return gc;
167 gadman_gadget_place(E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone)
171 E_Gadcon_Client *gcc;
172 E_Gadcon_Client_Class *cc = NULL;
174 if (!cf->name) return NULL;
176 gc = gadman_gadcon_get(zone, layer);
179 EINA_LIST_FOREACH(e_gadcon_provider_list(), l, cc)
181 if (!strcmp(cc->name, cf->name))
186 if (!cc) return NULL;
188 /* init Gadcon_Client */
189 gcc = cc->func.init(gc, cf->name, cf->id, cc->default_style);
190 if (!gcc) return NULL;
192 gcc->client_class = cc;
194 Man->gadgets[layer] = eina_list_append(Man->gadgets[layer], gcc);
196 //printf("Place Gadget %s (style: %s id: %s) (gadcon: %s)\n", gcc->name, cf->style, cf->id, gc->name);
199 gcc->o_frame = edje_object_add(gc->evas);
200 e_theme_edje_object_set(gcc->o_frame, "base/theme/gadman", "e/gadman/frame");
202 if ((cf->style) && (!strcmp(cf->style, E_GADCON_CLIENT_STYLE_INSET)))
203 edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e");
205 edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e");
207 /* swallow the client inside the frame */
208 edje_object_part_swallow(gcc->o_frame, "e.swallow.content", gcc->o_base);
209 evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN,
210 on_frame_click, gcc);
212 /* Call the client orientation function */
214 cc->func.orient(gcc, gcc->cf->orient);
216 _apply_widget_position(gcc);
218 if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
219 edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
221 evas_object_show(gcc->o_frame);
227 gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer)
229 return _gadman_gadget_add(cc, layer, NULL);
232 static E_Gadcon_Client *
233 _gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_Config_Gadcon_Client *src_cf)
235 E_Config_Gadcon_Client *cf = NULL;
236 E_Gadcon_Client *gcc = NULL;
240 gc = gadman_gadcon_get(e_util_zone_current_get(e_manager_current_get()),
243 /* Create Config_Gadcon_Client */
244 cf = e_gadcon_client_config_new(gc, cc->name);
249 cf->style = eina_stringshare_add(cc->default_style);
250 cf->geom.pos_x = DEFAULT_POS_X;
251 cf->geom.pos_y = DEFAULT_POS_Y;
252 cf->geom.size_w = DEFAULT_SIZE_W;
253 cf->geom.size_h = DEFAULT_SIZE_H;
257 cf->style = eina_stringshare_add(src_cf->style);
258 cf->geom.pos_x = src_cf->geom.pos_x;
259 cf->geom.pos_y = src_cf->geom.pos_y;
260 cf->geom.size_w = src_cf->geom.size_w;
261 cf->geom.size_h = src_cf->geom.size_h;
265 /* Place the new gadget */
267 gcc = gadman_gadget_place(cf, layer, gc->zone);
268 if (!gcc) return NULL;
271 evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
272 if (gcc->aspect.w && gcc->aspect.h)
274 if (gcc->aspect.w > gcc->aspect.h)
275 w = ((float)h / (float)gcc->aspect.h) * (gcc->aspect.w);
277 h = ((float)w / (float)gcc->aspect.w) * (gcc->aspect.h);
278 if (h < gcc->min.h) h = gcc->min.h;
279 if (w < gcc->min.w) w = gcc->min.w;
280 evas_object_resize(gcc->o_frame, w, h);
287 gadman_gadget_del(E_Gadcon_Client *gcc)
289 Gadman_Layer_Type layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE;
290 Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc);
292 // edje_object_part_unswallow(gcc->o_frame, gcc->o_base);
294 if (gcc->cf) e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf);
296 e_object_del(E_OBJECT(gcc));
301 gadman_gadget_edit_start(E_Gadcon_Client *gcc)
312 /* Move/resize the correct mover */
313 evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
314 mover = _get_mover(gcc);
316 evas_object_move(mover, x, y);
317 evas_object_resize(mover, w, h);
318 evas_object_raise(mover);
319 evas_object_show(mover);
323 gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
327 for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
332 evas_object_hide(Man->movers[layer]);
334 EINA_LIST_FOREACH(Man->gadcons[layer], l, gc)
338 if (current) _save_widget_position(current);
342 gadman_gadgets_show(void)
345 E_Gadcon_Client *gcc;
348 ecore_evas_show(Man->top_ee);
349 if (Man->conf->bg_type == BG_STD)
351 if (Man->conf->anim_bg)
352 edje_object_signal_emit(Man->full_bg,
353 "e,state,visibility,show", "e");
355 edje_object_signal_emit(Man->full_bg,
356 "e,state,visibility,show,now", "e");
360 if (Man->conf->anim_bg)
361 edje_object_signal_emit(Man->full_bg,
362 "e,state,visibility,show,custom", "e");
364 edje_object_signal_emit(Man->full_bg,
365 "e,state,visibility,show,custom,now", "e");
368 /* Showing top gadgets */
369 EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, gcc)
371 if (Man->conf->anim_gad)
372 edje_object_signal_emit(gcc->o_frame,
373 "e,state,visibility,show", "e");
375 edje_object_signal_emit(gcc->o_frame,
376 "e,state,visibility,show,now", "e");
381 gadman_gadgets_hide(void)
384 E_Gadcon_Client *gcc;
388 if (Man->conf->bg_type == BG_STD)
390 if (Man->conf->anim_bg)
391 edje_object_signal_emit(Man->full_bg,
392 "e,state,visibility,hide", "e");
394 edje_object_signal_emit(Man->full_bg,
395 "e,state,visibility,hide", "e");
399 if (Man->conf->anim_bg)
400 edje_object_signal_emit(Man->full_bg,
401 "e,state,visibility,hide,custom", "e");
403 edje_object_signal_emit(Man->full_bg,
404 "e,state,visibility,hide,custom,now", "e");
407 /* Hiding top gadgets */
408 EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, gcc)
410 if (Man->conf->anim_gad)
411 edje_object_signal_emit(gcc->o_frame,
412 "e,state,visibility,hide", "e");
414 edje_object_signal_emit(gcc->o_frame,
415 "e,state,visibility,hide,now", "e");
420 gadman_gadgets_toggle(void)
423 gadman_gadgets_hide();
425 gadman_gadgets_show();
429 gadman_update_bg(void)
434 obj = edje_object_part_swallow_get(Man->full_bg, "e.swallow.bg");
437 edje_object_part_unswallow(Man->full_bg, obj);
438 evas_object_del(obj);
441 switch (Man->conf->bg_type)
447 obj = evas_object_rectangle_add(Man->gc_top->evas);
448 evas_object_color_set(obj, Man->conf->color_r, Man->conf->color_g,
449 Man->conf->color_b, 200);
450 edje_object_part_swallow(Man->full_bg, "e.swallow.bg", obj);
453 ext = strrchr(Man->conf->custom_bg, '.');
454 if (!strcmp(ext, ".edj") || !strcmp(ext, ".EDJ"))
456 //THIS IS FOR E17 backgrounds
457 obj = edje_object_add(Man->gc_top->evas);
458 edje_object_file_set(obj, Man->conf->custom_bg,
459 "e/desktop/background");
463 //THIS IS FOR A NORMAL IMAGE
464 obj = evas_object_image_add(Man->gc_top->evas);
465 evas_object_image_file_set(obj, Man->conf->custom_bg, NULL);
466 evas_object_image_fill_set(obj, 0, 0, Man->container->w,
469 edje_object_part_swallow(Man->full_bg, "e.swallow.bg", obj);
478 _gadman_gadcon_new(const char* name, Gadman_Layer_Type layer, E_Zone *zone, E_Gadcon_Location * loc)
485 gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, NULL);
486 if (!gc) return NULL;
488 gc->name = eina_stringshare_add(name);
489 gc->layout_policy = E_GADCON_LAYOUT_POLICY_PANEL;
490 gc->orient = E_GADCON_ORIENT_FLOAT;
493 /* Create ecore fullscreen window */
494 if (layer > GADMAN_LAYER_BG)
498 Man->top_ee = e_canvas_new(Man->container->win, 0, 0, 0, 0, 1, 1,
502 if (Man->use_composite)
504 ecore_evas_alpha_set(Man->top_ee, 1);
505 Man->top_win = ecore_evas_software_x11_window_get(Man->top_ee);
506 ecore_x_window_shape_rectangle_set(Man->top_win, 0, 0,
507 Man->width, Man->height);
510 ecore_evas_shaped_set(Man->top_ee, 1);
512 e_canvas_add(Man->top_ee); //??
513 e_container_window_raise(Man->container, Man->top_win, 250);
515 ecore_evas_move_resize(Man->top_ee, 0, 0, Man->width, Man->height);
516 ecore_evas_hide(Man->top_ee);
518 gc->evas = ecore_evas_get(Man->top_ee);
519 e_gadcon_ecore_evas_set(gc, Man->top_ee);
521 /* create full background object */
522 Man->full_bg = edje_object_add(gc->evas);
523 e_theme_edje_object_set(Man->full_bg, "base/theme/gadman",
525 edje_object_signal_callback_add(Man->full_bg, "mouse,down,*",
526 "grabber", on_bg_click, NULL);
527 edje_object_signal_callback_add(Man->full_bg, "e,action,hide,stop",
528 "", on_hide_stop, NULL);
530 evas_object_move(Man->full_bg, 0, 0);
531 evas_object_resize(Man->full_bg, Man->width, Man->height);
532 evas_object_show(Man->full_bg);
534 /* ... or use the e background window */
537 gc->evas = Man->container->bg_evas;
538 e_gadcon_ecore_evas_set(gc, Man->container->bg_ecore_evas);
539 e_gadcon_xdnd_window_set(gc, Man->container->bg_win);
540 e_gadcon_dnd_window_set(gc, Man->container->event_win);
541 e_drop_xdnd_register_set(Man->container->bg_win, 1);
544 e_gadcon_zone_set(gc, zone);
545 e_gadcon_util_menu_attach_func_set(gc, _attach_menu, NULL);
546 e_gadcon_populate_callback_set(gc, gadman_populate_class, (void*)layer);
548 gc->id = ID_GADMAN_LAYER_BASE + layer;
549 gc->edje.o_parent = NULL;
550 gc->edje.swallow_name = NULL;
554 gc->o_container = NULL;
555 gc->frame_request.func = NULL;
556 gc->resize_request.func = NULL;
557 gc->min_size_request.func = NULL;
559 /* Search for existing gadcon config */
561 EINA_LIST_FOREACH(e_config->gadcons, l, cg)
563 if ((!strcmp(cg->name, name)) && (cg->zone == zone->num))
570 /* ... or create a new one */
573 gc->cf = E_NEW(E_Config_Gadcon, 1);
574 gc->cf->name = eina_stringshare_add(name);
576 gc->cf->zone = zone->num;
577 gc->cf->clients = NULL;
578 e_config->gadcons = eina_list_append(e_config->gadcons, gc->cf);
579 e_config_save_queue();
582 e_gadcon_custom_new(gc);
584 if (!Man->movers[layer])
585 Man->movers[layer] = _create_mover(gc);
587 /* Assigning top gadcon - needed in gadman_update_bg() */
588 if ((layer > GADMAN_LAYER_BG) && !Man->gc_top)
595 _create_mover(E_Gadcon *gc)
599 /* create mover object */
600 mover = edje_object_add(gc->evas);
601 e_theme_edje_object_set(mover, "base/theme/gadman", "e/gadman/control");
603 edje_object_signal_callback_add(mover, "e,action,move,start", "",
604 on_move, (void*)DRAG_START);
605 edje_object_signal_callback_add(mover, "e,action,move,stop", "",
606 on_move, (void*)DRAG_STOP);
607 edje_object_signal_callback_add(mover, "e,action,move,go", "",
608 on_move, (void*)DRAG_MOVE);
609 edje_object_signal_callback_add(mover, "mouse,down,3", "overlay",
610 gadman_gadget_edit_end, NULL);
612 edje_object_signal_callback_add(mover, "e,action,resize,left,start", "",
613 on_left, (void*)DRAG_START);
614 edje_object_signal_callback_add(mover, "e,action,resize,left,stop", "",
615 on_left, (void*)DRAG_STOP);
616 edje_object_signal_callback_add(mover, "e,action,resize,left,go", "",
617 on_left, (void*)DRAG_MOVE);
618 edje_object_signal_callback_add(mover, "e,action,resize,down,start", "",
619 on_down, (void*)DRAG_START);
620 edje_object_signal_callback_add(mover, "e,action,resize,down,stop", "",
621 on_down, (void*)DRAG_STOP);
622 edje_object_signal_callback_add(mover, "e,action,resize,down,go", "",
623 on_down, (void*)DRAG_MOVE);
624 edje_object_signal_callback_add(mover, "e,action,resize,right,start", "",
625 on_right, (void*)DRAG_START);
626 edje_object_signal_callback_add(mover, "e,action,resize,right,stop", "",
627 on_right, (void*)DRAG_STOP);
628 edje_object_signal_callback_add(mover, "e,action,resize,right,go", "",
629 on_right, (void*)DRAG_MOVE);
630 edje_object_signal_callback_add(mover, "e,action,resize,up,start", "",
631 on_top, (void*)DRAG_START);
632 edje_object_signal_callback_add(mover, "e,action,resize,up,stop", "",
633 on_top, (void*)DRAG_STOP);
634 edje_object_signal_callback_add(mover, "e,action,resize,up,go", "",
635 on_top, (void*)DRAG_MOVE);
637 evas_object_move(mover, 20, 30);
638 evas_object_resize(mover, 100, 100);
639 evas_object_hide(mover);
645 _get_mover(E_Gadcon_Client *gcc)
647 return Man->movers[gcc->gadcon->id - ID_GADMAN_LAYER_BASE];
651 _save_widget_position(E_Gadcon_Client *gcc)
655 evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h);
656 current->cf->geom.pos_x = (double)x / (double)Man->width;
657 current->cf->geom.pos_y = (double)y / (double)Man->height;
658 current->cf->geom.size_w = (double)w / (double)Man->width;;
659 current->cf->geom.size_h = (double)h / (double)Man->height;
661 e_config_save_queue();
665 _apply_widget_position(E_Gadcon_Client *gcc)
670 x = gcc->cf->geom.pos_x * Man->width;
671 y = gcc->cf->geom.pos_y * Man->height;
672 w = gcc->cf->geom.size_w * Man->width;
673 h = gcc->cf->geom.size_h * Man->height;
675 /* Obtain zone from parent gadcon */
676 zone = gcc->gadcon->zone;
678 /* Respect min sizes */
679 if (h < gcc->min.h) h = gcc->min.h;
680 if (w < gcc->min.w) w = gcc->min.w;
684 /* Respect zone marigin */
685 if (x < zone->x) x = zone->x;
686 if (y < zone->y) y = zone->y;
687 if (x > (zone->x + zone->w)) x = zone->x;
688 if (y > (zone->y + zone->h)) y = zone->y;
690 if ((y + h) > (zone->y + zone->h + MIN_VISIBLE_MARIGIN))
691 h = ((zone->y + zone->h + MIN_VISIBLE_MARIGIN) - y);
692 if ((x + w) > (zone->x + zone->w + MIN_VISIBLE_MARIGIN))
693 w = ((zone->x + zone->w + MIN_VISIBLE_MARIGIN) - x);
695 evas_object_move(gcc->o_frame, x, y);
696 evas_object_resize(gcc->o_frame, w, h);
700 _attach_menu(void *data __UNUSED__, E_Gadcon_Client *gcc, E_Menu *menu)
707 //printf("Attach menu (gcc: %x id: %s) [%s]\n", gcc, gcc->cf->id, gcc->cf->style);
710 if (e_menu_item_nth(menu, 0))
712 mi = e_menu_item_new(menu);
713 e_menu_item_separator_set(mi, 1);
717 mi = e_menu_item_new(menu);
718 e_menu_item_label_set(mi, _("Begin move/resize"));
719 e_util_menu_item_theme_icon_set(mi, "transform-scale");
720 e_menu_item_callback_set(mi, on_menu_edit, gcc);
725 gcc->cf->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
728 mi = e_menu_item_new(mn);
729 e_menu_item_label_set(mi, _("Plain"));
730 e_menu_item_radio_set(mi, 1);
731 e_menu_item_radio_group_set(mi, 1);
732 if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_PLAIN))
733 e_menu_item_toggle_set(mi, 1);
734 e_menu_item_callback_set(mi, on_menu_style_plain, gcc);
736 mi = e_menu_item_new(mn);
737 e_menu_item_label_set(mi, _("Inset"));
738 e_menu_item_radio_set(mi, 1);
739 e_menu_item_radio_group_set(mi, 1);
740 if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_INSET))
741 e_menu_item_toggle_set(mi, 1);
742 e_menu_item_callback_set(mi, on_menu_style_inset, gcc);
744 mi = e_menu_item_new(mn);
745 e_menu_item_separator_set(mi, 1);
748 mi = e_menu_item_new(mn);
749 e_menu_item_label_set(mi, _("Free"));
750 e_menu_item_radio_set(mi, 1);
751 e_menu_item_radio_group_set(mi, 2);
752 if (gcc->cf->orient == E_GADCON_ORIENT_FLOAT)
753 e_menu_item_toggle_set(mi, 1);
754 e_menu_item_callback_set(mi, on_menu_style_float, gcc);
756 mi = e_menu_item_new(mn);
757 e_menu_item_label_set(mi, _("Horizontal"));
758 e_menu_item_radio_set(mi, 1);
759 e_menu_item_radio_group_set(mi, 2);
760 if (gcc->cf->orient == E_GADCON_ORIENT_HORIZ)
761 e_menu_item_toggle_set(mi, 1);
762 e_menu_item_callback_set(mi, on_menu_style_horiz, gcc);
764 mi = e_menu_item_new(mn);
765 e_menu_item_label_set(mi, _("Vertical"));
766 e_menu_item_radio_set(mi, 1);
767 e_menu_item_radio_group_set(mi, 2);
768 if (gcc->cf->orient == E_GADCON_ORIENT_VERT)
769 e_menu_item_toggle_set(mi, 1);
770 e_menu_item_callback_set(mi, on_menu_style_vert, gcc);
772 mi = e_menu_item_new(menu);
773 e_menu_item_label_set(mi, _("Appearance"));
774 e_util_menu_item_theme_icon_set(mi, "preferences-look");
775 e_menu_item_submenu_set(mi, mn);
776 e_object_del(E_OBJECT(mn));
780 mi = e_menu_item_new(mn);
781 e_menu_item_label_set(mi, _("Always on desktop"));
782 e_menu_item_radio_set(mi, 1);
783 e_menu_item_radio_group_set(mi, 2);
784 if (gcc->gadcon->id == ID_GADMAN_LAYER_BG)
785 e_menu_item_toggle_set(mi, 1);
786 e_menu_item_callback_set(mi, on_menu_layer_bg, gcc);
788 mi = e_menu_item_new(mn);
789 key = _get_bind_text("gadman_toggle");
790 snprintf(buf, sizeof(buf), "%s %s",
791 _("On top pressing"), key);
793 e_menu_item_label_set(mi, buf);
794 e_menu_item_radio_set(mi, 1);
795 e_menu_item_radio_group_set(mi, 2);
796 if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
797 e_menu_item_toggle_set(mi, 1);
798 e_menu_item_callback_set(mi, on_menu_layer_top, gcc);
800 mi = e_menu_item_new(menu);
801 e_menu_item_label_set(mi, _("Behavior"));
802 e_util_menu_item_theme_icon_set(mi, "preferences-look");
803 e_menu_item_submenu_set(mi, mn);
804 e_object_del(E_OBJECT(mn));
806 mi = e_menu_item_new(menu);
807 e_menu_item_separator_set(mi, 1);
809 e_gadcon_client_add_location_menu(gcc, menu);
811 /* Remove this gadgets */
812 mi = e_menu_item_new(menu);
813 e_menu_item_label_set(mi, _("Remove"));
814 e_util_menu_item_theme_icon_set(mi, "list-remove");
815 e_menu_item_callback_set(mi, on_menu_delete, gcc);
817 /* Add other gadgets */
818 mi = e_menu_item_new(menu);
819 e_menu_item_separator_set(mi, 1);
821 mi = e_menu_item_new(menu);
822 e_menu_item_label_set(mi, _("Add other gadgets"));
823 e_util_menu_item_theme_icon_set(mi, "list-add");
824 e_menu_item_callback_set(mi, on_menu_add, gcc);
828 _get_bind_text(const char* action)
833 bind = e_bindings_key_get(action);
834 if ((bind) && (bind->key))
836 if ((bind->mod) & (E_BINDING_MODIFIER_CTRL))
837 strcat(b, _("CTRL"));
839 if ((bind->mod) & (E_BINDING_MODIFIER_ALT))
841 if (b[0]) strcat(b, " + ");
845 if ((bind->mod) & (E_BINDING_MODIFIER_SHIFT))
847 if (b[0]) strcat(b, " + ");
848 strcat(b, _("SHIFT"));
851 if ((bind->mod) & (E_BINDING_MODIFIER_WIN))
853 if (b[0]) strcat(b, " + ");
857 if ((bind->key) && (bind->key[0]))
861 if (b[0]) strcat(b, " + ");
862 l = strdup(bind->key);
863 l[0] = (char)toupper(bind->key[0]);
869 return strdup("(You must define a binding)");
874 on_shape_change(void *data __UNUSED__, E_Container_Shape *es, E_Container_Shape_Change ch __UNUSED__)
876 const Eina_List *l, *g;
878 E_Config_Gadcon_Client *cf_gcc;
882 con = e_container_shape_container_get(es);
883 if ((con->w == Man->width) && (con->h == Man->height)) return;
885 /* The screen size is changed */
887 Man->height = con->h;
889 /* ReStart gadgets */
891 for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
893 EINA_LIST_FOREACH(Man->gadcons[layer], g, gc)
895 e_gadcon_unpopulate(gc);
896 EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc)
897 gadman_gadget_place(cf_gcc, layer, gc->zone);
903 on_menu_style_plain(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
905 E_Gadcon_Client *gcc;
908 if (gcc->style) eina_stringshare_del(gcc->style);
909 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN);
911 if (gcc->cf->style) eina_stringshare_del(gcc->cf->style);
912 gcc->cf->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN);
914 edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e");
916 e_config_save_queue();
920 on_menu_style_inset(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
922 E_Gadcon_Client *gcc;
926 if (gcc->style) eina_stringshare_del(gcc->style);
927 gcc->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
929 if (gcc->cf->style) eina_stringshare_del(gcc->cf->style);
930 gcc->cf->style = eina_stringshare_add(E_GADCON_CLIENT_STYLE_INSET);
932 edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e");
934 e_config_save_queue();
938 _menu_style_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient)
941 gcc->cf->orient = orient;
943 if (gcc->client_class->func.orient)
944 gcc->client_class->func.orient(gcc, orient);
946 if (orient == E_GADCON_ORIENT_VERT)
948 w = DEFAULT_SIZE_W * Man->width;
949 if (w < gcc->min.w) w = gcc->min.w;
951 if (gcc->aspect.w && gcc->aspect.h)
952 h = ((float)gcc->aspect.h / (float)gcc->aspect.w) * w;
955 h = DEFAULT_SIZE_H * Man->height;
956 if (h < gcc->min.h) h = gcc->min.h;
961 h = DEFAULT_SIZE_H * Man->height;
962 if (h < gcc->min.h) h = gcc->min.h;
964 if (gcc->aspect.w && gcc->aspect.h)
965 w = ((float)gcc->aspect.w / (float)gcc->aspect.h) * h;
968 w = DEFAULT_SIZE_W * Man->width;
969 if (w < gcc->min.w) w = gcc->min.w;
973 evas_object_resize(gcc->o_frame, w, h);
974 _save_widget_position(gcc);
978 on_menu_style_float(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
980 _menu_style_orient(data, E_GADCON_ORIENT_FLOAT);
984 on_menu_style_horiz(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
986 _menu_style_orient(data, E_GADCON_ORIENT_HORIZ);
990 on_menu_style_vert(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
992 _menu_style_orient(data, E_GADCON_ORIENT_VERT);
996 _on_menu_layer(E_Gadcon_Client *gcc, Gadman_Layer_Type layer)
998 const E_Gadcon_Client_Class *cc;
1000 E_Gadcon_Client *new_gcc;
1001 E_Config_Gadcon_Client *cf;
1003 cc = gcc->client_class;
1006 new_gcc = _gadman_gadget_add(cc, layer, cf);
1007 gadman_gadget_del(gcc);
1010 e_config_save_queue();
1014 on_menu_layer_bg(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1016 _on_menu_layer(data, GADMAN_LAYER_BG);
1020 on_menu_layer_top(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1022 _on_menu_layer(data, GADMAN_LAYER_TOP);
1023 gadman_gadgets_show();
1027 on_menu_edit(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1029 gadman_gadget_edit_start(data);
1033 on_menu_add(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
1036 gadman_gadgets_hide();
1037 e_configure_registry_call("extensions/gadman", m->zone->container, NULL);
1041 on_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
1043 gadman_gadget_del(data);
1044 e_config_save_queue();
1048 on_frame_click(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
1050 Evas_Event_Mouse_Down *ev;
1051 E_Gadcon_Client *gcc;
1057 if (gcc->gadcon->editing) gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
1061 if (ev->button == 5)
1067 m = e_gadcon_client_util_menu_items_append(gcc, m, 0);
1069 e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch);
1070 e_menu_activate_mouse(m,
1071 e_util_zone_current_get(e_manager_current_get()),
1072 cx + ev->output.x, cy + ev->output.y, 1, 1,
1073 E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
1078 on_top(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1080 static int ox, oy, ow, oh; //Object coord
1081 static int dy; //Mouse offset
1082 int mx, my; //Mouse coord
1083 int action = (int)(long)data;
1086 mover = _get_mover(current);
1088 if (action == DRAG_START)
1090 current->resizing = 1;
1091 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1092 evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
1095 else if (action == DRAG_STOP)
1097 current->resizing = 0;
1099 _save_widget_position(current);
1101 else if ((action == DRAG_MOVE) && current->resizing)
1105 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1107 h = oy + oh + dy - my;
1109 if (h < current->min.h)
1111 my -= current->min.h - h;
1114 /* don't go out of the screen */
1121 evas_object_resize(mover, ow, h);
1122 evas_object_move(mover, ox, my - dy);
1124 evas_object_resize(current->o_frame, ow, h);
1125 evas_object_move(current->o_frame, ox, my - dy);
1130 on_right(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1133 static int ox, oy, ow, oh; //Object coord
1134 static int dx; //Mouse offset
1135 int mx, my; //Mouse coord
1138 mover = _get_mover(current);
1140 action = (int)(long)data;
1141 if (action == DRAG_START)
1143 current->resizing = 1;
1144 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1145 evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
1148 else if (action == DRAG_STOP)
1150 current->resizing = 0;
1152 _save_widget_position(current);
1154 else if ((action == DRAG_MOVE) && current->resizing)
1158 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1161 if (w < current->min.w) w = current->min.w;
1162 /* don't go out of the screen */
1163 if (w > (Man->width - ox)) w = Man->width - ox;
1165 evas_object_resize(mover, w, oh);
1166 evas_object_resize(current->o_frame, w, oh);
1171 on_down(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1174 static int ox, oy, ow, oh; //Object coord
1175 static int dy; //Mouse offset
1176 int mx, my; //Mouse coord
1179 action = (int)(long)data;
1180 mover = _get_mover(current);
1182 if (action == DRAG_START)
1184 current->resizing = 1;
1185 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1186 evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
1189 else if (action == DRAG_STOP)
1191 current->resizing = 0;
1193 _save_widget_position(current);
1195 else if ((action == DRAG_MOVE) && current->resizing)
1199 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1202 if (h < current->min.h) h = current->min.h;
1203 /* don't go out of the screen */
1204 if (h > (Man->height - oy)) h = Man->height - oy;
1206 evas_object_resize(mover, ow, h);
1207 evas_object_resize(current->o_frame, ow, h);
1212 on_left(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1215 static int ox, oy, ow, oh; //Object coord
1216 static int dx; //Mouse offset
1217 int mx, my; //Mouse coord
1220 action = (int)(long)data;
1221 mover = _get_mover(current);
1223 if (action == DRAG_START)
1225 current->resizing = 1;
1226 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1227 evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
1230 else if (action == DRAG_STOP)
1232 current->resizing = 0;
1234 _save_widget_position(current);
1236 else if ((action == DRAG_MOVE) && current->resizing)
1240 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1242 w = ox + ow + dx - mx;
1244 if (w < current->min.w)
1246 mx -= current->min.w - w;
1249 /* don't go out of the screen */
1256 evas_object_resize(mover, w, oh);
1257 evas_object_move(mover, mx - dx, oy);
1259 evas_object_resize(current->o_frame, w, oh);
1260 evas_object_move(current->o_frame, mx - dx, oy);
1265 on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1268 static int dx, dy; //Offset of mouse pointer inside the mover
1269 static int ox, oy; //Starting object position
1270 static int ow, oh; //Starting object size
1271 int mx, my; //Mouse coord
1274 action = (int)(long)data;
1275 mover = _get_mover(current);
1278 if (action == DRAG_START)
1280 current->moving = 1;
1281 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1282 evas_object_geometry_get(mover, &ox, &oy, &ow, &oh);
1291 if (action == DRAG_STOP)
1293 E_Config_Gadcon_Client *cf;
1294 E_Zone *dst_zone = NULL;
1295 E_Gadcon *dst_gadcon;
1298 current->moving = 0;
1301 /* checking if zone was changed for dragged gadget */
1302 evas_object_geometry_get(current->o_frame, &gx, &gy, NULL, NULL);
1303 dst_zone = e_container_zone_at_point_get(e_container_current_get(e_manager_current_get()), gx, gy);
1304 if (dst_zone && (current->gadcon->zone != dst_zone))
1306 unsigned int layer = current->gadcon->id - ID_GADMAN_LAYER_BASE;
1309 current->gadcon->cf->clients = eina_list_remove(current->gadcon->cf->clients, cf);
1310 dst_gadcon = gadman_gadcon_get(dst_zone, layer);
1313 dst_gadcon->cf->clients = eina_list_append(dst_gadcon->cf->clients, cf);
1314 e_config_save_queue();
1318 _save_widget_position(current);
1323 if ((action == DRAG_MOVE) && current->moving)
1327 evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my);
1332 /* don't go out of the screen */
1334 if (x > (Man->width - ow)) x = Man->width - ow;
1336 if (y > (Man->height - oh)) y = Man->height - oh;
1338 evas_object_move(current->o_frame, x , y);
1339 evas_object_move(mover, x, y);
1340 evas_object_raise(current->o_frame);
1341 evas_object_raise(mover);
1346 on_bg_click(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1348 gadman_gadgets_hide();
1352 on_hide_stop(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const char *src __UNUSED__)
1354 ecore_evas_hide(Man->top_ee);
1358 _e_gadman_client_add(void *data __UNUSED__, const E_Gadcon_Client_Class *cc)
1360 return !!gadman_gadget_add(cc, GADMAN_LAYER_BG);
1364 _e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc)
1366 gadman_gadget_del(gcc);