On Thu, 7 May 2009 11:46:19 +0400 "Sergey P. Semernin"
<[email protected]> said:
ooh nice! checked - looks ok. in svn it goes! awesome!
> 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.
>
--
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler) [email protected]
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables
unlimited royalty-free distribution of the report engine
for externally facing server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel