Enlightenment CVS committal Author : onefang Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_apps.c e_apps.h Log Message: Rationalise the icon code a bit. =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_apps.c,v retrieving revision 1.218 retrieving revision 1.219 diff -u -3 -r1.218 -r1.219 --- e_apps.c 3 Oct 2006 12:56:00 -0000 1.218 +++ e_apps.c 3 Oct 2006 15:51:58 -0000 1.219 @@ -44,13 +44,12 @@ { Ecore_Idler *idler; int all_done; - double begin; + double begin, pass; }; static Evas_Bool _e_apps_hash_cb_init (Evas_Hash *hash, const char *key, void *data, void *fdata); static int _e_apps_hash_idler_cb (void *data); static Evas_Bool _e_apps_hash_idler_cb_init(Evas_Hash *hash, const char *key, void *data, void *fdata); -static void _e_app_fdo_icon_search (E_App *a); static void _e_app_free (E_App *a); static E_App *_e_app_subapp_file_find (E_App *a, const char *file); static int _e_app_new_save (E_App *a); @@ -60,6 +59,7 @@ static void _e_app_subdir_rescan (E_App *app); static int _e_app_is_eapp (const char *path); static int _e_app_copy (E_App *dst, E_App *src); +static E_App_Icon_Type _e_app_icon_type (E_App *a); static void _e_app_fields_save_others(E_App *a); static void _e_app_save_order (E_App *app); static int _e_app_cb_event_border_add(void *data, int type, void *event); @@ -218,6 +218,7 @@ idler = data; idler->all_done = 1; + idler->pass = ecore_time_get(); /* Even though we are only interested in the next one, the hash may have changed * since we last looked at it, so iterate through them again. Doesn't seem to * slow the process down much. @@ -256,68 +257,26 @@ if (stat(a->path, &st) >= 0) a->mtime = st.st_mtime; e_app_fields_fill(a, a->path); - if (!a->filled) return 1; - idler->all_done = 0; - return 0; } #if IDLE_ICONS - else if ((!a->idle_icon) && (!a->found_icon) && (!a->no_icon)) + else if ((!a->idle_icon) && (a->icon_type == E_APP_ICON_UNKNOWN)) { int theme_match = 0; a->idle_icon = 1; - /* If the icon was hard coded into the .desktop files Icon field, then theming doesn't matter. */ - if (a->hard_icon) - theme_match = 1; - else if ((e_config->icon_theme == NULL) && (a->icon_theme == NULL)) /* Check to see if the icon theme is different. */ - theme_match = 1; - else if ((e_config->icon_theme) && (a->icon_theme) && (strcmp(e_config->icon_theme, a->icon_theme) == 0)) - theme_match = 1; - - /* Check if we already know the icon path. */ - if ((theme_match) && (a->icon_path) && (a->icon_path[0] != 0)) - { - a->found_icon = 1; - printf("P"); - } - else - { - /* Check the theme for icons. */ - if (e_util_edje_icon_list_check(a->icon_class)) - { - a->found_icon = 1; - printf("C"); - } - else - { - if (edje_file_group_exists(a->path, "icon")) - { - a->found_icon = 1; - printf("G"); - } - else /* If that fails, then this might be an FDO icon. */ - _e_app_fdo_icon_search(a); - - if (a->icon_path) - { - a->found_icon = 1; - printf("F"); - } - else - printf("N"); - } - } - - a->found_icon = 1; /* Seems strange, but this stops it from looping infinitely. */ - if ((!a->found_icon) && (!a->no_icon)) return 1; - idler->all_done = 0; - return 0; + _e_app_icon_type(a); } #endif - return 1; + /* FIXME: This time should be since the beginnig of all idler processing, + * and the time limit should be tied to the frame rate. + */ + if ((ecore_time_get() - idler->pass) < 0.07) return 1; + idler->all_done = 0; + return 0; } + #if CLEVER_BORDERS static Evas_Bool _e_apps_border_hash_cb_free(Evas_Hash *hash, const char *key, void *data, void *fdata) @@ -490,10 +449,10 @@ if (st.st_mtime > a->mtime) { e_app_fields_empty(a); - printf("H"); + printf("M"); } else - printf("O"); + printf("H"); } e_object_ref(E_OBJECT(a)); } @@ -623,6 +582,7 @@ snprintf(buf, sizeof(buf), "%s/_new_app_%1.1f.desktop", _e_apps_path_all, ecore_time_get()); a->path = evas_stringshare_add(buf); } + a->icon_type = E_APP_ICON_UNKNOWN; // printf("NEW APP %p %s\n", a, a->path); return a; } @@ -1201,7 +1161,9 @@ { int is_glob = 0; +#if DEBUG printf("%c", t); +#endif if (glob) { /* Check if text is a glob. This is a really simple check, it could be more complex. */ @@ -1415,6 +1377,7 @@ winner.ok = 0; if (ok) /* Fill all E_Apps and try again on the second pass. */ { +printf("SECOND PASS\n"); for (l = _e_apps_all->subapps; l; l = l->next) { a = l->data; @@ -1829,7 +1792,7 @@ if (desktop) { a->desktop = desktop; - + printf("."); if (desktop->name) a->name = evas_stringshare_add(desktop->name); if (desktop->generic) a->generic = evas_stringshare_add(desktop->generic); @@ -1850,8 +1813,7 @@ a->wait_exit = desktop->wait_exit; a->hard_icon = desktop->hard_icon; a->dirty_icon = 0; - a->no_icon = 0; - a->found_icon = 0; + a->icon_type = E_APP_ICON_UNKNOWN; a->filled = 1; @@ -2228,10 +2190,10 @@ a->win_role = NULL; a->dirty_icon = 0; a->hard_icon = 0; - a->no_icon = 0; - a->found_icon = 0; + a->icon_type = E_APP_ICON_UNKNOWN; a->filled = 0; a->idle_fill = 0; + a->idle_icon = 0; } EAPI Ecore_List * @@ -2318,79 +2280,99 @@ return ok; } -static Evas_Object * -_e_app_icon_path_add(Evas *evas, E_App *a) -{ - Evas_Object *o; - char *ext; - - o = e_icon_add(evas); - ext = strrchr(a->icon_path, '.'); - if (ext) - { - if (strcmp(ext, ".edj") == 0) - e_icon_file_edje_set(o, a->icon_path, "icon"); - else - e_icon_file_set(o, a->icon_path); - } - else - e_icon_file_set(o, a->icon_path); - e_icon_fill_inside_set(o, 1); - - return o; -} - - -static void -_e_app_icon_path_add_to_menu_item(E_Menu_Item *mi, E_App *a) +static E_App_Icon_Type +_e_app_icon_type(E_App *a) { - char *ext; + if (a->icon_type == E_APP_ICON_UNKNOWN) + { + int theme_match = 0; - ext = strrchr(a->icon_path, '.'); - if (ext) - { - if (strcmp(ext, ".edj") == 0) - e_menu_item_icon_edje_set(mi, a->icon_path, "icon"); - else - e_menu_item_icon_file_set(mi, a->icon_path); - } - else - e_menu_item_icon_file_set(mi, a->icon_path); -} + /* If the icon was hard coded into the .desktop files Icon field, then theming doesn't matter. */ + if (a->hard_icon) + theme_match = 1; + else if ((e_config->icon_theme == NULL) && (a->icon_theme == NULL)) /* Check to see if the icon theme is different. */ + theme_match = 1; + else if ((e_config->icon_theme) && (a->icon_theme) && (strcmp(e_config->icon_theme, a->icon_theme) == 0)) + theme_match = 1; -static void -_e_app_fdo_icon_search(E_App *a) -{ - if ((!a->no_icon) && (a->icon_class)) - { - char *v = NULL; - - /* FIXME: Use a real icon size. */ - v = (char *)ecore_desktop_icon_find(a->icon_class, NULL, e_config->icon_theme); - if (v) - { - if (a->icon_path) evas_stringshare_del(a->icon_path); - a->icon_path = evas_stringshare_add(v); - if (e_config->icon_theme) + /* Check if we already know the icon path. */ + if ((theme_match) && (a->icon_path) && (a->icon_path[0] != 0)) + { + a->icon_type = E_APP_ICON_PATH; +#if DEBUG + printf("P"); +#endif + } + else + { + /* Check the theme for icons. */ + if (e_util_edje_icon_list_check(a->icon_class)) { - if (a->icon_theme) evas_stringshare_del(a->icon_theme); - a->icon_theme = evas_stringshare_add(e_config->icon_theme); + a->icon_type = E_APP_ICON_CLASS; +#if DEBUG + printf("C"); +#endif } - a->dirty_icon = 1; - free(v); - } - else - a->no_icon = 1; - /* Copy the new found icon data to the original. */ - _e_app_fields_save_others(a); - } + else + { + if (edje_file_group_exists(a->path, "icon")) + { + a->icon_type = E_APP_ICON_GROUP; +#if DEBUG + printf("G"); +#endif + } + else /* If that fails, then this might be an FDO icon. */ + { + if (a->icon_class) + { + char *v = NULL; + + /* FIXME: Use a real icon size. */ + v = (char *)ecore_desktop_icon_find(a->icon_class, NULL, e_config->icon_theme); + if (v) + { + if (a->icon_path) evas_stringshare_del(a->icon_path); + a->icon_path = evas_stringshare_add(v); + if (e_config->icon_theme) + { + if (a->icon_theme) evas_stringshare_del(a->icon_theme); + a->icon_theme = evas_stringshare_add(e_config->icon_theme); + } + a->dirty_icon = 1; + free(v); + } + /* Copy the new found icon data to the original. */ + _e_app_fields_save_others(a); + } + } + + if (a->icon_path) + { + a->icon_type = E_APP_ICON_FDO; +#if DEBUG + printf("F"); +#endif + } + else + { + a->icon_type = E_APP_ICON_NONE; +#if DEBUG + printf("N"); +#endif + } + } + } + } + + return a->icon_type; } EAPI Evas_Object * e_app_icon_add(Evas *evas, E_App *a) { Evas_Object *o = NULL; - int theme_match = 0; + E_App_Icon_Type type; if (a->orig) a = a->orig; @@ -2399,45 +2381,36 @@ printf("e_app_icon_add(%s) %s %s %s\n", a->path, a->icon_class, e_config->icon_theme, a->icon_path); #endif - /* First check to see if the icon theme is different. */ - if ((e_config->icon_theme) && (a->icon_theme)) + type = _e_app_icon_type(a); + switch (type) { - if (strcmp(e_config->icon_theme, a->icon_theme) == 0) - theme_match = 1; - } - else if ((e_config->icon_theme == NULL) && (a->icon_theme == NULL)) - theme_match = 1; + case E_APP_ICON_CLASS : o = edje_object_add(evas); e_util_edje_icon_list_set(o, a->icon_class); break; + case E_APP_ICON_GROUP : o = edje_object_add(evas); edje_object_file_set(o, a->path, "icon"); break; + case E_APP_ICON_PATH : + case E_APP_ICON_FDO : + { + char *ext; - /* If the icon was hard coded into the .desktop files Icon field, then theming doesn't matter. */ - if (a->hard_icon) - theme_match = 1; - - /* Then check if we already know the icon path. */ - if ((theme_match) && (a->icon_path) && (a->icon_path[0] != 0)) - o = _e_app_icon_path_add(evas, a); - else - { - o = edje_object_add(evas); - /* Check the theme for icons. */ - if (!e_util_edje_icon_list_set(o, a->icon_class)) - { - if (edje_object_file_set(o, a->path, "icon")) - { - a->found_icon = 1; - } - else /* If that fails, then this might be an FDO icon. */ - _e_app_fdo_icon_search(a); - - if (a->icon_path) - { - /* Free the aborted object first. */ - if (o) evas_object_del(o); - o = _e_app_icon_path_add(evas, a); - } - } + o = e_icon_add(evas); + ext = strrchr(a->icon_path, '.'); + if (ext) + { + if (strcmp(ext, ".edj") == 0) + e_icon_file_edje_set(o, a->icon_path, "icon"); + else + e_icon_file_set(o, a->icon_path); + } + else + e_icon_file_set(o, a->icon_path); + e_icon_fill_inside_set(o, 1); + break; + } + + case E_APP_ICON_UNKNOWN : + case E_APP_ICON_NONE : + default : + break; } - if (o) - a->found_icon = 1; return o; } @@ -2453,67 +2426,46 @@ EAPI void e_app_icon_add_to_menu_item(E_Menu_Item *mi, E_App *a) { - int theme_match = 0; + E_App_Icon_Type type; if (a->orig) a = a->orig; - mi->app = a; - /* e_menu_item_icon_edje_set() just tucks away the params, the actual call to edje_object_file_set() happens later. */ - /* e_menu_item_icon_file_set() just tucks away the params, the actual call to e_icon_add() happens later. */ #if DEBUG printf("e_app_icon_add_to_menu_item(%s) %s %s %s\n", a->path, a->icon_class, e_config->icon_theme, a->icon_path); #endif - /* First check to see if the icon theme is different. */ - if ((e_config->icon_theme) && (a->icon_theme)) + + /* e_menu_item_icon_edje_set() just tucks away the params, the actual call to edje_object_file_set() happens later. */ + /* e_menu_item_icon_file_set() just tucks away the params, the actual call to e_icon_add() happens later. */ + type = _e_app_icon_type(a); + switch (type) { - if (strcmp(e_config->icon_theme, a->icon_theme) == 0) - theme_match = 1; - } - else if ((e_config->icon_theme == NULL) && (a->icon_theme == NULL)) - theme_match = 1; + case E_APP_ICON_CLASS : e_util_menu_item_edje_icon_list_set(mi, a->icon_class); break; + case E_APP_ICON_GROUP : e_menu_item_icon_edje_set(mi, a->path, "icon"); break; + case E_APP_ICON_PATH : + case E_APP_ICON_FDO : + { + char *ext; - /* If the icon was hard coded into the .desktop files Icon field, then theming doesn't matter. */ - if (a->hard_icon) - theme_match = 1; + ext = strrchr(a->icon_path, '.'); + if (ext) + { + if (strcmp(ext, ".edj") == 0) + e_menu_item_icon_edje_set(mi, a->icon_path, "icon"); + else + e_menu_item_icon_file_set(mi, a->icon_path); + } + else + e_menu_item_icon_file_set(mi, a->icon_path); + break; + } - /* Then check if we already know the icon path. */ - if ((theme_match) && (a->icon_path) && (a->icon_path[0] != 0)) - { - _e_app_icon_path_add_to_menu_item(mi, a); - a->found_icon = 1; - printf("P"); + case E_APP_ICON_UNKNOWN : + case E_APP_ICON_NONE : + default : + break; } - else - { - /* Check the theme for icons. */ - if (e_util_menu_item_edje_icon_list_set(mi, a->icon_class)) - { - a->found_icon = 1; - printf("C"); - } - else - { - if (edje_file_group_exists(a->path, "icon")) - { - e_menu_item_icon_edje_set(mi, a->path, "icon"); - a->found_icon = 1; - printf("G"); - } - else /* If that fails, then this might be an FDO icon. */ - _e_app_fdo_icon_search(a); - - if (a->icon_path) - { - _e_app_icon_path_add_to_menu_item(mi, a); - a->found_icon = 1; - printf("F"); - } - else - printf("N"); - } - } } @@ -3077,11 +3029,12 @@ dst->icon_time = src->icon_time; dst->starting = src->starting; dst->scanned = src->scanned; + dst->icon_type = src->icon_type; dst->dirty_icon = src->dirty_icon; dst->hard_icon = src->hard_icon; - dst->no_icon = src->no_icon; dst->filled = src->filled; dst->idle_fill = src->idle_fill; + dst->idle_icon = src->idle_icon; return 1; } =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_apps.h,v retrieving revision 1.48 retrieving revision 1.49 diff -u -3 -r1.48 -r1.49 --- e_apps.h 1 Oct 2006 18:34:54 -0000 1.48 +++ e_apps.h 3 Oct 2006 15:51:58 -0000 1.49 @@ -15,6 +15,17 @@ E_APP_READY_EXPIRE } E_App_Change; +typedef enum _E_App_Icon_Type +{ + E_APP_ICON_UNKNOWN, + E_APP_ICON_NONE, + E_APP_ICON_PATH, + E_APP_ICON_CLASS, + E_APP_ICON_GROUP, + E_APP_ICON_FDO +} E_App_Icon_Type; + + typedef struct _E_App E_App; typedef struct _E_App_Instance E_App_Instance; typedef struct _E_App_Autopsy E_App_Autopsy; @@ -51,6 +62,7 @@ const char *icon; /* FDO icon */ const char *icon_path; /* icon path */ time_t icon_time; /* For checking if the icon cache is valid. */ + E_App_Icon_Type icon_type; Evas_List *subapps; /* if this a directory, a list of more E_App's */ @@ -69,8 +81,6 @@ unsigned char deleted : 1; /* this app's file is deleted from disk */ unsigned char filled : 1; /* this app has had its data filled in */ - unsigned char no_icon : 1; /* this app's icon has not been found in the current theme, future searhes should give up early . */ - unsigned char found_icon : 1; /* this app has been searched for and found. */ unsigned char dirty_icon : 1; /* this app's icon has been found, and the on disk cache needs to be updated. */ unsigned char hard_icon : 1; /* this app's icon was hard coded into the .desktop files Icon field. */ ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs