diff --git a/data/themes/default.edc b/data/themes/default.edc index 6572dbd27..0bf68d561 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -149,6 +149,28 @@ collections { /* begin the collection of edje groups that are in this file */ } } + group { name: "e/desktop/background/scrollframe"; + parts { + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + } + } + part { name: "e.swallow.content"; + clip_to: "clipper"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.offset: 0 0; + rel2 { + relative: 0.0 0.0; + offset: -1 -1; + } + } + } + } + } + ///////////////////////////////////////////////////////////////////////////// /*** DEFAULT WINDOW BORDER ***/ group { name: "e/widgets/border/default/border"; diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index f1494739f..a7606ffeb 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -78,6 +78,7 @@ struct _E_Fm2_Smart_Data 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_menu_post_cb(void *data, E_Menu *m); 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_fm2_smart_del(Evas_Object *obj) 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 @@ _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp) 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 @@ _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) +_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,6 +8212,55 @@ _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi) 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) @@ -8278,6 +8329,181 @@ _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, E_Menu_Item *mi) _e_fm2_refresh(sd, m, 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)) +{ + 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) { diff --git a/src/bin/e_icon.c b/src/bin/e_icon.c index b9301de77..f6daf4441 100644 --- a/src/bin/e_icon.c +++ b/src/bin/e_icon.c @@ -27,6 +27,8 @@ static void _e_icon_smart_hide(Evas_Object *obj); 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 @@ e_icon_add(Evas *evas) 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 @@ e_icon_file_set(Evas_Object *obj, const char *file) 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 @@ e_icon_file_key_set(Evas_Object *obj, const char *file, const char *key) 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); diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index 03f72d6c9..f26168d40 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -432,12 +432,16 @@ _e_fwin_new(E_Container *con, const char *dev, const char *path) 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_changed(void *data, Evas_Object *obj, void *event_info) 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 @@ _e_fwin_changed(void *data, Evas_Object *obj, void *event_info) // 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)