diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 3a5463e54..bd7feb937 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -122,6 +122,7 @@ struct _E_Fm2_Icon int saved_rel; E_Menu *menu; E_Entry_Dialog *entry_dialog; + E_Config_Dialog *prop_dialog; E_Dialog *dialog; E_Fm2_Icon_Info info; @@ -261,6 +262,7 @@ static void _e_fm2_file_rename_delete_cb(void *obj); static void _e_fm2_file_rename_yes_cb(char *text, void *data); static void _e_fm2_file_rename_no_cb(void *data); static void _e_fm2_file_properties(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_properties_delete_cb(void *obj); static void _e_fm2_file_delete(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_file_delete_delete_cb(void *obj); static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog); @@ -1162,6 +1164,13 @@ e_fm2_icon_get(Evas *evas, const char *realpath, return oic; } +EAPI E_Fm2_Icon_Info * +e_fm2_icon_file_info_get(E_Fm2_Icon *ic) +{ + if (!ic) return NULL; + return &(ic->info); +} + /* FIXME: tmp delay - fix later */ static int _e_fm2_cb_spawn_timer(void *data) @@ -2452,6 +2461,11 @@ _e_fm2_icon_free(E_Fm2_Icon *ic) e_object_del(E_OBJECT(ic->entry_dialog)); ic->entry_dialog = NULL; } + if (ic->prop_dialog) + { + e_object_del(E_OBJECT(ic->prop_dialog)); + ic->prop_dialog = NULL; + } if (ic->info.file) evas_stringshare_del(ic->info.file); if (ic->info.mime) evas_stringshare_del(ic->info.mime); if (ic->info.label) evas_stringshare_del(ic->info.label); @@ -5108,8 +5122,19 @@ _e_fm2_file_properties(void *data, E_Menu *m, E_Menu_Item *mi) con = e_container_current_get(man); if (!con) return; - /* FIXME: get and store properties dialog into icon */ - e_fm_prop_file(con, &(ic->info)); + if (ic->prop_dialog) e_object_del(E_OBJECT(ic->prop_dialog)); + ic->prop_dialog = e_fm_prop_file(con, ic); + E_OBJECT(ic->prop_dialog)->data = ic; + e_object_del_attach_func_set(E_OBJECT(ic->prop_dialog), _e_fm2_file_properties_delete_cb); +} + +static void +_e_fm2_file_properties_delete_cb(void *obj) +{ + E_Fm2_Icon *ic; + + ic = E_OBJECT(obj)->data; + ic->prop_dialog = NULL; } static void diff --git a/src/bin/e_fm.h b/src/bin/e_fm.h index abe2a2bde..4486cc24a 100644 --- a/src/bin/e_fm.h +++ b/src/bin/e_fm.h @@ -191,7 +191,8 @@ EAPI Evas_Object * const char *keyhint, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret); - +EAPI E_Fm2_Icon_Info *e_fm2_icon_file_info_get(E_Fm2_Icon *ic); + EAPI void e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e); EAPI void e_fm2_client_del(Ecore_Ipc_Event_Client_Del *e); diff --git a/src/bin/e_fm_prop.c b/src/bin/e_fm_prop.c index e6b24b0f9..5df34be86 100644 --- a/src/bin/e_fm_prop.c +++ b/src/bin/e_fm_prop.c @@ -52,6 +52,7 @@ static void _cb_preview_update(void *data, Evas_Object *obj, void *event_info); /* Actual config data we will be playing with whil the dialog is active */ struct _E_Config_Dialog_Data { + E_Fm2_Icon *ic; E_Fm2_Icon_Info *fi; struct { Evas_Object *icon_wid; @@ -79,7 +80,7 @@ struct _E_Config_Dialog_Data /* a nice easy setup function that does the dirty work */ EAPI E_Config_Dialog * -e_fm_prop_file(E_Container *con, E_Fm2_Icon_Info *fi) +e_fm_prop_file(E_Container *con, E_Fm2_Icon *ic) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; @@ -99,27 +100,28 @@ e_fm_prop_file(E_Container *con, E_Fm2_Icon_Info *fi) cfd = e_config_dialog_new(con, _("File Properties"), "E", "_fm_prop", - "enlightenment/file_properties", 0, v, fi); + "enlightenment/file_properties", 0, v, ic); return cfd; } /**--CREATE--**/ static void -_fill_data(E_Config_Dialog_Data *cfdata, E_Fm2_Icon_Info *fi) +_fill_data(E_Config_Dialog_Data *cfdata, E_Fm2_Icon *ic) { struct passwd *pw; - cfdata->fi = fi; - if (fi->file) cfdata->file = strdup(fi->file); - cfdata->size = e_util_size_string_get(fi->statinfo.st_size); - cfdata->mod_date = e_util_file_time_get(fi->statinfo.st_mtime); - if (fi->mime) cfdata->mime = strdup(fi->mime); - pw = getpwuid(fi->statinfo.st_uid); + cfdata->ic = ic; + cfdata->fi = e_fm2_icon_file_info_get(ic); + if (cfdata->fi->file) cfdata->file = strdup(cfdata->fi->file); + cfdata->size = e_util_size_string_get(cfdata->fi->statinfo.st_size); + cfdata->mod_date = e_util_file_time_get(cfdata->fi->statinfo.st_mtime); + if (cfdata->fi->mime) cfdata->mime = strdup(cfdata->fi->mime); + pw = getpwuid(cfdata->fi->statinfo.st_uid); if (pw) cfdata->owner = strdup(pw->pw_name); - if (fi->statinfo.st_mode & S_IRUSR) cfdata->owner_read = 1; - if (fi->statinfo.st_mode & S_IWUSR) cfdata->owner_write = 1; - if (fi->statinfo.st_mode & S_IROTH) cfdata->others_read = 1; - if (fi->statinfo.st_mode & S_IWOTH) cfdata->others_write = 1; + if (cfdata->fi->statinfo.st_mode & S_IRUSR) cfdata->owner_read = 1; + if (cfdata->fi->statinfo.st_mode & S_IWUSR) cfdata->owner_write = 1; + if (cfdata->fi->statinfo.st_mode & S_IROTH) cfdata->others_read = 1; + if (cfdata->fi->statinfo.st_mode & S_IWOTH) cfdata->others_write = 1; } static void * @@ -317,7 +319,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf ob = e_widget_button_add(evas, "", NULL, _cb_icon_sel, cfdata, cfd); cfdata->gui.icon_wid = ob; oi = e_fm2_icon_get(evas, e_fm2_real_path_get(cfdata->fi->fm), - NULL, cfdata->fi, + cfdata->ic, cfdata->fi, cfg->icon.key_hint, NULL, NULL, 0, &itype); e_widget_button_icon_set(ob, oi); diff --git a/src/bin/e_fm_prop.h b/src/bin/e_fm_prop.h index 1d5e0d15a..52598b436 100644 --- a/src/bin/e_fm_prop.h +++ b/src/bin/e_fm_prop.h @@ -6,7 +6,7 @@ #ifndef E_FM_PROP_H #define E_FM_PROP_H -EAPI E_Config_Dialog *e_fm_prop_file(E_Container *con, E_Fm2_Icon_Info *fi); +EAPI E_Config_Dialog *e_fm_prop_file(E_Container *con, E_Fm2_Icon *ic); #endif #endif