diff --git a/src/modules/gadman/e_mod_config.c b/src/modules/gadman/e_mod_config.c index 4aaad7052..531389b47 100644 --- a/src/modules/gadman/e_mod_config.c +++ b/src/modules/gadman/e_mod_config.c @@ -5,8 +5,8 @@ struct _E_Config_Dialog_Data { - Evas_Object *o_avail; //List of available gadgets - Evas_Object *o_add; //Add button + Evas_Object *o_avail; + Evas_Object *o_config; Evas_Object *o_fm; //Filemanager Object Evas_Object *o_sf; //Filemanager Scrollframe Evas_Object *o_btn; //Filemanager updir button @@ -15,6 +15,16 @@ struct _E_Config_Dialog_Data int anim_bg; //Anim the background int anim_gad; //Anim the gadgets int fmdir; //Filemanager dir (personal or system) + Ecore_Event_Handler *add; + Eina_List *waiting; + E_Config_Dialog *cfd; +}; + +static const char *gadman_layer_names[] = +{ + "Background", + "Hover", + NULL }; /* Local protos */ @@ -22,9 +32,7 @@ static void *_create_data(E_Config_Dialog *cfd); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static void _fill_gadgets_list(Evas_Object *ilist); -static void _cb_add(void *data, void *data2); -static void _avail_list_cb_change(void *data, Evas_Object *obj); +static void _avail_list_cb_change(void *data); static void _cb_fm_radio_change(void *data, Evas_Object *obj); static void _cb_color_changed(void *data, Evas_Object *o); static void _cb_fm_change(void *data, Evas_Object *obj, void *event_info); @@ -52,7 +60,7 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__) v->basic.apply_cfdata = _basic_apply_data; snprintf(buf, sizeof(buf), "%s/e-module-gadman.edj", Man->module->dir); - cfd = e_config_dialog_new(con, _("Gadgets Manager"), + cfd = e_config_dialog_new(con, _("Desktop Gadgets"), "E", "extensions/gadman", buf, 0, v, Man); @@ -60,12 +68,30 @@ _config_gadman_module(E_Container *con, const char *params __UNUSED__) return Man->config_dialog; } +static Eina_Bool +_gcc_add(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Add *ev) +{ + Eina_List *l; + if (!cfdata->waiting) return ECORE_CALLBACK_RENEW; + l = eina_list_data_find_list(cfdata->waiting, ev->gcc->gadcon); + if (!l) return ECORE_CALLBACK_RENEW; + if (ev->gcc->cf != eina_list_data_get(eina_list_last(ev->gcc->gadcon->cf->clients))) return ECORE_CALLBACK_RENEW; + gadman_gadget_edit_start(ev->gcc); + ev->gcc->cf->style = eina_stringshare_add(ev->gcc->client_class->default_style); + ev->gcc->cf->geom.pos_x = DEFAULT_POS_X; + ev->gcc->cf->geom.pos_y = DEFAULT_POS_Y; + ev->gcc->cf->geom.size_w = DEFAULT_SIZE_W; + ev->gcc->cf->geom.size_h = DEFAULT_SIZE_H; + return ECORE_CALLBACK_RENEW; +} + static void * -_create_data(E_Config_Dialog *cfd __UNUSED__) +_create_data(E_Config_Dialog *cfd) { E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->cfd = cfd; cfdata->bg_method = Man->conf->bg_type; if (Man->conf->custom_bg) { @@ -73,6 +99,7 @@ _create_data(E_Config_Dialog *cfd __UNUSED__) cfdata->fmdir = 1; } + cfdata->add = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_ADD, (Ecore_Event_Handler_Cb)_gcc_add, cfdata); cfdata->color = E_NEW(E_Color, 1); cfdata->color->r = Man->conf->color_r; cfdata->color->g = Man->conf->color_g; @@ -90,12 +117,49 @@ _create_data(E_Config_Dialog *cfd __UNUSED__) static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) { + int layer; + Eina_List *l; + E_Gadcon *gc; + Man->config_dialog = NULL; + ecore_event_handler_del(cfdata->add); E_FREE(cfdata->color); _cfdata = NULL; + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) + gc->config_dialog = NULL; + eina_list_free(cfdata->waiting); E_FREE(cfdata); } +static void +_cb_config_del(void *data) +{ + E_Config_Dialog_Data *cfdata = e_object_data_get(data); + cfdata->waiting = eina_list_remove(cfdata->waiting, data); +} + +static void +_cb_config(void *data, void *data2 __UNUSED__) +{ + int x; + E_Config_Dialog_Data *cfdata = data; + Eina_List *l; + E_Gadcon *gc; + + x = e_widget_ilist_selected_get(cfdata->o_avail); + EINA_LIST_FOREACH(Man->gadcons[x], l, gc) + { + if (gc->zone != cfdata->cfd->dia->win->border->zone) continue; + if (gc->config_dialog) return; + e_int_gadcon_config_hook(gc, _("Desktop Gadgets"), E_GADCON_SITE_DESKTOP); + cfdata->waiting = eina_list_append(cfdata->waiting, gc); + e_object_data_set(E_OBJECT(gc->config_dialog), cfdata); + e_object_del_attach_func_set(E_OBJECT(gc->config_dialog), _cb_config_del); + break; + } +} + static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { @@ -104,24 +168,24 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf Evas_Coord mw, mh; E_Fm2_Config fmc; char path[PATH_MAX]; + int layer; otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale); o = e_widget_list_add(evas, 0, 0); - of = e_widget_framelist_add(evas, _("Available Gadgets"), 0); + of = e_widget_framelist_add(evas, _("Available Layers"), 0); - //o_avail List of available gadgets + //o_avail List of available layers ol = e_widget_ilist_add(evas, 24, 24, NULL); - e_widget_ilist_multi_select_set(ol, 0); - e_widget_on_change_hook_set(ol, _avail_list_cb_change, cfdata); cfdata->o_avail = ol; - _fill_gadgets_list(ol); + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + e_widget_ilist_append(ol, NULL, _(gadman_layer_names[layer]), _avail_list_cb_change, cfdata, NULL); e_widget_framelist_object_append(of, ol); - //o_add Button to add a gadget - ob = e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add, cfdata, NULL); + //o_config Button to configure a layer + ob = e_widget_button_add(evas, _("Configure Layer"), NULL, _cb_config, cfdata, NULL); e_widget_disabled_set(ob, 1); - cfdata->o_add = ob; + cfdata->o_config = ob; e_widget_size_min_get(ob, &mw, &mh); e_widget_framelist_object_append_full(of, ob, 1, 1, /* fill */ @@ -134,7 +198,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf e_widget_list_object_append(o, of, 1, 1, 0.5); e_dialog_resizable_set(cfd->dia, 1); - e_widget_toolbook_page_append(otb, NULL, _("Add Gadget"), o, 1, 1, 1, 1, 0.5, 0.0); + e_widget_toolbook_page_append(otb, NULL, _("Layers"), o, 1, 1, 1, 1, 0.5, 0.0); + ///////////////////////////////////////////////////////////////////// ft = e_widget_table_add(evas, 0); //Background mode @@ -280,74 +345,12 @@ _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) //Basic Callbacks static void -_fill_gadgets_list(Evas_Object *ilist) -{ - Eina_List *l = NULL; - Evas *evas; - int w; - - e_widget_ilist_freeze(ilist); - e_widget_ilist_clear(ilist); - - evas = evas_object_evas_get(ilist); - - for (l = e_gadcon_provider_list(); l; l = l->next) - { - E_Gadcon_Client_Class *cc; - Evas_Object *icon = NULL; - const char *lbl = NULL; - - if (!(cc = l->data)) continue; - if (cc->func.is_site && !cc->func.is_site(E_GADCON_SITE_DESKTOP)) - continue; - if (cc->func.label) lbl = cc->func.label(cc); - if (!lbl) lbl = cc->name; - if (cc->func.icon) icon = cc->func.icon(cc, evas); - e_widget_ilist_append(ilist, icon, lbl, NULL, (void *)cc, NULL); - } - - e_widget_ilist_go(ilist); - e_widget_size_min_get(ilist, &w, NULL); - if (w < 200) w = 200; - e_widget_size_min_set(ilist, w, 100); - e_widget_ilist_thaw(ilist); -} - -static void -_cb_add(void *data, void *data2 __UNUSED__) -{ - E_Config_Dialog_Data *cfdata; - Eina_List *l = NULL; - int i; - - if (!(cfdata = data)) return; - - for (i = 0, l = e_widget_ilist_items_get(cfdata->o_avail); l; l = l->next, i++) - { - E_Ilist_Item *item = NULL; - E_Gadcon_Client_Class *cc; - E_Gadcon_Client *gcc; - - if (!(item = l->data)) continue; - if (!item->selected) continue; - - cc = e_widget_ilist_nth_data_get(cfdata->o_avail, i); - if (!cc) continue; - - gcc = gadman_gadget_add(cc, GADMAN_LAYER_BG); - if (gcc) gadman_gadget_edit_start(gcc); - } - - if (l) eina_list_free(l); -} - -static void -_avail_list_cb_change(void *data, Evas_Object *obj __UNUSED__) +_avail_list_cb_change(void *data) { E_Config_Dialog_Data *cfdata; if (!(cfdata = data)) return; - e_widget_disabled_set(cfdata->o_add, 0); + e_widget_disabled_set(cfdata->o_config, 0); } //Advanced Callbacks @@ -428,10 +431,3 @@ _cb_button_up(void *data1, void *data2 __UNUSED__) e_fm2_parent_go(cfdata->o_fm); e_widget_scrollframe_child_pos_set(cfdata->o_sf, 0, 0); } - -EAPI void -e_config_gadman_list_refresh(void) -{ - if (!_cfdata) return; - _fill_gadgets_list(_cfdata->o_avail); -} diff --git a/src/modules/gadman/e_mod_config.h b/src/modules/gadman/e_mod_config.h index 9c4ebed4d..efa97a845 100644 --- a/src/modules/gadman/e_mod_config.h +++ b/src/modules/gadman/e_mod_config.h @@ -4,7 +4,6 @@ #define E_MOD_CONFIG_H E_Config_Dialog *_config_gadman_module(E_Container *con, const char *params __UNUSED__); -EAPI void e_config_gadman_list_refresh(void); #endif #endif diff --git a/src/modules/gadman/e_mod_gadman.c b/src/modules/gadman/e_mod_gadman.c index 10d29d970..df78b2e7a 100644 --- a/src/modules/gadman/e_mod_gadman.c +++ b/src/modules/gadman/e_mod_gadman.c @@ -48,7 +48,7 @@ static void _e_gadman_handler_del(void); static Eina_Bool _e_gadman_cb_zone_add(void *data __UNUSED__, int type __UNUSED__, void *event); static Eina_Bool _e_gadman_cb_zone_del(void *data __UNUSED__, int type __UNUSED__, void *event); static E_Gadcon_Client *gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone); -static void gadman_gadget_del(E_Gadcon_Client *gcc); + static E_Gadcon *gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer); E_Gadcon_Client *current = NULL; @@ -213,6 +213,40 @@ gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer) return NULL; } +static void +gadman_gadcon_place_job(E_Gadcon_Client *gcc) +{ + _apply_widget_position(gcc); + if (gcc == current) + gadman_gadget_edit_start(gcc); + evas_object_show(gcc->o_frame); +} + +static void +_gadman_gadget_free(void *data __UNUSED__, void *obj) +{ + E_Gadcon_Client *gcc = obj; + Eina_List *l; + int layer; + Eina_Bool edit; + + layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE; +// edje_object_part_unswallow(gcc->o_frame, gcc->o_base); + if (gcc->cf) + { + Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc->cf); + l = eina_hash_find(_gadman_gadgets, gcc->name); + if (l) + { + eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc->cf)); + } + gcc->cf = NULL; + } + edit = (gcc == current); + current = NULL; + if (edit) gadman_gadget_edit_end(NULL, NULL, NULL, NULL); +} + static E_Gadcon_Client * gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone) { @@ -246,6 +280,7 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con { gcc = cc->func.init(gc, cf->name, cf->id, cc->default_style); if (!gcc) return NULL; + e_object_delfn_add(E_OBJECT(gcc), _gadman_gadget_free, NULL); gcc->cf = cf; gcc->client_class = cc; @@ -272,8 +307,6 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN, on_frame_click, gcc); - _apply_widget_position(gcc); - if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP) edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e"); if (cc->name) @@ -281,7 +314,7 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const E_Gadcon_Client_Class *cc, E_Con l = eina_hash_find(_gadman_gadgets, cc->name); eina_hash_set(_gadman_gadgets, cc->name, eina_list_append(l, gcc->cf)); } - evas_object_show(gcc->o_frame); + ecore_job_add((Ecore_Cb)gadman_gadcon_place_job, gcc); return gcc; } @@ -347,24 +380,9 @@ _gadman_gadget_add(const E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer, E_C } static void -gadman_gadget_del(E_Gadcon_Client *gcc) +gadman_edit(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - Gadman_Layer_Type layer; - Eina_List *l; - - if (!gcc) return; - layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE; -// edje_object_part_unswallow(gcc->o_frame, gcc->o_base); - if (gcc->cf) - { - Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc->cf); - l = eina_hash_find(_gadman_gadgets, gcc->name); - eina_hash_set(_gadman_gadgets, gcc->name, eina_list_remove(l, gcc->cf)); - e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf); - gcc->cf = NULL; - } - e_object_del(E_OBJECT(gcc)); - current = NULL; + _apply_widget_position(data); } void @@ -374,19 +392,21 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc) Evas_Object *mover; int x, y, w, h; - current = gcc; - gc = gcc->gadcon; gc->editing = 1; /* Move/resize the correct mover */ - evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h); mover = _get_mover(gcc); + if (!mover) return; + evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h); evas_object_move(mover, x, y); evas_object_resize(mover, w, h); evas_object_raise(mover); evas_object_show(mover); + evas_object_event_callback_del(mover, EVAS_CALLBACK_HIDE, gadman_edit); + evas_object_event_callback_add(mover, EVAS_CALLBACK_HIDE, gadman_edit, gcc); + current = gcc; } void @@ -399,6 +419,7 @@ gadman_gadget_edit_end(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const const Eina_List *l; E_Gadcon *gc; + evas_object_event_callback_del(Man->movers[layer], EVAS_CALLBACK_HIDE, gadman_edit); evas_object_hide(Man->movers[layer]); EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) @@ -572,6 +593,7 @@ _gadman_gadcon_free(E_Gadcon *gc) eina_stringshare_del(gc->name); if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog)); + eina_list_free(gc->populated_classes); free(gc); } @@ -1127,7 +1149,8 @@ _on_menu_layer(E_Gadcon_Client *gcc, Gadman_Layer_Type layer) cf = gcc->cf; new_gcc = _gadman_gadget_add(cc, layer, cf); - gadman_gadget_del(gcc); + gcc->cf = NULL; + e_object_del(E_OBJECT(gcc)); current = new_gcc; e_config_save_queue(); @@ -1163,7 +1186,9 @@ on_menu_add(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__) static void on_menu_delete(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { - gadman_gadget_del(data); + E_Gadcon_Client *gcc = data; + e_gadcon_client_config_del(gcc->gadcon->cf, gcc->cf); + e_object_del(data); e_config_save_queue(); } @@ -1488,7 +1513,7 @@ _e_gadman_client_add(void *data __UNUSED__, const E_Gadcon_Client_Class *cc) static void _e_gadman_client_remove(void *data __UNUSED__, E_Gadcon_Client *gcc) { - gadman_gadget_del(gcc); + e_object_del(E_OBJECT(gcc)); } static void @@ -1527,10 +1552,9 @@ _gadman_module_cb(void *d __UNUSED__, int type __UNUSED__, E_Event_Module_Update gcc = e_gadcon_client_find(NULL, cf_gcc); if (!gcc) continue; gcc->cf = NULL; - gadman_gadget_del(gcc); + e_object_del(E_OBJECT(gcc)); } } - e_config_gadman_list_refresh(); return ECORE_CALLBACK_RENEW; }