Enlightenment CVS committal Author : onefang Project : e17 Module : apps/e_utils
Dir : e17/apps/e_utils/src/bin/e17genmenu/src/bin Modified Files: dumb_tree.c dumb_tree.h fdo_menus.c fdo_paths.c fdo_paths.h main.c Log Message: Basic menu merging, but not legacy menu merging yet. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/dumb_tree.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- dumb_tree.c 22 Feb 2006 07:49:19 -0000 1.3 +++ dumb_tree.c 22 Feb 2006 20:25:14 -0000 1.4 @@ -194,6 +194,17 @@ return tree; } +void +dumb_tree_remove(Dumb_Tree * tree, int element) +{ + if (tree->size > element) + { + tree->elements[element].type = DUMB_TREE_ELEMENT_TYPE_NULL; + tree->elements[element].element = NULL; + } +} + + int dumb_tree_exist(Dumb_Tree * tree, char *element) { =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/dumb_tree.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- dumb_tree.h 22 Feb 2006 07:49:19 -0000 1.3 +++ dumb_tree.h 22 Feb 2006 20:25:14 -0000 1.4 @@ -49,6 +49,7 @@ Dumb_Tree *dumb_tree_merge(Dumb_Tree * tree, int before, Dumb_Tree * element); Dumb_Tree *dumb_tree_add_child(Dumb_Tree * tree, Dumb_Tree * element); Dumb_Tree *dumb_tree_add_hash(Dumb_Tree * tree, Ecore_Hash * element); + void dumb_tree_remove(Dumb_Tree * tree, int element); int dumb_tree_exist(Dumb_Tree * tree, char *element); int dumb_tree_foreach(Dumb_Tree * tree, int level, int (*func) (const void *data, Dumb_Tree * tree, int element, int level), const void *data); void dumb_tree_dump(Dumb_Tree * tree, int level); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_menus.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- fdo_menus.c 22 Feb 2006 13:22:45 -0000 1.19 +++ fdo_menus.c 22 Feb 2006 20:25:14 -0000 1.20 @@ -112,7 +112,7 @@ text = (char *)merge_stack->elements[i].element; if (strcmp(text, file) == 0) { - fprintf(stderr, "Oops, infinite menu merging loop detected at %s\n", file); + fprintf(stderr, "\n### Oops, infinite menu merging loop detected at %s\n", file); oops++; } } @@ -122,28 +122,27 @@ /* Get on with it. */ dumb_tree_foreach(menu_xml, 0, _fdo_menus_unxml, &data); dumb_tree_foreach(menu_xml, 0, _fdo_menus_merge, &data); - dumb_tree_foreach(menu_xml, 0, _fdo_menus_expand_default_dirs, &data); - if (level == 0) + /* The rest of this is only done after ALL the menus have been merged. */ + if (level == 0) { + dumb_tree_foreach(menu_xml, 0, _fdo_menus_expand_default_dirs, &data); + convert_time += ecore_time_get() - begin; dumb_tree_dump(menu_xml, 0); printf("\n\n"); begin = ecore_time_get(); - } - data.unallocated = FALSE; - dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data); - data.unallocated = TRUE; - dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data); + data.unallocated = FALSE; + dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data); + data.unallocated = TRUE; + dumb_tree_foreach(menu_xml, 0, _fdo_menus_generate, &data); - if (level == 0) - { convert_time += ecore_time_get() - begin; dumb_tree_dump(menu_xml, 0); printf("\n\n"); begin = ecore_time_get(); - } + } } } else @@ -620,8 +619,100 @@ else if (strncmp(string, "<LegacyDir ", 11) == 0) { } - else if (strncmp(string, "<MergeFile ", 8) == 0) + else if (strncmp(string, "<MergeFile ", 11) == 0) { + char merge_path[MAX_PATH]; + int path_type = 1; + + /* FIXME: need to weed out duplicate <MergeFile's, use the last one. */ + string += 11; + if (strncmp(string, "type=\"", 6) == 0) + { + string += 6; + if (strncmp(string, "parent\"", 7) == 0) + path_type = 0; + while ((*string != '"') && (*string != '\0')) + string++; + if (*string != '\0') + string++; + while ((*string == ' ') && (*string != '\0')) + string++; + } + if (path_type) + { + if (string[0] == '/') + sprintf(merge_path, "%s", string); + else + sprintf(merge_path, "%s/%s", unxml_data->path, string); + } + else /* This is a parent type MergeFile. */ + { + /* The spec is a little unclear, and the examples may look like they + * contradict the description, but it all makes sense if you cross + * reference it with the XDG Base Directory Specification (version 0.6). + * To make things harder, parent type MergeFiles never appear on my box. + * + * What you do is this. + * + * Take the XDG_CONFIG_DIRS stuff as a whole ($XDG_CONFIG_HOME, then + * $XDG_CONFIG_DIRS), in this code that will be fdo_paths_config. + * + * If this menu file is from one of the directories in fdo_paths_config, + * scan the rest of fdo_paths_config looking for the new menu. In other + * words start searching in the next fdo_paths_config entry after the one + * that this menu is in. + * + * The file to look for is the path to this menu with the portion from + * fdo_paths_config stripped off the beginning. For instance, the top level + * menu file is typically /etc/xdg/menus/applications.menu, and /etc/xdg is + * typically in fdo_paths_config, so search for menus/applications.menu. + * + * If this menu file is NOT from one of the directories in fdo_paths_menus, + * insert nothing. + * + * The first one found wins, if none are found, don't merge anything. + */ + + /* FIXME: Actually implement this when I have some menus that will exercise it. */ + merge_path[0] = '\0'; + printf("\n### Didn't expect a MergeFile parent type\n"); + } + if (merge_path[0] != '\0') + { + Dumb_Tree *new_menu; + + new_menu = fdo_menus_get(merge_path, unxml_data->merge_stack, level + 1); + if (new_menu) + { + if (new_menu->size > 1) + { + if (new_menu->elements[1].type == DUMB_TREE_ELEMENT_TYPE_TREE) + { + new_menu = (Dumb_Tree *)new_menu->elements[1].element; + if (new_menu->size > 0) + { + if (new_menu->elements[0].type == DUMB_TREE_ELEMENT_TYPE_TREE) + { + merge = (Dumb_Tree *)new_menu->elements[0].element; + dumb_tree_remove(merge, 0); + dumb_tree_remove(merge, 1); + dumb_tree_remove(merge, 2); + dumb_tree_remove(merge, 3); + dumb_tree_remove(merge, 4); + /* FIXME: The MENU_PATHs need to be prefixed. */ + } + else + printf("FUCK an error in _fdo_menus_merge(%s)\n", merge_path); + } + else + printf("FUCK another error in _fdo_menus_merge(%s)\n", merge_path); + } + else + printf("FUCK ME! An error in _fdo_menus_merge(%s)\n", merge_path); + } + } + } + result = 1; } } @@ -992,12 +1083,12 @@ merge menus * expand <KDELegacyDirs> to <LegacyDir>. for each <MergeFile>, <MergeDir>, and <LegacyDir> element - get the root <Menu> elements from that elements file/s. - remove the <Name> element from those root <Menu> elements. - replace that element with the child elements of those root <Menu> elements. +* get the root <Menu> elements from that elements file/s. +* remove the <Name> element from those root <Menu> elements. +* replace that element with the child elements of those root <Menu> elements. * expand the <DefaultMergeDirs> with the name/s of that elements file/s - loop until all <MergeFile>, <MergeDir>, and <LegacyDir> elements are done, - careful to avoid infinite loops in files that reference each other. +* loop until all <MergeFile>, <MergeDir>, and <LegacyDir> elements are done, +* careful to avoid infinite loops in files that reference each other. * for each <Menu> recursively consolidate duplicate child <Menu>s. * expand <DefaultAppDir>s and <DefaultDirectoryDir>s to <AppDir>s and <DirectoryDir>s. =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_paths.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -3 -r1.18 -r1.19 --- fdo_paths.c 22 Feb 2006 04:30:53 -0000 1.18 +++ fdo_paths.c 22 Feb 2006 20:25:14 -0000 1.19 @@ -33,6 +33,8 @@ void fdo_paths_init() { + if (!fdo_paths_config) + fdo_paths_config = _fdo_paths_get(NULL, "XDG_CONFIG_HOME", "XDG_CONFIG_DIRS", "~/.config", "/etc/xdg", "", NULL, NULL); if (!fdo_paths_menus) fdo_paths_menus = _fdo_paths_get(NULL, "XDG_CONFIG_HOME", "XDG_CONFIG_DIRS", "~/.config", "/etc/xdg", "menus", NULL, "xdgconf-menu"); if (!fdo_paths_directories) @@ -154,7 +156,7 @@ { int last; - /* Strip traling slash of home. */ + /* Strip trailing slash of home. */ last = strlen(home) - 1; if ((last >= 0) && (home[last] == '/')) home[last] = '\0'; @@ -280,7 +282,7 @@ second[last] = '\0'; } - if (second) + if ((second) && (second[0] != '\0')) { if (first[0] == '~') sprintf(path, "%s%s/%s/", home, &first[1], &second[(second[0] == '/') ? 1 : 0]); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/fdo_paths.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -3 -r1.11 -r1.12 --- fdo_paths.h 22 Feb 2006 04:15:44 -0000 1.11 +++ fdo_paths.h 22 Feb 2006 20:25:14 -0000 1.12 @@ -13,6 +13,7 @@ }; typedef enum _Fdo_Paths_Type Fdo_Paths_Type; +Dumb_Tree *fdo_paths_config; Dumb_Tree *fdo_paths_menus; Dumb_Tree *fdo_paths_directories; Dumb_Tree *fdo_paths_desktops; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/e_utils/src/bin/e17genmenu/src/bin/main.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -3 -r1.32 -r1.33 --- main.c 22 Feb 2006 13:22:45 -0000 1.32 +++ main.c 22 Feb 2006 20:25:14 -0000 1.33 @@ -39,6 +39,8 @@ parse_ini_init(); /* You can iterate through the various path lists as needed. */ + for (i = 0; i < fdo_paths_config->size; i++) + printf("FDO config path = %s\n", (char *)fdo_paths_config->elements[i].element); for (i = 0; i < fdo_paths_menus->size; i++) printf("FDO menu path = %s\n", (char *)fdo_paths_menus->elements[i].element); for (i = 0; i < fdo_paths_directories->size; i++) ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs