From cd5c85a7d2fd941df89a16bb0e4047849187b2ac Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Wed, 7 Feb 2007 02:14:46 +0000 Subject: [PATCH] Function to add a new desktop to an existing menu. SVN revision: 28283 --- legacy/efreet/src/bin/Makefile.am | 1 + legacy/efreet/src/bin/ef_menu.c | 104 +++++++++++++++++++-------- legacy/efreet/src/bin/ef_utils.c | 28 ++++++++ legacy/efreet/src/bin/main.c | 6 ++ legacy/efreet/src/lib/efreet_menu.c | 51 ++++++++++++- legacy/efreet/src/lib/efreet_menu.h | 2 + legacy/efreet/src/lib/efreet_utils.c | 28 +++++++- legacy/efreet/src/lib/efreet_utils.h | 3 +- 8 files changed, 188 insertions(+), 35 deletions(-) create mode 100644 legacy/efreet/src/bin/ef_utils.c diff --git a/legacy/efreet/src/bin/Makefile.am b/legacy/efreet/src/bin/Makefile.am index 46dbfbd5e0..7e0ea17775 100644 --- a/legacy/efreet/src/bin/Makefile.am +++ b/legacy/efreet/src/bin/Makefile.am @@ -15,6 +15,7 @@ ef_ini.c \ ef_locale.c \ ef_desktop.c \ ef_menu.c \ +ef_utils.c \ main.c diff --git a/legacy/efreet/src/bin/ef_menu.c b/legacy/efreet/src/bin/ef_menu.c index c274ee1960..c0db839dc3 100644 --- a/legacy/efreet/src/bin/ef_menu.c +++ b/legacy/efreet/src/bin/ef_menu.c @@ -1,3 +1,4 @@ +/* vim: set sw=4 ts=4 sts=4 et: */ #include "Efreet.h" #include "efreet_private.h" @@ -36,38 +37,85 @@ ef_cb_menu_get(void) printf("efreet_menu_get() returned NULL\n"); return 0; } -#if 0 - if (strcmp(menu->name.internal, "Applications")) - { - printf("menu name didn't match\n"); - return 0; - } - - if (!menu->moves || ecore_list_nodes(menu->moves) != 2) - { - printf("Missing moves\n"); - return 0; - } - - if (menu->current_move) - { - printf("Current move still set\n"); - return 0; - } - - if (menu->filters) - { - printf("Have filters when we shouldn't\n"); - return 0; - } - ef_menu_desktop_exec(menu); -#endif printf("\n"); efreet_menu_dump(menu, ""); - unlink("/tmp/test.menu"); - efreet_menu_save(menu, "/tmp/test.menu"); efreet_menu_free(menu); return 1; } +int +ef_cb_menu_save(void) +{ + Efreet_Menu *menu; + +// menu = efreet_menu_get(); + menu = efreet_menu_parse(PACKAGE_DATA_DIR"/efreet/test/test.menu"); + if (!menu) + { + printf("efreet_menu_get() returned NULL\n"); + return 0; + } + unlink("/tmp/test.menu"); + return efreet_menu_save(menu, "/tmp/test.menu"); +} + +int +ef_cb_menu_edit(void) +{ + Efreet_Menu *menu, *entry; + Efreet_Desktop *desktop; + +// menu = efreet_menu_get(); + menu = efreet_menu_parse(PACKAGE_DATA_DIR"/efreet/test/test.menu"); + if (!menu) + { + printf("efreet_menu_get() returned NULL\n"); + return 0; + } +#if 0 + printf("\n"); + efreet_menu_dump(menu, ""); + printf("\n"); +#endif + + desktop = efreet_desktop_get(PACKAGE_DATA_DIR"/efreet/test/test.desktop"); + if (!desktop) + { + printf("No desktop found.\n"); + return 0; + } + + efreet_menu_desktop_insert(menu, desktop, 0); +#if 0 + printf("\n"); + efreet_menu_dump(menu, ""); + printf("\n"); +#endif + ecore_list_goto_first(menu->entries); + entry = ecore_list_current(menu->entries); + if (desktop != entry->desktop) return 0; + + efreet_menu_desktop_insert(menu, desktop, 2); +#if 0 + printf("\n"); + efreet_menu_dump(menu, ""); + printf("\n"); +#endif + ecore_list_goto_index(menu->entries, 2); + entry = ecore_list_current(menu->entries); + if (desktop != entry->desktop) return 0; + + efreet_menu_desktop_insert(menu, desktop, -1); +#if 0 + printf("\n"); + efreet_menu_dump(menu, ""); + printf("\n"); +#endif + ecore_list_goto_last(menu->entries); + entry = ecore_list_current(menu->entries); + if (desktop != entry->desktop) return 0; + + return 1; +} + diff --git a/legacy/efreet/src/bin/ef_utils.c b/legacy/efreet/src/bin/ef_utils.c new file mode 100644 index 0000000000..8e8f75f340 --- /dev/null +++ b/legacy/efreet/src/bin/ef_utils.c @@ -0,0 +1,28 @@ +/* vim: set sw=4 ts=4 sts=4 et: */ +#include "Efreet.h" +#include "efreet_private.h" + +int +ef_cb_utils(void) +{ + char *tmp; + + tmp = efreet_util_path_in_default("applications", + "/usr/share/applications/test.desktop"); + if (strcmp(tmp, "/usr/share/applications")) + { + free(tmp); + return 0; + } + free(tmp); + + tmp = efreet_util_path_to_file_id("/usr/share/applications", + "/usr/share/applications/this/tmp/test.desktop"); + if (strcmp(tmp, "this-tmp-test.desktop")) + { + free(tmp); + return 0; + } + free(tmp); + return 1; +} diff --git a/legacy/efreet/src/bin/main.c b/legacy/efreet/src/bin/main.c index 58c62029e6..21246e86de 100644 --- a/legacy/efreet/src/bin/main.c +++ b/legacy/efreet/src/bin/main.c @@ -22,7 +22,10 @@ int ef_cb_desktop_type_parse(void); int ef_cb_desktop_file_id(void); #endif int ef_cb_menu_get(void); +int ef_cb_menu_save(void); +int ef_cb_menu_edit(void); int ef_cb_ini_long_line(void); +int ef_cb_utils(void); typedef struct Efreet_Test Efreet_Test; struct Efreet_Test @@ -51,6 +54,9 @@ static Efreet_Test tests[] = { {"Desktop File ID", ef_cb_desktop_file_id}, #endif {"Menu Parsing", ef_cb_menu_get}, + {"Menu Save", ef_cb_menu_save}, + {"Menu Edit", ef_cb_menu_edit}, + {"Utils", ef_cb_utils}, {NULL, NULL} }; diff --git a/legacy/efreet/src/lib/efreet_menu.c b/legacy/efreet/src/lib/efreet_menu.c index 73783b21f4..8a0ce70de3 100644 --- a/legacy/efreet/src/lib/efreet_menu.c +++ b/legacy/efreet/src/lib/efreet_menu.c @@ -792,6 +792,51 @@ efreet_menu_save_indent(FILE *f, int indent) return 1; } +/** + * @param menu: The menu to work with + * @param desktop: The desktop to insert + * @return Returns 1 on success, 0 on failure + * @brief Insert a desktop element in a menu structure. Only accepts desktop files + * in default directories. + */ +int +efreet_menu_desktop_insert(Efreet_Menu *menu, Efreet_Desktop *desktop, int pos) +{ + Efreet_Menu *entry; + char *path; + char *id; + + if (!desktop || !menu) return 0; + path = efreet_util_path_in_default("applications", desktop->orig_path); + if (!path) return 0; + id = efreet_util_path_to_file_id(path, desktop->orig_path); + + entry = efreet_menu_entry_new(); + entry->type = EFREET_MENU_ENTRY_DESKTOP; + entry->id = ecore_string_instance(id); + entry->name = ecore_string_instance(desktop->name); + if (desktop->icon) entry->icon = ecore_string_instance(desktop->icon); + entry->desktop = desktop; + + if (!menu->entries) + { + menu->entries = ecore_list_new(); + ecore_list_set_free_cb(menu->entries, ECORE_FREE_CB(efreet_menu_free)); + } + + if (pos < 0 || pos >= ecore_list_nodes(menu->entries)) + ecore_list_append(menu->entries, entry); + else + { + ecore_list_goto_index(menu->entries, pos); + ecore_list_insert(menu->entries, entry); + } + + free(id); + free(path); + return 1; +} + /** * @param menu: The menu to work with * @param indent: The indent level to print the menu at @@ -820,13 +865,13 @@ efreet_menu_dump(Efreet_Menu *menu, const char *indent) while ((entry = ecore_list_next(menu->entries))) { if (entry->type == EFREET_MENU_ENTRY_SEPARATOR) - printf("%s|---\n", indent); + printf("%s|---\n", new_indent); else if (entry->type == EFREET_MENU_ENTRY_DESKTOP) - printf("%s|-%s\n", indent, entry->name); + printf("%s|-%s\n", new_indent, entry->name); else if (entry->type == EFREET_MENU_ENTRY_MENU) efreet_menu_dump(entry, new_indent); else if (entry->type == EFREET_MENU_ENTRY_HEADER) - printf("%s|---%s\n", indent, entry->name); + printf("%s|---%s\n", new_indent, entry->name); } FREE(new_indent); diff --git a/legacy/efreet/src/lib/efreet_menu.h b/legacy/efreet/src/lib/efreet_menu.h index 9b9efbbaf7..49b85d72c2 100644 --- a/legacy/efreet/src/lib/efreet_menu.h +++ b/legacy/efreet/src/lib/efreet_menu.h @@ -56,6 +56,8 @@ Efreet_Menu *efreet_menu_parse(const char *path); int efreet_menu_save(Efreet_Menu *menu, const char *path); void efreet_menu_free(Efreet_Menu *menu); +int efreet_menu_desktop_insert(Efreet_Menu *menu, Efreet_Desktop *desktop, int pos); + void efreet_menu_dump(Efreet_Menu *menu, const char *indent); /** diff --git a/legacy/efreet/src/lib/efreet_utils.c b/legacy/efreet/src/lib/efreet_utils.c index 532414b529..6d387e664a 100644 --- a/legacy/efreet/src/lib/efreet_utils.c +++ b/legacy/efreet/src/lib/efreet_utils.c @@ -2,11 +2,11 @@ #include "Efreet.h" #include "efreet_private.h" -int +char * efreet_util_path_in_default(const char *section, const char *path) { Ecore_List *dirs; - int ret = 0; + char *ret = NULL; char *dir; dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), @@ -20,7 +20,7 @@ efreet_util_path_in_default(const char *section, const char *path) len = strlen(dir); if (!strncmp(path, dir, strlen(dir))) { - ret = 1; + ret = strdup(dir); break; } } @@ -28,3 +28,25 @@ efreet_util_path_in_default(const char *section, const char *path) ecore_list_destroy(dirs); return ret; } + +char * +efreet_util_path_to_file_id(const char *base, const char *path) +{ + size_t len; + char *id, *p; + + len = strlen(base); +#if 0 + if (strlen(path) <= len) return NULL; + if (!strncmp(path, base, len)) return NULL; +#endif + + id = strdup(path + len + 1); + p = id; + while (*p) + { + if (*p == '/') *p = '-'; + p++; + } + return id; +} diff --git a/legacy/efreet/src/lib/efreet_utils.h b/legacy/efreet/src/lib/efreet_utils.h index 36e8f6cabc..c28aa1c6da 100644 --- a/legacy/efreet/src/lib/efreet_utils.h +++ b/legacy/efreet/src/lib/efreet_utils.h @@ -2,6 +2,7 @@ #ifndef EFREET_UTILS_H #define EFREET_UTILS_H -int efreet_util_path_in_default(const char *section, const char *path); +char *efreet_util_path_in_default(const char *section, const char *path); +char *efreet_util_path_to_file_id(const char *base, const char *path); #endif