hi sergey! Thanks for the patch. I have no time to look it before weekend, but will do by then.
On Thu, May 7, 2009 at 4:46 AM, Sergey P. Semernin <[email protected]> wrote: > Hello, All! > > This patch will add dialogs for directory background and overlay selection > when it's viewed in EFM2. All directory's look and feel information stored > in ".directory.desktop" file in X-attributes. GUI to select/change/clear > background or overlay information available by "Set background..." and > "Set overlay..." commands in "View mode" submenu of directory's popup menu. > These menu items available when .directory.desktop exists and user can write > to it, or user can make .directory.desktop file in directory. > > Also, a several corrections were made: > 1. avoid read old data from .desktop file when saving in efreet_desktop; > 2. added efreet_desktop_x_field_* functions to serve X-attributes; > 3. added container object type check to e_icon; > 4. under_obj and over_obj moved to e_icon in e_fwin to serve both .edj > and regular images. > > e/src/bin/e_fm.c | 250 > ++++++++++++++++++++++++++++++++++++++-- > e/src/bin/e_icon.c | 19 +++ > e/src/modules/fileman/e_fwin.c | 41 +++++- > efreet/src/lib/efreet_desktop.c | 47 +++++++ > efreet/src/lib/efreet_desktop.h | 4 > 5 files changed, 341 insertions(+), 20 deletions(-) > > Index: e/src/bin/e_fm.c > =================================================================== > --- e/src/bin/e_fm.c (revision 40530) > +++ e/src/bin/e_fm.c (working copy) > @@ -78,6 +78,7 @@ > Ecore_Job *refresh_job; > E_Menu *menu; > E_Entry_Dialog *entry_dialog; > + E_Dialog *image_dialog; > unsigned char iconlist_changed : 1; > unsigned char order_file : 1; > unsigned char typebuf_visible : 1; > @@ -307,12 +308,17 @@ > static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, > unsigned int timestamp); > static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m); > static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi); > +static void _e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item > *mi); > static void _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, > E_Menu_Item *mi); > static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi); > static void _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, > E_Menu_Item *mi); > static void _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, > E_Menu_Item *mi); > static void _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi); > static void _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, > E_Menu_Item *mi); > +static void _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m, > E_Menu_Item *mi); > +static void _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m, > E_Menu_Item *mi); > +static void _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char > *title, void (*ok_cb) (void *data, E_Dialog *dia), void (*clear_cb) > (void *data, E_Dialog *dia)); > +static void _e_fm2_view_image_sel_close(void *data, E_Dialog *dia); > static void _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi); > static void _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item > *mi); > static void _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi); > @@ -7368,6 +7374,11 @@ > e_object_del(E_OBJECT(sd->entry_dialog)); > sd->entry_dialog = NULL; > } > + if (sd->image_dialog) > + { > + e_object_del(E_OBJECT(sd->image_dialog)); > + sd->image_dialog = NULL; > + } > if (sd->scroll_job) ecore_job_del(sd->scroll_job); > if (sd->resize_job) ecore_job_del(sd->resize_job); > if (sd->refresh_job) ecore_job_del(sd->refresh_job); > @@ -7724,7 +7735,7 @@ > mi = e_menu_item_new(mn); > e_menu_item_label_set(mi, _("View Mode")); > e_util_menu_item_theme_icon_set(mi, "preferences-appearance"); > - e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_pre, > sd); > + e_menu_item_submenu_pre_callback_set(mi, > _e_fm2_icon_view_menu_pre, sd); > } > if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH)) > { > @@ -8146,20 +8157,11 @@ > } > > static void > -_e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi) > +_e_fm2_view_menu_common(E_Menu *subm, E_Fm2_Smart_Data *sd) > { > - E_Menu *subm; > - E_Fm2_Smart_Data *sd; > - E_Fm2_Config *cfg; > + E_Menu_Item *mi; > char view_mode; > > - sd = data; > - cfg = e_fm2_config_get(sd->obj); > - > - subm = e_menu_new(); > - e_object_data_set(E_OBJECT(subm), sd); > - e_menu_item_submenu_set(mi, subm); > - > view_mode = _e_fm2_view_mode_get(sd); > > mi = e_menu_item_new(subm); > @@ -8210,8 +8212,57 @@ > e_menu_item_label_set(mi, buf); > e_menu_item_submenu_pre_callback_set(mi, > _e_fm2_view_menu_icon_size_pre, sd); > } > + > +static void > +_e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi) > +{ > + E_Menu *subm; > + E_Fm2_Smart_Data *sd; > > + sd = data; > + > + subm = e_menu_new(); > + e_object_data_set(E_OBJECT(subm), sd); > + e_menu_item_submenu_set(mi, subm); > + > + _e_fm2_view_menu_common(subm, sd); > +} > + > static void > +_e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi) > +{ > + E_Menu *subm; > + E_Fm2_Smart_Data *sd; > + char buf[PATH_MAX]; > + int access_ok; > + sd = data; > + > + subm = e_menu_new(); > + e_object_data_set(E_OBJECT(subm), sd); > + e_menu_item_submenu_set(mi, subm); > + > + _e_fm2_view_menu_common(subm, sd); > + > + snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath); > + access_ok = ecore_file_exists(buf) ? ecore_file_can_write(buf) > + : ecore_file_can_write(sd->realpath); > + if (access_ok) > + { > + mi = e_menu_item_new(subm); > + e_menu_item_separator_set(mi, 1); > + > + mi = e_menu_item_new(subm); > + e_menu_item_label_set(mi, _("Set background...")); > + e_util_menu_item_theme_icon_set(mi, "preferences-desktop-wallpaper"); > + e_menu_item_callback_set(mi, _e_fm2_view_menu_set_background_cb, sd); > + > + mi = e_menu_item_new(subm); > + e_menu_item_label_set(mi, _("Set overlay...")); > + e_menu_item_callback_set(mi, _e_fm2_view_menu_set_overlay_cb, sd); > + } > +} > + > +static void > _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi) > { > E_Fm2_Smart_Data *sd = data; > @@ -8279,6 +8330,181 @@ > } > > static void > +_e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title, > + void (*ok_cb) (void *data, E_Dialog *dia), > + void (*clear_cb) (void *data, E_Dialog *dia)) > +{ > + E_Manager *man; > + E_Container *con; > + E_Dialog *dia; > + Evas_Object *o; > + Evas_Coord w, h; > + > + man = e_manager_current_get(); > + if (!man) return; > + con = e_container_current_get(man); > + if (!con) return; > + > + dia = e_dialog_new(con, "E", "_fm2_view_image_select_dialog"); > + if (!dia) return; > + e_dialog_title_set(dia, title); > + > + o = e_widget_fsel_add(dia->win->evas, "/", sd->realpath, NULL, > NULL, NULL, sd, NULL, sd, 1); > + evas_object_show(o); > + e_widget_min_size_get(o, &w, &h); > + e_dialog_content_set(dia, o, w, h); > + dia->data = o; > + > + e_dialog_button_add(dia, _("OK"), NULL, ok_cb, sd); > + e_dialog_button_add(dia, _("Clear"), NULL, clear_cb, sd); > + e_dialog_button_add(dia, _("Cancel"), NULL, > _e_fm2_view_image_sel_close, sd); > + e_dialog_resizable_set(dia, 1); > + e_win_centered_set(dia->win, 1); > + e_dialog_show(dia); > + > + sd->image_dialog = dia; > +} > + > +static void > +_e_fm2_view_image_sel_close(void *data, E_Dialog *dia) > +{ > + E_Fm2_Smart_Data *sd; > + > + sd = data; > + e_object_del(E_OBJECT(dia)); > + sd->image_dialog = NULL; > +} > + > +static void > +_custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char > *value) > +{ > + Efreet_Desktop *ef; > + char buf[PATH_MAX]; > + int len; > + > + snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath); > + ef = efreet_desktop_new(buf); > + if (!ef) > + { > + ef = efreet_desktop_empty_new(buf); > + if (!ef) return; > + ef->type = EFREET_DESKTOP_TYPE_DIRECTORY; > + ef->name = strdup("Directory look and feel"); > + } > + > + len = strlen(sd->realpath); > + if (!strncmp(value, sd->realpath, len)) > + efreet_desktop_x_field_set(ef, key, value + len + 1); > + else > + efreet_desktop_x_field_set(ef, key, value); > + > + efreet_desktop_save(ef); > + efreet_desktop_free(ef); > +} > + > +static void > +_custom_file_key_del(E_Fm2_Smart_Data *sd, const char *key) > +{ > + Efreet_Desktop *ef; > + char buf[PATH_MAX]; > + > + snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath); > + ef = efreet_desktop_new(buf); > + if (!ef) return; > + > + if (efreet_desktop_x_field_del(ef, key)) > + efreet_desktop_save(ef); > + > + efreet_desktop_free(ef); > +} > + > +static void > +_set_background_cb(void *data, E_Dialog *dia) > +{ > + E_Fm2_Smart_Data *sd; > + const char *file; > + > + sd = data; > + if (!sd) return; > + > + file = e_widget_fsel_selection_path_get(dia->data); > + > + if (file) > + _custom_file_key_set(sd, "X-Enlightenment-Directory-Wallpaper", file); > + > + _e_fm2_view_image_sel_close(data, dia); > + evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); > +} > + > +static void > +_clear_background_cb(void *data, E_Dialog *dia) > +{ > + E_Fm2_Smart_Data *sd; > + > + sd = data; > + if (!sd) return; > + > + _e_fm2_view_image_sel_close(data, dia); > + > + _custom_file_key_del(sd, "X-Enlightenment-Directory-Wallpaper"); > + evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); > +} > + > +static void > +_e_fm2_view_menu_set_background_cb(void *data, E_Menu *m, E_Menu_Item *mi) > +{ > + E_Fm2_Smart_Data *sd; > + > + sd = data; > + if (sd->image_dialog) return; > + > + _e_fm2_view_image_sel(sd, _("Set background..."), > _set_background_cb, _clear_background_cb); > +} > + > +static void > +_set_overlay_cb(void *data, E_Dialog *dia) > +{ > + E_Fm2_Smart_Data *sd; > + const char *file; > + > + sd = data; > + if (!sd) return; > + > + file = e_widget_fsel_selection_path_get(dia->data); > + > + if (file) > + _custom_file_key_set(sd, "X-Enlightenment-Directory-Overlay", file); > + > + _e_fm2_view_image_sel_close(data, dia); > + evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); > +} > + > +static void > +_clear_overlay_cb(void *data, E_Dialog *dia) > +{ > + E_Fm2_Smart_Data *sd; > + > + sd = data; > + if (!sd) return; > + > + _e_fm2_view_image_sel_close(data, dia); > + > + _custom_file_key_del(sd, "X-Enlightenment-Directory-Overlay"); > + evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); > +} > + > +static void > +_e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m, E_Menu_Item *mi) > +{ > + E_Fm2_Smart_Data *sd; > + > + sd = data; > + if (sd->image_dialog) return; > + > + _e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb, > _clear_overlay_cb); > +} > + > +static void > _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi) > { > E_Fm2_Smart_Data *sd; > Index: e/src/bin/e_icon.c > =================================================================== > --- e/src/bin/e_icon.c (revision 40530) > +++ e/src/bin/e_icon.c (working copy) > @@ -27,6 +27,8 @@ > static void _e_icon_smart_color_set(Evas_Object *obj, int r, int g, > int b, int a); > static void _e_icon_smart_clip_set(Evas_Object *obj, Evas_Object * clip); > static void _e_icon_smart_clip_unset(Evas_Object *obj); > +static void _e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd); > +static void _e_icon_preloaded(void *data, Evas *e, Evas_Object *obj, > void *event_info); > > /* local subsystem globals */ > static Evas_Smart *_e_smart = NULL; > @@ -39,6 +41,21 @@ > return evas_object_smart_add(evas, _e_smart); > } > > +static void > +_e_icon_obj_prepare(Evas_Object *obj, E_Smart_Data *sd) > +{ > + if (!sd->obj) return; > + > + if (!strcmp(evas_object_type_get(sd->obj), "edje")) > + { > + evas_object_del(sd->obj); > + sd->obj = evas_object_image_add(evas_object_evas_get(obj)); > + evas_object_event_callback_add(sd->obj, > EVAS_CALLBACK_IMAGE_PRELOADED, > + _e_icon_preloaded, obj); > + evas_object_smart_member_add(sd->obj, obj); > + } > +} > + > EAPI void > e_icon_file_set(Evas_Object *obj, const char *file) > { > @@ -47,6 +64,7 @@ > sd = evas_object_smart_data_get(obj); > if (!sd) return; > /* smart code here */ > + _e_icon_obj_prepare(obj, sd); > /* FIXME: 64x64 - unhappy about this. use icon size */ > if (sd->size != 0) > evas_object_image_load_size_set(sd->obj, sd->size, sd->size); > @@ -63,6 +81,7 @@ > sd = evas_object_smart_data_get(obj); > if (!sd) return; > /* smart code here */ > + _e_icon_obj_prepare(obj, sd); > if (sd->size != 0) > evas_object_image_load_size_set(sd->obj, sd->size, sd->size); > evas_object_image_file_set(sd->obj, file, key); > Index: e/src/modules/fileman/e_fwin.c > =================================================================== > --- e/src/modules/fileman/e_fwin.c (revision 40530) > +++ e/src/modules/fileman/e_fwin.c (working copy) > @@ -432,12 +432,16 @@ > fwin->pages = eina_list_append(fwin->pages, page); > fwin->cur_page = page; > > - o = edje_object_add(e_win_evas_get(fwin->win)); > + o = e_icon_add(e_win_evas_get(fwin->win)); > + e_icon_scale_size_set(o, 0); > + e_icon_fill_inside_set(o, 0); > edje_object_part_swallow(fwin->bg_obj, "e.swallow.bg", o); > evas_object_pass_events_set(o, 1); > fwin->under_obj = o; > > - o = edje_object_add(e_win_evas_get(fwin->win)); > + o = e_icon_add(e_win_evas_get(fwin->win)); > + e_icon_scale_size_set(o, 0); > + e_icon_fill_inside_set(o, 0); > > edje_object_part_swallow(e_scrollframe_edje_object_get(page->scrollframe_obj), > "e.swallow.overlay", o); > evas_object_pass_events_set(o, 1); > fwin->over_obj = o; > @@ -1157,7 +1161,7 @@ > E_Fwin *fwin; > E_Fwin_Page *page; > Efreet_Desktop *ef; > - char buf[PATH_MAX]; > + char buf[PATH_MAX], *ext; > > page = data; > fwin = page->fwin; > @@ -1178,20 +1182,43 @@ > // frees - doesnt just unref. > efreet_desktop_free(ef); > } > + else > + { > + #define RELEASE_STR(x) if (x) { eina_stringshare_del(x); (x) = NULL; > } > + RELEASE_STR(fwin->wallpaper_file); > + RELEASE_STR(fwin->overlay_file); > + RELEASE_STR(fwin->scrollframe_file); > + RELEASE_STR(fwin->theme_file); > + #undef RELEASE_STR > + } > if (fwin->under_obj) > { > evas_object_hide(fwin->under_obj); > - edje_object_file_set(fwin->under_obj, NULL, NULL); > if (fwin->wallpaper_file) > - edje_object_file_set(fwin->under_obj, fwin->wallpaper_file, > "e/desktop/background"); > + { > + ext = strrchr(fwin->wallpaper_file, '.'); > + if (ext && !strcasecmp(ext, ".edj")) > + e_icon_file_edje_set(fwin->under_obj, > fwin->wallpaper_file, "e/desktop/background"); > + else > + e_icon_file_set(fwin->under_obj, fwin->wallpaper_file); > + } > + else > + e_icon_file_edje_set(fwin->under_obj, NULL, NULL); > evas_object_show(fwin->under_obj); > } > if (fwin->over_obj) > { > evas_object_hide(fwin->over_obj); > - edje_object_file_set(fwin->over_obj, NULL, NULL); > if (fwin->overlay_file) > - edje_object_file_set(fwin->over_obj, fwin->overlay_file, > "e/desktop/background"); > + { > + ext = strrchr(fwin->overlay_file, '.'); > + if (ext && !strcasecmp(ext, ".edj")) > + e_icon_file_edje_set(fwin->over_obj, fwin->overlay_file, > "e/desktop/background"); > + else > + e_icon_file_set(fwin->over_obj, fwin->overlay_file); > + } > + else > + e_icon_file_edje_set(fwin->over_obj, NULL, NULL); > evas_object_show(fwin->over_obj); > } > if (page->scrollframe_obj) > Index: efreet/src/lib/efreet_desktop.c > =================================================================== > --- efreet/src/lib/efreet_desktop.c (revision 40530) > +++ efreet/src/lib/efreet_desktop.c (working copy) > @@ -429,7 +429,7 @@ > Efreet_Ini *ini; > int ok = 1; > > - ini = efreet_ini_new(desktop->orig_path); > + ini = efreet_ini_new(NULL); > efreet_ini_section_add(ini, "Desktop Entry"); > efreet_ini_section_set(ini, "Desktop Entry"); > > @@ -1838,3 +1838,48 @@ > /* just dup an already absolute buffer */ > return strdup(path); > } > + > +EAPI Eina_Bool > +efreet_desktop_x_field_set(Efreet_Desktop *desktop, const char *key, > const char *data) > +{ > + if (!desktop || strncmp(key, "X-", 2)) > + return EINA_FALSE; > + > + if (!desktop->x) > + desktop->x = > eina_hash_string_superfast_new(EINA_FREE_CB(eina_stringshare_del)); > + > + eina_hash_del(desktop->x, key, NULL); > + eina_hash_add(desktop->x, key, eina_stringshare_add(data)); > + > + return EINA_TRUE; > +} > + > +EAPI const char * > +efreet_desktop_x_field_get(Efreet_Desktop *desktop, const char *key) > +{ > + const char *ret; > + > + if (!desktop || strncmp(key, "X-", 2)) > + return NULL; > + > + if (!desktop->x) > + return NULL; > + > + ret = eina_hash_find(desktop->x, key); > + if (!ret) > + return NULL; > + > + return eina_stringshare_add(ret); > +} > + > +EAPI Eina_Bool > +efreet_desktop_x_field_del(Efreet_Desktop *desktop, const char *key) > +{ > + if (!desktop || strncmp(key, "X-", 2)) > + return EINA_FALSE; > + > + if (!desktop->x) > + return EINA_FALSE; > + > + return eina_hash_del(desktop->x, key, NULL); > +} > Index: efreet/src/lib/efreet_desktop.h > =================================================================== > --- efreet/src/lib/efreet_desktop.h (revision 40530) > +++ efreet/src/lib/efreet_desktop.h (working copy) > @@ -136,6 +136,10 @@ > EAPI Eina_List *efreet_desktop_string_list_parse(const char *string); > EAPI char *efreet_desktop_string_list_join(Eina_List *list); > > +EAPI Eina_Bool efreet_desktop_x_field_set(Efreet_Desktop > *desktop, const char *key, const char *data); > +EAPI const char * efreet_desktop_x_field_get(Efreet_Desktop > *desktop, const char *key); > +EAPI Eina_Bool efreet_desktop_x_field_del(Efreet_Desktop > *desktop, const char *key); > + > EAPI void efreet_desktop_cache_flush(void); > > /** > > > WBR, Sergey. > > ------------------------------------------------------------------------------ > The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your > production scanning environment may not be a perfect world - but thanks to > Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 > Series Scanner you'll get full speed at 300 dpi even with all image > processing features enabled. http://p.sf.net/sfu/kodak-com > _______________________________________________ > enlightenment-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > > -- Gustavo Sverzut Barbieri http://profusion.mobi embedded systems -------------------------------------- MSN: [email protected] Skype: gsbarbieri Mobile: +55 (19) 9225-2202 ------------------------------------------------------------------------------ The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your production scanning environment may not be a perfect world - but thanks to Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 Series Scanner you'll get full speed at 300 dpi even with all image processing features enabled. http://p.sf.net/sfu/kodak-com _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
