*Icon theme support functions.

*Minor API change that no one was using anyway.


SVN revision: 24921
This commit is contained in:
David Walter Seikel 2006-08-20 03:45:53 +00:00
parent d556190d88
commit a58d7287ab
5 changed files with 234 additions and 46 deletions

View File

@ -54,6 +54,22 @@ struct _Ecore_Desktop
};
typedef struct _Ecore_Desktop Ecore_Desktop;
struct _Ecore_Desktop_Icon_Theme
{
Ecore_Hash *data, *group;
Ecore_List *Directories;
char *path;
char *name;
char *comment;
char *example;
char *example_path;
char *inherits;
char *directories;
int hidden;
};
typedef struct _Ecore_Desktop_Icon_Theme Ecore_Desktop_Icon_Theme;
enum _Ecore_Desktop_Tree_Element_Type
{
ECORE_DESKTOP_TREE_ELEMENT_TYPE_NULL = 0,
@ -88,13 +104,13 @@ extern "C"
/* Function Prototypes */
EAPI int ecore_desktop_paths_init(void);
char *ecore_desktop_paths_file_find(Ecore_List * paths,
const char *file, const int sub,
const char *file, int sub,
int (*func) (void
*data,
const char
*path),
void *data);
char *ecore_desktop_paths_recursive_search(const char *path, const char *file,
char *ecore_desktop_paths_recursive_search(const char *path, const char *file, int sub,
int (*dir_func)
(void *data,
const char *path),
@ -114,12 +130,17 @@ extern "C"
Ecore_Desktop *ecore_desktop_get(const char *file, const char *lang);
void ecore_desktop_destroy(Ecore_Desktop * desktop);
EAPI int ecore_desktop_icon_init(void);
EAPI int ecore_desktop_icon_shutdown(void);
const char *ecore_desktop_icon_find(const char *icon,
const char *icon_size,
const char *icon_theme);
Ecore_Hash *ecore_desktop_icon_theme_list(void);
Ecore_Desktop_Icon_Theme *ecore_desktop_icon_theme_get(const char *file, const char *lang);
void ecore_desktop_icon_theme_destroy(Ecore_Desktop_Icon_Theme *icon_theme);
Ecore_Desktop_Tree *ecore_desktop_menu_get(char *file);

View File

@ -17,6 +17,8 @@ static int init_count = 0;
static Ecore_Hash *ini_file_cache;
static Ecore_Hash *desktop_cache;
void _ecore_desktop_destroy(Ecore_Desktop * desktop);
/**
* @defgroup Ecore_Desktop_Main_Group .desktop file Functions
@ -145,7 +147,7 @@ ecore_desktop_ini_get(const char *file)
* as returned by ecore_desktop_ini_get(). Some of the data in the
* .desktop file is decoded into specific members of the returned
* structure.
*
*
* Use ecore_desktop_destroy() to free this structure.
*
* @param file Full path to the .desktop file.
@ -370,10 +372,12 @@ ecore_desktop_init()
{
ecore_hash_set_free_key(desktop_cache, free);
ecore_hash_set_free_value(desktop_cache,
(Ecore_Free_Cb) ecore_desktop_destroy);
(Ecore_Free_Cb) _ecore_desktop_destroy);
}
}
if (!ecore_desktop_icon_init()) return --init_count;
return init_count;
}
@ -390,6 +394,8 @@ ecore_desktop_shutdown()
{
if (--init_count != 0) return init_count;
ecore_desktop_icon_shutdown();
if (ini_file_cache)
{
ecore_hash_destroy(ini_file_cache);
@ -417,6 +423,13 @@ ecore_desktop_shutdown()
*/
void
ecore_desktop_destroy(Ecore_Desktop * desktop)
{
/* This is just a dummy, because these structures are cached. */
/* Later versions of the cache may reference count, then this will be useful. */
}
void
_ecore_desktop_destroy(Ecore_Desktop * desktop)
{
if (desktop->eap_name)
free(desktop->eap_name);

View File

@ -10,9 +10,13 @@ static const char *_ecore_desktop_icon_find0(const char *icon,
const char *icon_theme);
static int _ecore_desktop_icon_theme_list_add(void *data, const char *path);
void _ecore_desktop_icon_theme_destroy(Ecore_Desktop_Icon_Theme * icon_theme);
static const char *ext[] = { ".png", ".svgz", ".svg", ".xpm", "", NULL };
static int init_count = 0;
static Ecore_Hash *icon_theme_cache;
static int loaded = 0;
/**
@ -142,7 +146,7 @@ _ecore_desktop_icon_find0(const char *icon, const char *icon_size, const char *i
printf("SEARCHING FOR %s\n", icn);
#endif
theme_path =
ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, 1,
ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, 2,
NULL, NULL);
if (theme_path)
{
@ -380,39 +384,184 @@ _ecore_desktop_icon_find0(const char *icon, const char *icon_size, const char *i
Ecore_Hash *
ecore_desktop_icon_theme_list(void)
{
Ecore_Hash *result = NULL;
result = ecore_hash_new(ecore_str_hash, ecore_str_compare);
if (result)
{
ecore_hash_set_free_key(result, free);
ecore_hash_set_free_value(result, free);
ecore_desktop_paths_file_find(ecore_desktop_paths_icons, "index.theme", 1, _ecore_desktop_icon_theme_list_add, result);
}
return result;
if (!loaded)
ecore_desktop_paths_file_find(ecore_desktop_paths_icons, "index.theme", 2, _ecore_desktop_icon_theme_list_add, NULL);
loaded = 1;
return icon_theme_cache;
}
static int
_ecore_desktop_icon_theme_list_add(void *data, const char *path)
{
Ecore_Hash *result;
result = data;
if (result)
{
char *key, *dir;
dir = ecore_file_get_dir(path);
if (dir)
{
key = (char *) ecore_file_get_file(dir);
if (ecore_hash_get(result, key) == NULL) /* Only the first one found for each name is important. */
ecore_hash_set(result, strdup(key), strdup(path));
free(dir);
}
}
char icn[PATH_MAX];
snprintf(icn, PATH_MAX, "%sindex.theme", path);
if (ecore_desktop_icon_theme_get(icn, NULL))
return 1; /* Should stop it from recursing this directory, but let it continue searching the next. */
return 0;
}
/**
* Setup what ever needs to be setup to support ecore_desktop_icon.
*
* There are internal structures that are needed for ecore_desktop_icon
* functions to operate, this sets them up.
*
* @ingroup Ecore_Desktop_Icon_Group
*/
EAPI int
ecore_desktop_icon_init()
{
if (++init_count != 1) return init_count;
if (!icon_theme_cache)
{
icon_theme_cache = ecore_hash_new(ecore_str_hash, ecore_str_compare);
if (icon_theme_cache)
{
ecore_hash_set_free_key(icon_theme_cache, free);
ecore_hash_set_free_value(icon_theme_cache,
(Ecore_Free_Cb) _ecore_desktop_icon_theme_destroy);
}
}
return init_count;
}
/**
* Tear down what ever needs to be torn down to support ecore_desktop_ycon.
*
* There are internal structures that are needed for ecore_desktop_icon
* functions to operate, this tears them down.
*
* @ingroup Ecore_Desktop_Icon_Group
*/
EAPI int
ecore_desktop_icon_shutdown()
{
if (--init_count != 0) return init_count;
if (icon_theme_cache)
{
ecore_hash_destroy(icon_theme_cache);
icon_theme_cache = NULL;
}
return init_count;
}
/**
* Get the contents of an index.theme file.
*
* Everything that is in the index.theme file is returned in the
* data member of the Ecore_Desktop_Icon_Theme structure, it's an Ecore_Hash
* as returned by ecore_desktop_ini_get(). Some of the data in the
* index.theme file is decoded into specific members of the returned
* structure.
*
* Use ecore_desktop_icon_theme_destroy() to free this structure.
*
* @param icon_theme Name of the icon theme, or full path to the index.theme file.
* @param lang Language to use, or NULL for default.
* @return An Ecore_Desktop_Icon_Theme containing the files contents.
* @ingroup Ecore_Desktop_Icon_Group
*/
Ecore_Desktop_Icon_Theme *
ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang)
{
Ecore_Desktop_Icon_Theme *result;
result = (Ecore_Desktop_Icon_Theme *) ecore_hash_get(icon_theme_cache, (char *) icon_theme);
if (!result)
{
char icn[PATH_MAX], *theme_path;
if (icon_theme[0] == '/')
{
char *dir;
theme_path = strdup(icon_theme);
dir = ecore_file_get_dir(theme_path);
if (dir)
icon_theme = (char *) ecore_file_get_file(dir);
#ifdef DEBUG
printf("LOADING THEME %s - %s\n", icon_theme, theme_path);
#endif
}
else
{
snprintf(icn, PATH_MAX, "%s/index.theme", icon_theme);
#ifdef DEBUG
printf("SEARCHING FOR %s\n", icn);
#endif
theme_path = ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, 2, NULL, NULL);
}
if (theme_path)
{
result = calloc(1, sizeof(Ecore_Desktop_Icon_Theme));
if (result)
{
result->data = ecore_desktop_ini_get(theme_path);
if (result->data)
{
result->group =
(Ecore_Hash *) ecore_hash_get(result->data,
"Icon Theme");
if (result->group)
{
char *value;
result->path = theme_path;
result->name = (char *)ecore_hash_get(result->group, "Name");
result->comment = (char *)ecore_hash_get(result->group, "Comment");
result->inherits = (char *)ecore_hash_get(result->group, "Inherits");
result->directories = (char *)ecore_hash_get(result->group, "Directories");
value = (char *)ecore_hash_get(result->group, "Example");
if (!value)
value = "exec";
result->example = strdup(value);
ecore_hash_set(icon_theme_cache, strdup(icon_theme), result);
}
}
if (!result->path)
{
free(theme_path);
free(result);
result = NULL;
}
}
}
}
return result;
}
/**
* Free whatever resources are used by an Ecore_Desktop_Icon_Theme.
*
* There are internal resources used by each Ecore_Desktop_Icon_Theme
* This releases those resources.
*
* @param icon_theme An Ecore_Desktop_Icon_Theme.
* @ingroup Ecore_Desktop_Icon_Group
*/
void
ecore_desktop_icon_theme_destroy(Ecore_Desktop_Icon_Theme * icon_theme)
{
/* This is just a dummy, because these structures are cached. */
/* Later versions of the cache may reference count, then this will be useful. */
}
void
_ecore_desktop_icon_theme_destroy(Ecore_Desktop_Icon_Theme * icon_theme)
{
if (icon_theme->path) free(icon_theme->path);
if (icon_theme->example) free(icon_theme->example);
free(icon_theme);
}

View File

@ -949,7 +949,7 @@ _ecore_desktop_menu_expand_apps(struct _ecore_desktop_menu_unxml_data
sprintf(dir, "%s/%s", unxml_data->path, app_dir);
our_data.path = dir;
our_data.length = strlen(dir);
ecore_desktop_paths_recursive_search(dir, NULL, NULL,
ecore_desktop_paths_recursive_search(dir, NULL, -1, NULL,
_ecore_desktop_menu_check_app,
&our_data);
}
@ -1031,7 +1031,7 @@ _ecore_desktop_menu_merge(const void *data, Ecore_Desktop_Tree * tree,
sprintf(merge_path, "%s", &string[10]);
else
sprintf(merge_path, "%s%s", unxml_data->path, &string[10]);
ecore_desktop_paths_recursive_search(merge_path, NULL, NULL,
ecore_desktop_paths_recursive_search(merge_path, NULL, -1, NULL,
_ecore_desktop_menu_check_menu,
merge);
result = 1;
@ -1071,7 +1071,7 @@ _ecore_desktop_menu_merge(const void *data, Ecore_Desktop_Tree * tree,
#ifdef DEBUG
printf("<LEGACYDIR> - %s - %s\n", legacy_data.prefix, merge_path);
#endif
ecore_desktop_paths_recursive_search(merge_path, NULL,
ecore_desktop_paths_recursive_search(merge_path, NULL, -1,
_ecore_desktop_menu_legacy_menu_dir,
_ecore_desktop_menu_legacy_menu,
&legacy_data);
@ -1306,7 +1306,7 @@ _ecore_desktop_menu_generate(const void *data, Ecore_Desktop_Tree * tree,
if (merge)
{
ecore_desktop_paths_recursive_search
(merge_path, NULL, NULL,
(merge_path, NULL, -1, NULL,
_ecore_desktop_menu_check_directory,
merge);
ecore_desktop_tree_merge(tree, i + 1,

View File

@ -254,12 +254,12 @@ ecore_desktop_paths_shutdown()
*
* @param type The type of directories to search.
* @param file The file to search for.
* @param sub Should we search sub directories.
* @param sub Levels of sub directories to search, -1 = all, 0 = none.
* @param func A function to call for each file found.
* @param data A pointer to pass on to func.
*/
char *
ecore_desktop_paths_file_find(Ecore_List * paths, const char *file, const int sub,
ecore_desktop_paths_file_find(Ecore_List * paths, const char *file, int sub,
int (*func) (void *data, const char *path),
void *data)
{
@ -282,9 +282,9 @@ ecore_desktop_paths_file_find(Ecore_List * paths, const char *file, const int su
if (func(data, temp))
break;
}
else if (sub)
else if (sub != 0)
path =
ecore_desktop_paths_recursive_search(this_path, file, NULL,
ecore_desktop_paths_recursive_search(this_path, file, sub, NULL,
func, data);
if (path && (!func))
break;
@ -539,7 +539,7 @@ _ecore_desktop_paths_check_and_add(Ecore_List * paths, char *path)
}
char *
ecore_desktop_paths_recursive_search(const char *path, const char *file,
ecore_desktop_paths_recursive_search(const char *path, const char *file, int sub,
int (*dir_func) (void *data,
const char *path),
int (*func) (void *data, const char *path),
@ -548,6 +548,10 @@ ecore_desktop_paths_recursive_search(const char *path, const char *file,
char *fpath = NULL;
DIR *dir = NULL;
if ((sub != 0) && (sub != -1))
sub -= 1;
dir = opendir(path);
if (dir != NULL)
@ -571,11 +575,12 @@ ecore_desktop_paths_recursive_search(const char *path, const char *file,
if (dir_func)
if (dir_func(data, info_text))
break;
fpath =
ecore_desktop_paths_recursive_search(info_text,
file,
dir_func,
func, data);
if (sub != 0)
fpath =
ecore_desktop_paths_recursive_search(info_text,
file, sub,
dir_func,
func, data);
}
}
else