From c34bae60643b9d945e16e7147be59c4829b9376e Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 7 Jan 2007 09:01:47 +0000 Subject: [PATCH] working on fm prop dialog. i don't like how i am getting the icon info for a file. i think i ned to abstract that much mroe cleanly. also desklock SHOULD have else-if's SVN revision: 27841 --- src/bin/e_desklock.c | 6 +- src/bin/e_fm.c | 402 ++++++++++++++++++++++++------------------- src/bin/e_fm.h | 10 +- src/bin/e_fm_prop.c | 50 ++++-- 4 files changed, 269 insertions(+), 199 deletions(-) diff --git a/src/bin/e_desklock.c b/src/bin/e_desklock.c index 9b1fde712..4aa34c4c4 100644 --- a/src/bin/e_desklock.c +++ b/src/bin/e_desklock.c @@ -694,9 +694,9 @@ _desklock_pam_init(E_Desklock_Auth *da) /* try other pam profiles - and system-auth (login for fbsd users) is a fallback */ pam_prof = "login"; if (ecore_file_exists("/etc/pam.d/enlightenment")) pam_prof = "enlightenment"; - if (ecore_file_exists("/etc/pam.d/xscreensaver")) pam_prof = "xscreensaver"; - if (ecore_file_exists("/etc/pam.d/kscreensaver")) pam_prof = "kscreensaver"; - if (ecore_file_exists("/etc/pam.d/system-auth")) pam_prof = "system-auth"; + else if (ecore_file_exists("/etc/pam.d/xscreensaver")) pam_prof = "xscreensaver"; + else if (ecore_file_exists("/etc/pam.d/kscreensaver")) pam_prof = "kscreensaver"; + else if (ecore_file_exists("/etc/pam.d/system-auth")) pam_prof = "system-auth"; if ((pamerr = pam_start(pam_prof, da->user, &(da->pam.conv), &(da->pam.handle))) != PAM_SUCCESS) diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 34509f165..161916eac 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -30,7 +30,6 @@ typedef enum _E_Fm2_Fop_Type typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data; typedef struct _E_Fm2_Region E_Fm2_Region; -typedef struct _E_Fm2_Icon E_Fm2_Icon; typedef struct _E_Fm2_Action E_Fm2_Action; typedef struct _E_Fm2_Fop E_Fm2_Fop; typedef struct _E_Fm2_Fop_Item E_Fm2_Fop_Item; @@ -911,6 +910,225 @@ e_fm2_fop_add_add(Evas_Object *obj, const char *file, const char *rel, int after fi->fop->items = evas_list_append(fi->fop->items, fi); } +EAPI Evas_Object * +e_fm2_icon_get(Evas *evas, const char *realpath, + E_Fm2_Icon *ic, E_Fm2_Icon_Info *ici, + const char *keyhint, + void (*gen_func) (void *data, Evas_Object *obj, void *event_info), + void *data, int force_gen, const char **type_ret) +{ + Evas_Object *oic; + char buf[4096], *p; + + if (ici->icon) + { + /* custom icon */ + if (ici->icon[0] == '/') + { + /* path to icon file */ + p = strrchr(ici->icon, '.'); + if ((p) && (!strcmp(p, ".edj"))) + { + oic = edje_object_add(evas); + if (!edje_object_file_set(oic, ici->icon, "icon")) + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + } + else + { + oic = e_icon_add(evas); + e_icon_file_set(oic, ici->icon); + e_icon_fill_inside_set(oic, 1); + } + if (type_ret) *type_ret = "CUSTOM"; + } + else + { + /* theme icon */ + oic = edje_object_add(evas); + e_util_edje_icon_set(oic, ici->icon); + if (type_ret) *type_ret = "THEME_ICON"; + } + return oic; + } + if (S_ISDIR(ici->statinfo.st_mode)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/folder"); + } + else + { + if (ici->mime) + { + const char *icon; + + icon = e_fm_mime_icon_get(ici->mime); + /* use mime type to select icon */ + if (!icon) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + } + else if (!strcmp(icon, "THUMB")) + { + if (ici->pseudo_link) + snprintf(buf, sizeof(buf), "%s/%s", ici->pseudo_dir, ici->file); + else + snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file); + + oic = e_thumb_icon_add(evas); + e_thumb_icon_file_set(oic, buf, NULL); + e_thumb_icon_size_set(oic, 128, 128); + if (gen_func) evas_object_smart_callback_add(oic, + "e_thumb_gen", + gen_func, data); + if (!ic) + e_thumb_icon_begin(oic); + else + _e_fm2_icon_thumb(ic, oic, force_gen); + if (type_ret) *type_ret = "THUMB"; + } + else if (!strcmp(icon, "DESKTOP")) + { + E_App *app; + + if (ici->pseudo_link) + snprintf(buf, sizeof(buf), "%s/%s", ici->pseudo_dir, ici->file); + else + snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file); + app = e_app_new(buf, 0); + if (app) + { + oic = e_app_icon_add(app, evas); + e_object_unref(E_OBJECT(app)); + } + if (type_ret) *type_ret = "DESKTOP"; + } + else if (!strncmp(icon, "e/icons/fileman/mime/", 21)) + { + oic = edje_object_add(evas); + if (!e_theme_edje_object_set(oic, + "base/theme/fileman", + icon)) + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "THEME"; + } + else + { + p = strrchr(icon, '.'); + if ((p) && (!strcmp(p, ".edj"))) + { + oic = edje_object_add(evas); + if (!edje_object_file_set(oic, icon, "icon")) + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + } + else + { + oic = e_icon_add(evas); + e_icon_file_set(oic, icon); + e_icon_fill_inside_set(oic, 1); + } + if (type_ret) *type_ret = "CUSTOM"; + } + } + else + { + if (ici->pseudo_link) + snprintf(buf, sizeof(buf), "%s/%s", ici->pseudo_dir, ici->file); + else + snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file); + /* fallback */ + if ( + (e_util_glob_case_match(ici->file, "*.edj")) + ) + { + oic = e_thumb_icon_add(evas); + if (keyhint) + e_thumb_icon_file_set(oic, buf, keyhint); + else + { + /* FIXME: There is probably a quicker way of doing this. */ + if (edje_file_group_exists(buf, "icon")) + e_thumb_icon_file_set(oic, buf, "icon"); + else if (edje_file_group_exists(buf, "e/desktop/background")) + e_thumb_icon_file_set(oic, buf, "e/desktop/background"); + else if (edje_file_group_exists(buf, "e/init/splash")) + e_thumb_icon_file_set(oic, buf, "e/init/splash"); + } + e_thumb_icon_size_set(oic, 128, 96); + if (gen_func) evas_object_smart_callback_add(oic, + "e_thumb_gen", + gen_func, data); + if (!ic) + e_thumb_icon_begin(oic); + else + _e_fm2_icon_thumb(ic, oic, force_gen); + if (type_ret) *type_ret = "THUMB"; + } + else if ((e_util_glob_case_match(ici->file, "*.desktop")) || + (e_util_glob_case_match(ici->file, "*.directory"))) + { + E_App *app; + + app = e_app_new(buf, 0); + if (app) + { + oic = e_app_icon_add(app, evas); + e_object_unref(E_OBJECT(app)); + } + if (type_ret) *type_ret = "DESKTOP"; + } + else if (S_ISCHR(ici->statinfo.st_mode)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + else if (S_ISBLK(ici->statinfo.st_mode)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + else if (S_ISFIFO(ici->statinfo.st_mode)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + else if (S_ISSOCK(ici->statinfo.st_mode)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + else if (ecore_file_can_exec(buf)) + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + else + { + oic = edje_object_add(evas); + e_theme_edje_object_set(oic, "base/theme/fileman", + "e/icons/fileman/file"); + if (type_ret) *type_ret = "FILE_TYPE"; + } + } + } + return oic; +} + /* local subsystem functions */ static const char * _e_fm2_dev_path_map(const char *dev, const char *path) @@ -1465,7 +1683,6 @@ _e_fm2_icons_place_custom_icons(E_Fm2_Smart_Data *sd) } } -#if 0 static void _e_fm2_icons_place_custom_grid_icons(E_Fm2_Smart_Data *sd) { @@ -1485,7 +1702,6 @@ _e_fm2_icons_place_custom_grid_icons(E_Fm2_Smart_Data *sd) if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h; } } -#endif static void _e_fm2_icons_place_custom_smart_grid_icons(E_Fm2_Smart_Data *sd) @@ -1560,7 +1776,7 @@ _e_fm2_icons_place(Evas_Object *obj) _e_fm2_icons_place_custom_icons(sd); break; case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS: - _e_fm2_icons_place_custom_smart_grid_icons(sd); + _e_fm2_icons_place_custom_grid_icons(sd); break; case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS: _e_fm2_icons_place_custom_smart_grid_icons(sd); @@ -1993,183 +2209,13 @@ _e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, void (*gen_func) (vo Evas_Object *oic; char buf[4096], *p; - if (ic->info.icon) + oic = e_fm2_icon_get(evas_object_evas_get(o), ic->sd->realpath, + ic, &(ic->info), ic->sd->config->icon.key_hint, + gen_func, data, force_gen, NULL); + if (oic) { - /* custom icon */ - if (ic->info.icon[0] == '/') - { - /* path to icon file */ - oic = e_icon_add(evas_object_evas_get(o)); - e_icon_file_set(oic, ic->info.icon); - e_icon_fill_inside_set(oic, 1); - } - else - { - /* theme icon */ - oic = edje_object_add(evas_object_evas_get(o)); - e_util_edje_icon_set(oic, ic->info.icon); - } edje_object_part_swallow(o, "e.swallow.icon", oic); evas_object_show(oic); - return oic; - } - if (S_ISDIR(ic->info.statinfo.st_mode)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/folder"); - edje_object_part_swallow(o, "e.swallow.icon", oic); - evas_object_show(oic); - } - else - { - if (ic->info.mime) - { - const char *icon; - - icon = e_fm_mime_icon_get(ic->info.mime); - /* use mime type to select icon */ - if (!icon) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else if (!strcmp(icon, "THUMB")) - { - if (ic->info.pseudo_link) - snprintf(buf, sizeof(buf), "%s/%s", ic->info.pseudo_dir, ic->info.file); - else - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); - - oic = e_thumb_icon_add(evas_object_evas_get(o)); - e_thumb_icon_file_set(oic, buf, NULL); - e_thumb_icon_size_set(oic, 128, 128); - evas_object_smart_callback_add(oic, "e_thumb_gen", - gen_func, data); - _e_fm2_icon_thumb(ic, oic, force_gen); - } - else if (!strcmp(icon, "DESKTOP")) - { - E_App *app; - - if (ic->info.pseudo_link) - snprintf(buf, sizeof(buf), "%s/%s", ic->info.pseudo_dir, ic->info.file); - else - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); - app = e_app_new(buf, 0); - if (app) - { - oic = e_app_icon_add(app, evas_object_evas_get(o)); - e_object_unref(E_OBJECT(app)); - } - } - else if (!strncmp(icon, "e/icons/fileman/mime/", 21)) - { - oic = edje_object_add(evas_object_evas_get(o)); - if (!e_theme_edje_object_set(oic, - "base/theme/fileman", - icon)) - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else - { - p = strrchr(icon, '.'); - if ((p) && (!strcmp(p, ".edj"))) - { - oic = edje_object_add(evas_object_evas_get(o)); - if (!edje_object_file_set(oic, icon, "icon")) - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else - { - oic = e_icon_add(evas_object_evas_get(o)); - e_icon_file_set(oic, icon); - } - } - } - else - { - if (ic->info.pseudo_link) - snprintf(buf, sizeof(buf), "%s/%s", ic->info.pseudo_dir, ic->info.file); - else - snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); - /* fallback */ - if ( - (e_util_glob_case_match(ic->info.file, "*.edj")) - ) - { - oic = e_thumb_icon_add(evas_object_evas_get(o)); - if (ic->sd->config->icon.key_hint) - e_thumb_icon_file_set(oic, buf, ic->sd->config->icon.key_hint); - else - { - /* FIXME: There is probably a quicker way of doing this. */ - if (edje_file_group_exists(buf, "icon")) - e_thumb_icon_file_set(oic, buf, "icon"); - else if (edje_file_group_exists(buf, "e/desktop/background")) - e_thumb_icon_file_set(oic, buf, "e/desktop/background"); - else if (edje_file_group_exists(buf, "e/init/splash")) - e_thumb_icon_file_set(oic, buf, "e/init/splash"); - } - e_thumb_icon_size_set(oic, 128, 96); - evas_object_smart_callback_add(oic, "e_thumb_gen", - gen_func, data); - _e_fm2_icon_thumb(ic, oic, force_gen); - } - else if ((e_util_glob_case_match(ic->info.file, "*.desktop")) || - (e_util_glob_case_match(ic->info.file, "*.directory"))) - { - E_App *app; - - app = e_app_new(buf, 0); - if (app) - { - oic = e_app_icon_add(app, evas_object_evas_get(o)); - e_object_unref(E_OBJECT(app)); - } - } - else if (S_ISCHR(ic->info.statinfo.st_mode)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else if (S_ISBLK(ic->info.statinfo.st_mode)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else if (S_ISFIFO(ic->info.statinfo.st_mode)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else if (S_ISSOCK(ic->info.statinfo.st_mode)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else if (ecore_file_can_exec(buf)) - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - else - { - oic = edje_object_add(evas_object_evas_get(o)); - e_theme_edje_object_set(oic, "base/theme/fileman", - "e/icons/fileman/file"); - } - } - edje_object_part_swallow(o, "e.swallow.icon", oic); - evas_object_show(oic); } return oic; } diff --git a/src/bin/e_fm.h b/src/bin/e_fm.h index b935579ff..4a5b049d9 100644 --- a/src/bin/e_fm.h +++ b/src/bin/e_fm.h @@ -26,6 +26,7 @@ typedef enum _E_Fm2_Menu_Flags } E_Fm2_Menu_Flags; typedef struct _E_Fm2_Config E_Fm2_Config; +typedef struct _E_Fm2_Icon E_Fm2_Icon; typedef struct _E_Fm2_Icon_Info E_Fm2_Icon_Info; #else @@ -141,6 +142,13 @@ EAPI void e_fm2_fop_delete_add(Evas_Object *obj, E_Fm2_Icon_Inf EAPI void e_fm2_fop_move_add(Evas_Object *obj, const char *src, const char *dst, const char *rel, int after, int file_add); EAPI void e_fm2_fop_link_add(Evas_Object *obj, const char *src, const char *dst); EAPI void e_fm2_fop_add_add(Evas_Object *obj, const char *file, const char *rel, int after); - + +EAPI Evas_Object * + e_fm2_icon_get(Evas *evas, const char *realpath, + E_Fm2_Icon *ic, E_Fm2_Icon_Info *ici, + const char *keyhint, + void (*gen_func) (void *data, Evas_Object *obj, void *event_info), + void *data, int force_gen, const char **type_ret); + #endif #endif diff --git a/src/bin/e_fm_prop.c b/src/bin/e_fm_prop.c index 08e284015..800bd1cb3 100644 --- a/src/bin/e_fm_prop.c +++ b/src/bin/e_fm_prop.c @@ -163,9 +163,12 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf Evas_Object *o, *ot, *ob, *of, *oi; E_Radio_Group *rg; char buf[4096]; + E_Fm2_Config *cfg; + const char *itype = NULL; snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(cfdata->fi->fm), cfdata->fi->file); + cfg = e_fm2_config_get(cfdata->fi->fm); o = e_widget_table_add(evas, 0); ot = e_widget_table_add(evas, 0); @@ -236,33 +239,46 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf ob = e_widget_button_add(evas, "", NULL, _cb_icon_sel, cfdata, cfd); cfdata->gui.icon_wid = ob; - if (0) /* FIXME: find icon */ + oi = e_fm2_icon_get(evas, e_fm2_real_path_get(cfdata->fi->fm), + NULL, cfdata->fi, + cfg->icon.key_hint, + NULL, NULL, 0, &itype); + e_widget_button_icon_set(ob, oi); + e_widget_frametable_object_append(ot, ob, 0, 0, 1, 3, 0, 1, 0, 1); + + if (itype) { - oi = NULL; - e_widget_button_icon_set(ob, oi); + if ((!strcmp(itype, "THEME_ICON")) || + (!strcmp(itype, "DESKTOP")) || + (!strcmp(itype, "FILE_TYPE"))) + { + e_widget_disabled_set(ob, 1); + cfdata->icon_type = 0; + } + else if (!strcmp(itype, "THUMB")) + { + cfdata->icon_type = 1; + e_widget_disabled_set(ob, 1); + } + else if (!strcmp(itype, "CUSTOM")) + cfdata->icon_type = 2; } - e_widget_disabled_set(ob, 1); - e_widget_frametable_object_append(ot, ob, 0, 0, 1, 3, 1, 1, 1, 1); + else + cfdata->icon_type = 0; rg = e_widget_radio_group_new(&cfdata->icon_type); - ob = e_widget_radio_add(evas, _("Thumbnail"), 0, rg); + ob = e_widget_radio_add(evas, _("Default"), 0, rg); evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); e_widget_frametable_object_append(ot, ob, 1, 0, 1, 1, 1, 1, 1, 1); - ob = e_widget_radio_add(evas, _("Theme Icon"), 1, rg); + ob = e_widget_radio_add(evas, _("Thumbnail"), 1, rg); evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); e_widget_frametable_object_append(ot, ob, 1, 1, 1, 1, 1, 1, 1, 1); - ob = e_widget_radio_add(evas, _("Edje File"), 2, rg); + ob = e_widget_radio_add(evas, _("Custom"), 2, rg); evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); e_widget_frametable_object_append(ot, ob, 1, 2, 1, 1, 1, 1, 1, 1); - ob = e_widget_radio_add(evas, _("Image"), 3, rg); - evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); - e_widget_frametable_object_append(ot, ob, 2, 0, 1, 1, 1, 1, 1, 1); - ob = e_widget_radio_add(evas, _("Default"), 4, rg); - evas_object_smart_callback_add(ob, "changed", _cb_type, cfdata); - e_widget_frametable_object_append(ot, ob, 2, 1, 1, 1, 1, 1, 1, 1); - ob = e_widget_check_add(evas, _("Use this icon for files of this type"), &(cfdata->icon_mime)); - e_widget_frametable_object_append(ot, ob, 0, 3, 3, 1, 1, 1, 1, 1); + ob = e_widget_check_add(evas, _("Use this icon for all files of this type"), &(cfdata->icon_mime)); + e_widget_frametable_object_append(ot, ob, 0, 3, 2, 1, 1, 1, 1, 1); e_widget_table_object_append(o, ot, 0, 1, 2, 1, 1, 1, 1, 1); @@ -298,7 +314,7 @@ _cb_type(void *data, Evas_Object *obj, void *event_info) E_Config_Dialog_Data *cfdata; cfdata = data; - if ((cfdata->icon_type == 2) || (cfdata->icon_type == 3)) + if (cfdata->icon_type == 2) e_widget_disabled_set(cfdata->gui.icon_wid, 0); else e_widget_disabled_set(cfdata->gui.icon_wid, 1);