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.
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);
/**
------------------------------------------------------------------------------
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