Enlightenment CVS committal Author : onefang Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_desktop Modified Files: Ecore_Desktop.h ecore_desktop.c ecore_desktop_menu.c ecore_desktop_paths.c Log Message: Bring it a bit more up to scratch, and a better match for what is required in e_apps.c. API breakage. =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/Ecore_Desktop.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- Ecore_Desktop.h 14 Aug 2006 21:14:40 -0000 1.6 +++ Ecore_Desktop.h 14 Aug 2006 21:42:53 -0000 1.7 @@ -1,8 +1,9 @@ #ifndef _ECORE_DESKTOP_H # define _ECORE_DESKTOP_H -/* FIXME: No unnecessary includes in exported headers. */ +/* FIXME: No unnecessary includes in exported headers, when things settle down and we know what is unnecessary. */ #include <string.h> +#include <strings.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -35,7 +36,7 @@ #define MAX_PATH 4096 -/* FIXME: No unnecessary macros in exported headers. */ +/* FIXME: No unnecessary macros in exported headers, when things settle down and we know what is unnecessary. */ #define E_FN_DEL(_fn, _h) if (_h) { _fn(_h); _h = NULL; } #define E_REALLOC(p, s, n) p = (s *)realloc(p, sizeof(s) * n) #define E_NEW(s, n) (s *)calloc(n, sizeof(s)) @@ -52,6 +53,7 @@ struct _Ecore_Desktop { Ecore_Hash *data, *group, *Categories, *OnlyShowIn, *NotShowIn; + char *eap_name; char *name; char *generic; char *comment; @@ -59,6 +61,7 @@ char *categories; char *exec; char *icon; + char *icon_class; char *icon_path; char *path; char *deletiondate; @@ -100,7 +103,7 @@ # endif /* Function Prototypes */ - void ecore_desktop_paths_init(void); + EAPI int ecore_desktop_paths_init(void); char *ecore_desktop_paths_file_find(Ecore_List * paths, char *file, int sub, int (*func) (const @@ -119,15 +122,15 @@ char *path), const void *data); - void ecore_desktop_paths_shutdown(void); + EAPI int ecore_desktop_paths_shutdown(void); Ecore_Hash *ecore_desktop_paths_to_hash(char *paths); Ecore_List *ecore_desktop_paths_to_list(char *paths); - void ecore_desktop_init(void); - void ecore_desktop_shutdown(void); - Ecore_Hash *ecore_desktop_ini_get(char *file); - Ecore_Desktop *ecore_desktop_get(char *file); + EAPI int ecore_desktop_init(void); + EAPI int ecore_desktop_shutdown(void); + Ecore_Hash *ecore_desktop_ini_get(const char *file); + Ecore_Desktop *ecore_desktop_get(const char *file, const char *lang); void ecore_desktop_destroy(Ecore_Desktop * desktop); char *ecore_desktop_icon_find(char *icon, char *icon_size, =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- ecore_desktop.c 14 Aug 2006 10:22:51 -0000 1.6 +++ ecore_desktop.c 14 Aug 2006 21:42:53 -0000 1.7 @@ -1,8 +1,12 @@ +#include <ctype.h> + #include "Ecore_Desktop.h" #include "ecore_desktop_private.h" extern int reject_count, not_over_count; +static int init_count = 0; + static Ecore_Hash *ini_file_cache; static Ecore_Hash *desktop_cache; @@ -28,7 +32,7 @@ * @ingroup Ecore_Desktop_Main_Group */ Ecore_Hash * -ecore_desktop_ini_get(char *file) +ecore_desktop_ini_get(const char *file) { Ecore_Hash *result; @@ -138,15 +142,16 @@ * Use ecore_desktop_destroy() to free this structure. * * @param file Full path to the .desktop file. + * @param lang Language to use, or NULL for default. * @return An Ecore_Desktop containing the files contents. * @ingroup Ecore_Desktop_Main_Group */ Ecore_Desktop * -ecore_desktop_get(char *file) +ecore_desktop_get(const char *file, const char *lang) { Ecore_Desktop *result; - result = (Ecore_Desktop *) ecore_hash_get(desktop_cache, file); + result = (Ecore_Desktop *) ecore_hash_get(desktop_cache, (char *) file); if (!result) { result = calloc(1, sizeof(Ecore_Desktop)); @@ -165,6 +170,22 @@ if (result->group) { char *value; + char *eap_name = NULL; + char *exe = NULL; + char *categories = NULL; + int size = 0; + + value = (char *) ecore_file_get_file(file); + if (value) + { + char *temp = strrchr(value, '.'); + if (temp) + *temp = '\0'; + result->eap_name = malloc(strlen(value) + 5); + if (result->eap_name) + sprintf(result->eap_name, "%s.eap", value); + } + eap_name = result->eap_name; result->name = (char *)ecore_hash_get(result->group, "Name"); @@ -176,9 +197,36 @@ (char *)ecore_hash_get(result->group, "Type"); result->exec = (char *)ecore_hash_get(result->group, "Exec"); - result->window_class = +// FIXME: Handle the fdo %x replacable params. Some should be stripped, some should be expanded. + exe = result->exec; + value = (char *)ecore_hash_get(result->group, "StartupWMClass"); + if (value) + result->window_class = strdup(value); + else if (result->exec) + { + char *tmp; + + /* Guess - exe name with first letter capitalized. */ + tmp = strdup(result->exec); + if (tmp) + { + char *p; + + value = (char *) ecore_file_get_file(tmp); /* In case the exe included a path. */ + p = value; + while ((*p != '\0') && (*p != ' ')) + { + *p = tolower(*p); + p++; + } + *p = '\0'; + *value = toupper(*value); + result->window_class = strdup(value); + free(tmp); + } + } result->icon = (char *)ecore_hash_get(result->group, "Icon"); result->categories = @@ -186,6 +234,7 @@ if (result->categories) result->Categories = ecore_desktop_paths_to_hash(result->categories); + categories = result->categories; value = (char *)ecore_hash_get(result->group, "OnlyShowIn"); if (value) @@ -208,6 +257,49 @@ if (value) result->startup = (!strcmp(value, "true")) ? "1" : "0"; + +/* + * icon/class is a list of standard icons from the theme that can override the icon created above. + * Use (from .desktop) eap name,exe name,categories. It's case sensitive, the reccomendation is to lowercase it. + * It should be most specific to most generic. firefox,browser,internet for instance +*/ + if (eap_name) size += strlen(eap_name); + if (exe) size += strlen(exe); + if (categories) size += strlen(categories); + result->icon_class = malloc(size + 3); + if (result->icon_class) + { + char *p; + int done = 0; + + result->icon_class[0] = '\0'; + if (eap_name) + { + strcat(result->icon_class, eap_name); + done = 1; + } + if (exe) + { + if (done) + strcat(result->icon_class, ","); + strcat(result->icon_class, exe); + } + if (categories) + { + if (done) + strcat(result->icon_class, ","); + strcat(result->icon_class, categories); + } + p = result->icon_class; + while (*p != '\0') + { + if (*p == ';') + *p = ','; + else + *p = tolower(*p); + p++; + } + } } else { @@ -245,9 +337,13 @@ * * @ingroup Ecore_Desktop_Main_Group */ -void +EAPI int ecore_desktop_init() { + if (++init_count != 1) return init_count; + + if (!ecore_desktop_paths_init()) return --init_count; + if (!ini_file_cache) { ini_file_cache = ecore_hash_new(ecore_str_hash, ecore_str_compare); @@ -268,6 +364,8 @@ (Ecore_Free_Cb) ecore_desktop_destroy); } } + + return init_count; } /** @@ -278,9 +376,11 @@ * * @ingroup Ecore_Desktop_Main_Group */ -void +EAPI int ecore_desktop_shutdown() { + if (--init_count != 0) return init_count; + if (ini_file_cache) { ecore_hash_destroy(ini_file_cache); @@ -291,6 +391,10 @@ ecore_hash_destroy(desktop_cache); desktop_cache = NULL; } + + ecore_desktop_paths_shutdown(); + + return init_count; } /** @@ -305,6 +409,12 @@ void ecore_desktop_destroy(Ecore_Desktop * desktop) { + if (desktop->eap_name) + free(desktop->eap_name); + if (desktop->icon_class) + free(desktop->icon_class); + if (desktop->window_class) + free(desktop->window_class); if (desktop->NotShowIn) ecore_hash_destroy(desktop->NotShowIn); if (desktop->OnlyShowIn) =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop_menu.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_desktop_menu.c 14 Aug 2006 20:24:20 -0000 1.5 +++ ecore_desktop_menu.c 14 Aug 2006 21:42:53 -0000 1.6 @@ -10,7 +10,6 @@ #include <sys/types.h> #include <sys/stat.h> #include <libgen.h> -#include <strings.h> #include <Ecore.h> @@ -1443,7 +1442,8 @@ key = (char *)node->key; app = (char *)node->value; - desktop = ecore_desktop_get(app); + /* FIXME: pass an actualy language parameter. */ + desktop = ecore_desktop_get(app, NULL); if ((generate_data->unallocated) && (desktop->allocated)) return; =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop_paths.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_desktop_paths.c 14 Aug 2006 21:25:53 -0000 1.5 +++ ecore_desktop_paths.c 14 Aug 2006 21:42:53 -0000 1.6 @@ -32,6 +32,8 @@ * and correct those guesses. */ +static int init_count = 0; + static Ecore_List *_ecore_desktop_paths_get(char *before, char *env_home, char *env, char *env_home_default, @@ -67,9 +69,11 @@ #endif -void +EAPI int ecore_desktop_paths_init() { + if (++init_count != 1) return init_count; + /* FIXME: Keep track of any loose strdups in a list, so that we can free them at shutdown time. */ #if defined GNOME_SUPPORT || defined KDE_SUPPORT @@ -222,15 +226,21 @@ if (exit_handler) ecore_event_handler_del(exit_handler); #endif + + return init_count; } -void +EAPI int ecore_desktop_paths_shutdown() { + if (--init_count != 0) return init_count; + E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_menus); E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_directories); E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_desktops); E_FN_DEL(ecore_list_destroy, ecore_desktop_paths_icons); + + return init_count; } /** Search for a file in fdo compatible locations. ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs