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; Eina_List *handlers;
Ecore_Event_Handler *efreet_cache_update; Ecore_Event_Handler *efreet_cache_update;
Efreet_Desktop *desktop;
}; };
struct _E_Fm2_Region 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_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_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_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_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_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_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_icon_removable_update(E_Fm2_Icon *ic);
static void _e_fm2_volume_icon_update(E_Volume *v); 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 void _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere);
static Eina_Bool _e_fm2_sys_suspend_hibernate(void *, int, void *); 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); _e_fm2_list = eina_list_remove(_e_fm2_list, sd->obj);
else else
_e_fm2_list_remove = eina_list_append(_e_fm2_list_remove, sd->obj); _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); free(sd);
e_fm2_custom_file_flush(); 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); 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 static void
_e_fm2_view_menu_pre(void *data, E_Menu *subm) _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; E_Menu_Item *mi;
char buf[PATH_MAX];
int access_ok;
sd = data;
if (subm->items) return; if (subm->items) return;
_e_fm2_view_menu_common(subm, sd); _e_fm2_view_menu_common(subm, sd);
snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath); if (_e_fm2_desktop_open(sd) < 0) return;
access_ok = ecore_file_exists(buf) ? ecore_file_can_write(buf) e_object_data_set(E_OBJECT(subm), sd);
: ecore_file_can_write(sd->realpath); e_object_del_attach_func_set(E_OBJECT(subm), _e_fm2_view_menu_del);
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);
while (sd->desktop)
{ {
if (!eina_hash_find(sd->desktop->x, "X-Enlightenment-Directory-Wallpaper")) break;
mi = e_menu_item_new(subm); mi = e_menu_item_new(subm);
e_menu_item_separator_set(mi, 1); e_menu_item_label_set(mi, _("Clear background"));
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_util_menu_item_theme_icon_set(mi, "preferences-desktop-wallpaper");
e_menu_item_callback_set(mi, _e_fm2_view_menu_set_background_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);
} }
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 static void
@ -9433,12 +9502,13 @@ _image_sel_del(void *data)
sd = e_object_data_get(data); sd = e_object_data_get(data);
if (!sd) return; if (!sd) return;
sd->image_dialog = NULL; sd->image_dialog = NULL;
if (sd->desktop) efreet_desktop_free(sd->desktop);
sd->desktop = NULL;
} }
static void static void
_e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title, _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
void (*ok_cb)(void *data, E_Dialog *dia), void (*ok_cb)(void *data, E_Dialog *dia))
void (*clear_cb)(void *data, E_Dialog *dia))
{ {
E_Dialog *dia; E_Dialog *dia;
Evas_Object *o; Evas_Object *o;
@ -9455,7 +9525,6 @@ _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
dia->data = o; dia->data = o;
e_dialog_button_add(dia, _("OK"), NULL, ok_cb, sd); 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_button_add(dia, _("Cancel"), NULL, _e_fm2_view_image_sel_close, sd);
e_dialog_resizable_set(dia, 1); e_dialog_resizable_set(dia, 1);
e_win_centered_set(dia->win, 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; 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 static void
_custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value) _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]; char buf[PATH_MAX];
int len; int len;
snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath); if (sd->desktop) ef = sd->desktop;
ef = efreet_desktop_new(buf); else
if (!ef)
{ {
ef = efreet_desktop_empty_new(buf); snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
if (!ef) return; ef = efreet_desktop_new(buf);
ef->type = EFREET_DESKTOP_TYPE_DIRECTORY; if (!ef)
ef->name = strdup("Directory look and feel"); {
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); 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_x_field_set(ef, key, value);
efreet_desktop_save(ef); efreet_desktop_save(ef);
efreet_desktop_free(ef); if (!sd->desktop) 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 static void
@ -9537,30 +9611,14 @@ _set_background_cb(void *data, E_Dialog *dia)
evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); 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 static void
_e_fm2_view_menu_set_background_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) _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; if (sd->image_dialog) return;
_e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb, _e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb);
_clear_background_cb);
} }
static void static void
@ -9581,30 +9639,14 @@ _set_overlay_cb(void *data, E_Dialog *dia)
evas_object_smart_callback_call(sd->obj, "dir_changed", NULL); 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 static void
_e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) _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; if (sd->image_dialog) return;
_e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb, _e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb);
_clear_overlay_cb);
} }
static void static void
@ -11040,6 +11082,12 @@ e_fm2_uri_path_list_get(const Eina_List *uri_list)
return path_list; return path_list;
} }
EAPI Efreet_Desktop *
e_fm2_desktop_get(Evas_Object *obj)
{
EFM_SMART_CHECK(NULL);
return sd->desktop;
}
EAPI void EAPI void
e_fm2_drop_menu(Evas_Object *e_fm, char *args) 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 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 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 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_move(Evas_Object *e_fm, const char *args);
EAPI int e_fm2_client_file_copy(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; Efreet_Desktop *ef;
const char *dev, *path; const char *dev, *path;
char buf[PATH_MAX]; char buf[PATH_MAX];
Eina_Bool need_free = EINA_TRUE;
page = data; page = data;
fwin = page->fwin; 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 /* FIXME: first look in E config for a special override for this dir's bg
* or overlay * or overlay
*/ */
snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(page->fm_obj)); ef = e_fm2_desktop_get(page->fm_obj);
ef = efreet_desktop_new(buf); 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); //printf("EF=%p for %s\n", ef, buf);
if (ef) 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->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"); 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); //printf("fwin->wallpaper_file = %s\n", fwin->wallpaper_file);
efreet_desktop_free(ef); if (need_free) efreet_desktop_free(ef);
} }
else else
{ {
@ -1693,6 +1699,9 @@ _e_fwin_changed(void *data,
evas_object_show(fwin->under_obj); 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) if (fwin->over_obj)
{ {
//printf("over obj\n"); //printf("over obj\n");