From 90d1031c0e7c1d1b56067fc4cd58df0e4e67c487 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Mon, 5 Feb 2007 02:06:05 +0000 Subject: [PATCH] - allow the app to add custom Types to be matched in the .desktop file. (e17 uses this for Mount and a few other types) SVN revision: 28251 --- legacy/efreet/src/bin/data/Makefile.am | 1 + legacy/efreet/src/bin/data/test_type.desktop | 8 ++ legacy/efreet/src/bin/ef_desktop.c | 34 +++++- legacy/efreet/src/bin/main.c | 10 +- legacy/efreet/src/lib/efreet_desktop.c | 111 +++++++++++++------ legacy/efreet/src/lib/efreet_desktop.h | 5 +- 6 files changed, 130 insertions(+), 39 deletions(-) create mode 100644 legacy/efreet/src/bin/data/test_type.desktop diff --git a/legacy/efreet/src/bin/data/Makefile.am b/legacy/efreet/src/bin/data/Makefile.am index e6dd6e4148..7673df58d7 100644 --- a/legacy/efreet/src/bin/data/Makefile.am +++ b/legacy/efreet/src/bin/data/Makefile.am @@ -6,6 +6,7 @@ test_DATA = \ test.ini \ long.ini \ test.desktop \ +test_type.desktop \ test.menu \ preferences.menu diff --git a/legacy/efreet/src/bin/data/test_type.desktop b/legacy/efreet/src/bin/data/test_type.desktop new file mode 100644 index 0000000000..1b67ff58e0 --- /dev/null +++ b/legacy/efreet/src/bin/data/test_type.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=My_Type +Name=Efreet Test Application +GenericName=Test Application +Exec=efreet_test %F %i +Categories=Test;Enlightenment; +Icon=TestIcon +X-Test=Own key diff --git a/legacy/efreet/src/bin/ef_desktop.c b/legacy/efreet/src/bin/ef_desktop.c index 33e783d0b3..f84d616469 100644 --- a/legacy/efreet/src/bin/ef_desktop.c +++ b/legacy/efreet/src/bin/ef_desktop.c @@ -17,7 +17,6 @@ ef_cb_desktop_parse(void) int ret = 1; desktop = efreet_desktop_get(PACKAGE_DATA_DIR"/efreet/test/test.desktop"); - if (!desktop) { printf("No desktop found.\n"); @@ -344,3 +343,36 @@ _cb_command(void *data, Efreet_Desktop *desktop, char *exec, int remaining) free(exec); } + +int +ef_cb_desktop_type_parse(void) +{ + Efreet_Desktop *desktop; + int ret = 1, my_type; + + /* add my custom desktop type to efreet */ + my_type = efreet_desktop_type_add("My_Type"); + if (my_type <= EFREET_DESKTOP_TYPE_MAX) + { + printf("Error adding desktop type."); + return 0; + } + + desktop = efreet_desktop_get(PACKAGE_DATA_DIR"/efreet/test/test_type.desktop"); + if (!desktop) + { + printf("No desktop found.\n"); + return 0; + } + + if (desktop->type != my_type) + { + printf("Invalid type returned in desktop"); + return 0; + } + + return 1; +} + + + diff --git a/legacy/efreet/src/bin/main.c b/legacy/efreet/src/bin/main.c index fc512861f7..58c62029e6 100644 --- a/legacy/efreet/src/bin/main.c +++ b/legacy/efreet/src/bin/main.c @@ -15,13 +15,14 @@ int ef_cb_efreet_icon_match(void); int ef_cb_ini_parse(void); int ef_cb_locale(void); int ef_cb_desktop_parse(void); +int ef_cb_desktop_save(void); +int ef_cb_desktop_command_get(void); +int ef_cb_desktop_type_parse(void); #if 0 int ef_cb_desktop_file_id(void); #endif int ef_cb_menu_get(void); int ef_cb_ini_long_line(void); -int ef_cb_desktop_save(void); -int ef_cb_desktop_command_get(void); typedef struct Efreet_Test Efreet_Test; struct Efreet_Test @@ -43,12 +44,13 @@ static Efreet_Test tests[] = { {"INI Long Line Parsing", ef_cb_ini_long_line}, {"Locale Parsing", ef_cb_locale}, {"Desktop Parsing", ef_cb_desktop_parse}, + {"Desktop Type Parsing", ef_cb_desktop_type_parse}, + {"Desktop Save", ef_cb_desktop_save}, + {"Desktop Command", ef_cb_desktop_command_get}, #if 0 {"Desktop File ID", ef_cb_desktop_file_id}, #endif {"Menu Parsing", ef_cb_menu_get}, - {"Desktop Save", ef_cb_desktop_save}, - {"Desktop Command", ef_cb_desktop_command_get}, {NULL, NULL} }; diff --git a/legacy/efreet/src/lib/efreet_desktop.c b/legacy/efreet/src/lib/efreet_desktop.c index b8becdc648..77276781a8 100644 --- a/legacy/efreet/src/lib/efreet_desktop.c +++ b/legacy/efreet/src/lib/efreet_desktop.c @@ -18,6 +18,11 @@ static const char *desktop_environment = NULL; */ static Ecore_Hash *efreet_desktop_cache = NULL; +/** + * A list of the desktop types available + */ +static Ecore_List *efreet_desktop_types = NULL; + /** * A unique id for each tmp file created while building a command */ @@ -95,6 +100,9 @@ efreet_desktop_init(void) ecore_hash_set_free_value(efreet_desktop_cache, ECORE_FREE_CB(efreet_desktop_free)); + efreet_desktop_types = ecore_list_new(); + ecore_list_set_free_cb(efreet_desktop_types, ECORE_FREE_CB(free)); + return init; } @@ -109,10 +117,11 @@ efreet_desktop_shutdown(void) if (--init) return init; ecore_file_shutdown(); ecore_string_shutdown(); - if (desktop_environment) ecore_string_release(desktop_environment); - desktop_environment = NULL; + IF_RELEASE(desktop_environment); IF_FREE_HASH(efreet_desktop_cache); + IF_FREE_LIST(efreet_desktop_types); + return init; } @@ -234,24 +243,26 @@ efreet_desktop_new(const char *file) efreet_ini_string_get(ini, "Type")); desktop->version = efreet_ini_double_get(ini, "Version"); - switch (desktop->type) + if (desktop->type == EFREET_DESKTOP_TYPE_APPLICATION) { - case EFREET_DESKTOP_TYPE_APPLICATION: - if (!efreet_desktop_application_fields_parse(desktop, ini)) - error = 1; - break; - case EFREET_DESKTOP_TYPE_LINK: - if (!efreet_desktop_link_fields_parse(desktop, ini)) - error = 1; - break; - case EFREET_DESKTOP_TYPE_DIRECTORY: - /* there are no directory specific fields */ - break; - case EFREET_DESKTOP_TYPE_UNKNOWN: - default: + if (!efreet_desktop_application_fields_parse(desktop, ini)) error = 1; - break; } + else if (desktop->type == EFREET_DESKTOP_TYPE_LINK) + { + if (!efreet_desktop_link_fields_parse(desktop, ini)) + error = 1; + } + else if (desktop->type == EFREET_DESKTOP_TYPE_DIRECTORY) + { + /* there are no directory specific fields */ + } + else if (desktop->type >= (EFREET_DESKTOP_TYPE_MAX + 1)) + { + /* XXX which user fields should we be parsing? */ + } + else + error = 1; } if (!error && !efreet_desktop_environment_check(ini)) error = 1; @@ -285,24 +296,29 @@ efreet_desktop_save(Efreet_Desktop *desktop) efreet_ini_section_add(ini, "Desktop Entry"); efreet_ini_section_set(ini, "Desktop Entry"); - switch (desktop->type) + if (desktop->type == EFREET_DESKTOP_TYPE_APPLICATION) { - case EFREET_DESKTOP_TYPE_APPLICATION: - efreet_ini_string_set(ini, "Type", "Application"); - efreet_desktop_application_fields_save(desktop, ini); - break; - case EFREET_DESKTOP_TYPE_LINK: - efreet_ini_string_set(ini, "Type", "Link"); - efreet_desktop_link_fields_save(desktop, ini); - break; - case EFREET_DESKTOP_TYPE_DIRECTORY: - efreet_ini_string_set(ini, "Type", "Directory"); - break; - case EFREET_DESKTOP_TYPE_UNKNOWN: - default: - ok = 0; - break; + efreet_ini_string_set(ini, "Type", "Application"); + efreet_desktop_application_fields_save(desktop, ini); } + else if (desktop->type == EFREET_DESKTOP_TYPE_LINK) + { + efreet_ini_string_set(ini, "Type", "Link"); + efreet_desktop_link_fields_save(desktop, ini); + } + else if (desktop->type == EFREET_DESKTOP_TYPE_DIRECTORY) + { + efreet_ini_string_set(ini, "Type", "Directory"); + } + else if (desktop->type > EFREET_DESKTOP_TYPE_MAX + 1) + { + ecore_list_goto_index(efreet_desktop_types, + (desktop->type - (EFREET_DESKTOP_TYPE_MAX + 1))); + efreet_ini_string_set(ini, "Type", + (char *)ecore_list_current(efreet_desktop_types)); + } + else + ok = 0; if (ok) { @@ -479,6 +495,23 @@ efreet_desktop_category_del(Efreet_Desktop *desktop, const char *category) return found; } + +/** + * @param type: The type to add to the list of matching types + * @return Returns no value + * @brief Adds the given type to the list of types in the system + */ +int +efreet_desktop_type_add(const char *type) +{ + int id; + + id = ecore_list_nodes(efreet_desktop_types); + ecore_list_append(efreet_desktop_types, strdup(type)); + + return (id + EFREET_DESKTOP_TYPE_MAX + 1); +} + /** * @internal * @param type_str: the type as a string @@ -488,6 +521,9 @@ efreet_desktop_category_del(Efreet_Desktop *desktop, const char *category) static Efreet_Desktop_Type efreet_desktop_type_parse(const char *type_str) { + char *str; + int count = 0; + if (!type_str) return EFREET_DESKTOP_TYPE_UNKNOWN; if (!strcmp("Application", type_str)) @@ -496,6 +532,15 @@ efreet_desktop_type_parse(const char *type_str) return EFREET_DESKTOP_TYPE_LINK; if (!strcmp("Directory", type_str)) return EFREET_DESKTOP_TYPE_DIRECTORY; + + /* check the user added types */ + ecore_list_goto_first(efreet_desktop_types); + while ((str = ecore_list_next(efreet_desktop_types))) + { + if (!strcmp(str, type_str)) + return (count + EFREET_DESKTOP_TYPE_MAX + 1); + count ++; + } return EFREET_DESKTOP_TYPE_UNKNOWN; } diff --git a/legacy/efreet/src/lib/efreet_desktop.h b/legacy/efreet/src/lib/efreet_desktop.h index dbbbd2876e..f1345e26c9 100644 --- a/legacy/efreet/src/lib/efreet_desktop.h +++ b/legacy/efreet/src/lib/efreet_desktop.h @@ -20,7 +20,8 @@ enum Efreet_Desktop_Type EFREET_DESKTOP_TYPE_UNKNOWN, EFREET_DESKTOP_TYPE_APPLICATION, EFREET_DESKTOP_TYPE_LINK, - EFREET_DESKTOP_TYPE_DIRECTORY + EFREET_DESKTOP_TYPE_DIRECTORY, + EFREET_DESKTOP_TYPE_MAX }; /** @@ -110,6 +111,8 @@ void efreet_desktop_category_add(Efreet_Desktop *desktop, int efreet_desktop_category_del(Efreet_Desktop *desktop, const char *category); +int efreet_desktop_type_add(const char *type); + /** * @} */