overhaul and fix custom bg+overlay setting/unsetting in efm

SVN revision: 78844
This commit is contained in:
Mike Blumenkrantz 2012-11-02 09:04:26 +00:00
parent 5666faaddf
commit 01b47aed5f
3 changed files with 143 additions and 85 deletions

View File

@ -162,6 +162,7 @@ struct _E_Fm2_Smart_Data
Eina_List *handlers;
Ecore_Event_Handler *efreet_cache_update;
Efreet_Desktop *desktop;
};
struct _E_Fm2_Region
@ -361,7 +362,7 @@ static void _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item
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(E_Fm2_Smart_Data *sd, const char *title, void (*ok_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);
@ -458,7 +459,7 @@ static void _e_fm2_volume_eject(void *data, E_Menu *m, E_Menu_Item *mi)
static void _e_fm2_icon_removable_update(E_Fm2_Icon *ic);
static void _e_fm2_volume_icon_update(E_Volume *v);
static int _e_fm2_desktop_open(E_Fm2_Smart_Data *sd);
static void _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere);
static Eina_Bool _e_fm2_sys_suspend_hibernate(void *, int, void *);
@ -8096,6 +8097,8 @@ _e_fm2_smart_del(Evas_Object *obj)
_e_fm2_list = eina_list_remove(_e_fm2_list, sd->obj);
else
_e_fm2_list_remove = eina_list_append(_e_fm2_list_remove, sd->obj);
if (sd->desktop) efreet_desktop_free(sd->desktop);
sd->desktop = NULL;
free(sd);
e_fm2_custom_file_flush();
}
@ -9326,36 +9329,102 @@ _e_fm2_options_menu_pre(void *data, E_Menu *subm)
e_menu_item_callback_set(mi, _e_fm2_settings_icon_item, sd);
}
static void
_custom_file_key_del(E_Fm2_Smart_Data *sd, const char *key)
{
Efreet_Desktop *ef;
char buf[PATH_MAX];
if (sd->desktop) ef = sd->desktop;
else
{
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);
if (!sd->desktop) efreet_desktop_free(ef);
}
static void
_e_fm2_view_menu_del(void *data)
{
E_Fm2_Smart_Data *sd = e_object_data_get(data);
if (!sd) return;
if (sd->image_dialog) return;
if (!sd->desktop) return;
efreet_desktop_free(sd->desktop);
sd->desktop = NULL;
}
static void
_clear_background_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
{
E_Fm2_Smart_Data *sd;
sd = data;
if (!sd) return;
_custom_file_key_del(sd, "X-Enlightenment-Directory-Wallpaper");
evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
}
static void
_clear_overlay_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
{
E_Fm2_Smart_Data *sd = data;
if (!sd) return;
_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_pre(void *data, E_Menu *subm)
{
E_Fm2_Smart_Data *sd;
E_Fm2_Smart_Data *sd = data;
E_Menu_Item *mi;
char buf[PATH_MAX];
int access_ok;
sd = data;
if (subm->items) return;
_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)
if (_e_fm2_desktop_open(sd) < 0) return;
e_object_data_set(E_OBJECT(subm), sd);
e_object_del_attach_func_set(E_OBJECT(subm), _e_fm2_view_menu_del);
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);
while (sd->desktop)
{
if (!eina_hash_find(sd->desktop->x, "X-Enlightenment-Directory-Wallpaper")) break;
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_menu_item_label_set(mi, _("Clear 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);
e_menu_item_callback_set(mi, _clear_background_cb, sd);
break;
}
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);
if (!sd->desktop) return;
if (!eina_hash_find(sd->desktop->x, "X-Enlightenment-Directory-Overlay")) return;
mi = e_menu_item_new(subm);
e_menu_item_label_set(mi, _("Clear overlay"));
e_menu_item_callback_set(mi, _clear_overlay_cb, sd);
}
static void
@ -9433,12 +9502,13 @@ _image_sel_del(void *data)
sd = e_object_data_get(data);
if (!sd) return;
sd->image_dialog = NULL;
if (sd->desktop) efreet_desktop_free(sd->desktop);
sd->desktop = NULL;
}
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))
void (*ok_cb)(void *data, E_Dialog *dia))
{
E_Dialog *dia;
Evas_Object *o;
@ -9455,7 +9525,6 @@ _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
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);
@ -9476,6 +9545,23 @@ _e_fm2_view_image_sel_close(void *data, E_Dialog *dia)
sd->image_dialog = NULL;
}
static int
_e_fm2_desktop_open(E_Fm2_Smart_Data *sd)
{
Efreet_Desktop *ef;
char buf[PATH_MAX];
Eina_Bool ret;
snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
ret = ecore_file_exists(buf) ? ecore_file_can_write(buf)
: ecore_file_can_write(sd->realpath);
if (!ret) return -1;
ef = efreet_desktop_new(buf);
if (!ef) return 0;
sd->desktop = ef;
return 1;
}
static void
_custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value)
{
@ -9483,14 +9569,18 @@ _custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value)
char buf[PATH_MAX];
int len;
snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
ef = efreet_desktop_new(buf);
if (!ef)
if (sd->desktop) ef = sd->desktop;
else
{
ef = efreet_desktop_empty_new(buf);
if (!ef) return;
ef->type = EFREET_DESKTOP_TYPE_DIRECTORY;
ef->name = strdup("Directory look and feel");
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);
@ -9500,23 +9590,7 @@ _custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value)
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);
if (!sd->desktop) efreet_desktop_free(ef);
}
static void
@ -9537,30 +9611,14 @@ _set_background_cb(void *data, E_Dialog *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 __UNUSED__, E_Menu_Item *mi __UNUSED__)
{
E_Fm2_Smart_Data *sd;
E_Fm2_Smart_Data *sd = data;
sd = data;
if (sd->image_dialog) return;
_e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb,
_clear_background_cb);
_e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb);
}
static void
@ -9581,30 +9639,14 @@ _set_overlay_cb(void *data, E_Dialog *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 __UNUSED__, E_Menu_Item *mi __UNUSED__)
{
E_Fm2_Smart_Data *sd;
E_Fm2_Smart_Data *sd = data;
sd = data;
if (sd->image_dialog) return;
_e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb,
_clear_overlay_cb);
_e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb);
}
static void
@ -11040,6 +11082,12 @@ e_fm2_uri_path_list_get(const Eina_List *uri_list)
return path_list;
}
EAPI Efreet_Desktop *
e_fm2_desktop_get(Evas_Object *obj)
{
EFM_SMART_CHECK(NULL);
return sd->desktop;
}
EAPI void
e_fm2_drop_menu(Evas_Object *e_fm, char *args)

View File

@ -211,6 +211,7 @@ EAPI const char *e_fm2_desktop_url_eval(const char *val);
EAPI E_Fm2_Icon_Info *e_fm2_drop_icon_get(Evas_Object *obj);
EAPI void e_fm2_drop_menu(Evas_Object *e_fm, char *args);
EAPI Eina_List *e_fm2_uri_path_list_get(const Eina_List *uri_list);
EAPI Efreet_Desktop *e_fm2_desktop_get(Evas_Object *obj);
EAPI int e_fm2_client_file_move(Evas_Object *e_fm, const char *args);
EAPI int e_fm2_client_file_copy(Evas_Object *e_fm, const char *args);

View File

@ -1625,6 +1625,7 @@ _e_fwin_changed(void *data,
Efreet_Desktop *ef;
const char *dev, *path;
char buf[PATH_MAX];
Eina_Bool need_free = EINA_TRUE;
page = data;
fwin = page->fwin;
@ -1642,8 +1643,13 @@ _e_fwin_changed(void *data,
/* FIXME: first look in E config for a special override for this dir's bg
* or overlay
*/
snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(page->fm_obj));
ef = efreet_desktop_new(buf);
ef = e_fm2_desktop_get(page->fm_obj);
if (ef) need_free = EINA_FALSE;
else
{
snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(page->fm_obj));
ef = efreet_desktop_new(buf);
}
//printf("EF=%p for %s\n", ef, buf);
if (ef)
{
@ -1652,7 +1658,7 @@ _e_fwin_changed(void *data,
fwin->scrollframe_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->scrollframe_file, "X-Enlightenment-Directory-Scrollframe");
fwin->theme_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->theme_file, "X-Enlightenment-Directory-Theme");
//printf("fwin->wallpaper_file = %s\n", fwin->wallpaper_file);
efreet_desktop_free(ef);
if (need_free) efreet_desktop_free(ef);
}
else
{
@ -1693,6 +1699,9 @@ _e_fwin_changed(void *data,
evas_object_show(fwin->under_obj);
}
}
else
edje_object_part_swallow(e_scrollframe_edje_object_get(page->scr),
"e.swallow.bg", NULL);
if (fwin->over_obj)
{
//printf("over obj\n");