From ff31c0e12c142e1ec3f3c049c17917fa38783879 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Thu, 31 Aug 2006 12:10:09 +0000 Subject: [PATCH] .desktop saving. SVN revision: 25244 --- .../src/lib/ecore_desktop/Ecore_Desktop.h | 3 + .../src/lib/ecore_desktop/ecore_desktop.c | 93 ++++++++++++++++++- 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h index 0d222028b8..4aacd6c777 100644 --- a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h +++ b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h @@ -37,6 +37,8 @@ extern Ecore_List *ecore_desktop_paths_xsessions; struct _Ecore_Desktop { Ecore_Hash *data, *group, *Categories, *OnlyShowIn, *NotShowIn; + char *original_path; + char *original_lang; char *eap_name; char *name; char *generic; @@ -131,6 +133,7 @@ extern "C" 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_save(Ecore_Desktop * desktop); void ecore_desktop_destroy(Ecore_Desktop * desktop); diff --git a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop.c b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop.c index 2192dc32fd..2c02673cd9 100644 --- a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop.c +++ b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop.c @@ -2,6 +2,8 @@ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include +#include +#include #include "Ecore_Desktop.h" #include "ecore_desktop_private.h" @@ -170,7 +172,10 @@ ecore_desktop_get(const char *file, const char *lang) result = calloc(1, sizeof(Ecore_Desktop)); if (result) { - result->data = ecore_desktop_ini_get(file); + result->original_path = strdup(file); + if (lang) + result->original_lang = strdup(lang); + result->data = ecore_desktop_ini_get(result->original_path); if (result->data) { result->group = @@ -188,7 +193,7 @@ ecore_desktop_get(const char *file, const char *lang) char *categories = NULL; int size = 0; - value = (char *) ecore_file_get_file(file); + value = (char *) ecore_file_get_file(result->original_path); if (value) { char *temp = strrchr(value, '.'); @@ -340,7 +345,7 @@ ecore_desktop_get(const char *file, const char *lang) } } - ecore_hash_set(desktop_cache, strdup(file), result); + ecore_hash_set(desktop_cache, strdup(result->original_path), result); } else { @@ -352,6 +357,83 @@ ecore_desktop_get(const char *file, const char *lang) return result; } +void +ecore_desktop_save(Ecore_Desktop * desktop) +{ + if (!desktop->group) + { + desktop->group = ecore_hash_new(ecore_str_hash, ecore_str_compare); + if (desktop->group) + { + ecore_hash_set_free_key(desktop->group, free); + ecore_hash_set_free_value(desktop->group, free); + } + } + + if (desktop->group) + { + if (desktop->original_path) + { + struct stat st; + + if (stat(desktop->original_path, &st) >= 0) + { + char *real; + + real = ecore_file_readlink(desktop->original_path); + if (real) + ecore_hash_set(desktop->group, strdup("X-Enlightenment-OriginalPath"), real); + } + } + + if (desktop->name) ecore_hash_set(desktop->group, strdup("Name"), strdup(desktop->name)); + if (desktop->generic) ecore_hash_set(desktop->group, strdup("GenericName"), strdup(desktop->generic)); + if (desktop->comment) ecore_hash_set(desktop->group, strdup("Comment"), strdup(desktop->comment)); + if (desktop->type) ecore_hash_set(desktop->group, strdup("Type"), strdup(desktop->type)); + if (desktop->URL) ecore_hash_set(desktop->group, strdup("URL"), strdup(desktop->URL)); + if (desktop->file) ecore_hash_set(desktop->group, strdup("File"), strdup(desktop->file)); + if (desktop->exec) ecore_hash_set(desktop->group, strdup("Exec"), strdup(desktop->exec)); + if (desktop->icon) ecore_hash_set(desktop->group, strdup("Icon"), strdup(desktop->icon)); + if (desktop->icon_class) ecore_hash_set(desktop->group, strdup("X-Enlightenment-IconClass"), strdup(desktop->icon_class)); + if (desktop->icon_path) ecore_hash_set(desktop->group, strdup("X-Enlightenment-IconPath"), strdup(desktop->icon_path)); + if (desktop->window_class) ecore_hash_set(desktop->group, strdup("StartupWMClass"), strdup(desktop->window_class)); + if (desktop->categories) ecore_hash_set(desktop->group, strdup("Categories"), strdup(desktop->categories)); + ecore_hash_remove(desktop->group, "X-KDE-StartupNotify"); + if (desktop->startup) + { + if (desktop->startup[0] == '1') + ecore_hash_set(desktop->group, strdup("StartupNotify"), strdup("true")); + else + ecore_hash_set(desktop->group, strdup("StartupNotify"), strdup("false")); + } + + /* FIXME: deal with the ShowIn's. */ + + if (desktop->path) ecore_hash_set(desktop->group, strdup("Path"), strdup(desktop->path)); + if (desktop->deletiondate) ecore_hash_set(desktop->group, strdup("DeletionDate"), strdup(desktop->deletiondate)); + + if (desktop->original_path) + { + FILE *f; + Ecore_List *list; + char *key; + + ecore_file_unlink(desktop->original_path); + f = fopen(desktop->original_path, "wb"); + list = ecore_hash_keys(desktop->group); + if ((!f) || (!list)) return; + + fprintf(f, "[Desktop Entry]\n"); + ecore_list_goto_first(list); + while ((key = (char *) ecore_list_next(list))) + fprintf(f, "%s=%s\n", key, (char *) ecore_hash_get(desktop->group, key)); + fclose(f); + } + } +} + + + /** * Setup what ever needs to be setup to support Ecore_Desktop. * @@ -443,6 +525,10 @@ ecore_desktop_destroy(Ecore_Desktop * desktop) void _ecore_desktop_destroy(Ecore_Desktop * desktop) { + if (desktop->original_path) + free(desktop->original_path); + if (desktop->original_lang) + free(desktop->original_lang); if (desktop->eap_name) free(desktop->eap_name); if (desktop->icon_class) @@ -483,3 +569,4 @@ ecore_desktop_home_get() return strdup(home); } +