*No more KDE duplicates in menus.

*Start documenting the FDO menu process a bit better.


SVN revision: 27087
This commit is contained in:
David Walter Seikel 2006-11-13 14:20:43 +00:00
parent 0b383eb7bc
commit 19fae92d52
2 changed files with 110 additions and 100 deletions

View File

@ -5,6 +5,8 @@
* follow the spec in a way that is easy to check. Only then can we start to
* optomize into "ugly but fast".
*
* There are notes at the very end about all those nasty steps we need to do to
* follow the spec.
*/
#include <Ecore.h>
@ -17,7 +19,7 @@
#include <sys/stat.h>
#include <libgen.h>
//#define DEBUG 1
#define DEBUG 1
struct _ecore_desktop_menu_expand_apps_data
{
@ -1683,100 +1685,6 @@ _ecore_desktop_menu_apply_rules(struct _ecore_desktop_menu_generate_data *genera
}
/*
OR (implied)
loop through the rules
as soon as one matches, return true
otherwise return false.
SUB RULES
process the sub rules, return the result
AND
loop through the rules
as soon as one doesn't match, return false
otherwise return true.
NOT (implied OR)
loop through the rules
as soon as one matches, return false
otherwise return true.
ALL
return true
FILENAME
if the rule string matches the desktop id return true
otherwise return false
CATEGORY
loop through the apps categories
as soon as one matches the rule string, return true
otherwise return false.
*/
/*
merge menus
* expand <KDELegacyDir>'s to <LegacyDir>.
* expand <LegacyDir>'s
* for each dir (recursive)
* create recursively nested <MENU < L> <dirname> <> element
* // <AppDir>dirpath</AppDir>
* <DirectoryDir>dirpath</DirectoryDir>
* if exist .directory
* add <.directory> to name
* <Include>
* for each *.desktop
if no categories in bar.desktop
* <Filename>prefix-bar.desktop</Filename>
add "Legacy" to categories
* add any prefix to the desktop ID.
* add it to the pool
* </Include>
* for each <MergeFile>, and <MergeDir> 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.
* 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.
* for each <Menu> recursively
consolidate duplicate child <Menu>s.
* expand <DefaultAppDir>s and <DefaultDirectoryDir>s to <AppDir>s and <DirectoryDir>s.
consolidate duplicate child <AppDir>s, <DirectoryDir>s, and <Directory>s.
resolve duplicate <Move>s.
for each <Menu> recursively
for each <Move>
do the move.
mark any <Menu> that has been affected.
for each marked <Menu> recursively
consolidate duplicate child <Menu>s.
* for each <Menu> recursively
* if there are <Deleted> elements that are not ovreridden by a <NotDelete> element
* remove this <Menu> element and all it's children.
*generate menus
* for each <Menu> that is <NotOnlyUnallocated> (which is the default)
* for each <AppDir>
* for each .desktop
* if it exists in the pool, replace it.
* else add it to the pool.
* for each parent <Menu>
* for each .desktop in the pool
* if it doesn't exist in the child <Menu> pool
* add it to the pool.
* for each <Include> and <Exclude>
* if rule is an <Include>
* for each .desktop in pool
* for each rule
* if rule matches .desktop in pool
* add .desktop to menu.
* mark it as allocated
* if rule is an <Exclude>
* for each .desktop in menu
* for each rule
* if rule matches .desktop in menu
* remove .desktop from menu.
* leave it as allocated.
<Menu (tree)
name
@ -1798,9 +1706,110 @@ rules (tree)
and/not (tree)
include/exclude and/not all/file/category x
*generate unallocated menus
* Same as for menus, but only the <OnlyUnallocated> ones.
* Only the unallocated .desktop entries can be used.
ALL
return true
generate menu layout
FILENAME
if the rule string matches the desktop id return true
otherwise return false
CATEGORY
loop through the apps categories
as soon as one matches the rule string, return true
otherwise return false.
OR (implied)
loop through the rules
as soon as one matches, return true
otherwise return false.
SUB RULES
process the sub rules, return the result
AND
loop through the rules
as soon as one doesn't match, return false
otherwise return true.
NOT (implied OR)
loop through the rules
as soon as one matches, return false
otherwise return true.
*/
/* FDO PARSING STEPS.
An asterisk in the first column marks those bits that are done.
The spec is not numbered, so I have invented a numbering to help match the
steps to the code.
10000000 merge menus
*11000000 expand <KDELegacyDir>'s to <LegacyDir>.
*12000000 expand <LegacyDir>'s
*12100000 for each dir (recursive)
*12110000 create recursively nested <MENU < L> <dirname> <> element
*12120000 // <AppDir>dirpath</AppDir>
*12130000 <DirectoryDir>dirpath</DirectoryDir>
*12140000 if exist .directory
*12141000 add <.directory> to name
*12150000 <Include>
*12160000 for each *.desktop
12161000 if no categories in bar.desktop
*12161100 <Filename>prefix-bar.desktop</Filename>
12162000 add "Legacy" to categories
*12163000 add any prefix to the desktop ID.
*12164000 add it to the pool
*12170000 </Include>
*13000000 for each <MergeFile> and <MergeDir> element
*13100000 get the root <Menu> elements from that elements file/s.
*13200000 remove the <Name> element from those root <Menu> elements.
*13300000 replace that element with the child elements of those root <Menu> elements.
*13400000? expand the <DefaultMergeDirs> with the name/s of that elements file/s
*14000000 loop until all <MergeFile> and <MergeDir> elements are done,
*14000000 careful to avoid infinite loops in files that reference each other.
*15000000 for each <Menu> recursively
15100000 consolidate duplicate child <Menu>s.
*15200000 expand <DefaultAppDir>s and <DefaultDirectoryDir>s to <AppDir>s and <DirectoryDir>s.
15300000 consolidate duplicate child <AppDir>s, <DirectoryDir>s, and <Directory>s.
15400000? resolve duplicate <Move>s.
16000000 for each <Menu> recursively (but from the deepest level out)
16100000 for each <Move>
16110000 do the move.
16120000 mark any <Menu> that has been affected.
17000000 for each marked <Menu> recursively
17100000 consolidate duplicate child <Menu>s.
*18000000 for each <Menu> recursively
*18100000 if there are <Deleted> elements that are not ovreridden by a <NotDelete> element
*18110000 remove this <Menu> element and all it's children.
*20000000 generate menus
*21000000 for each <Menu> that is <NotOnlyUnallocated> (which is the default)
*21100000 for each <AppDir>
*21110000 for each .desktop
*21111000 if it exists in the pool, replace it.
*21112000 else add it to the pool.
*21200000 for each parent <Menu>
*21210000 for each .desktop in the pool
*21211000 if it doesn't exist in the child <Menu> pool
*21211100 add it to the pool.
*21300000 for each <Include> and <Exclude>
*21310000 if rule is an <Include>
*21311000 for each .desktop in pool
*21311100 for each rule
*21311110 if rule matches .desktop in pool
*21311111 add .desktop to menu.
*21311112 mark it as allocated
*21320000 if rule is an <Exclude>
*21321000 for each .desktop in menu
*21321100 for each rule
*21321110 if rule matches .desktop in menu
*21321111 remove .desktop from menu.
*21321112 leave it as allocated.
*30000000 generate unallocated menus
*31000000 Same as for menus, but only the <OnlyUnallocated> ones.
*32000000 Only the unallocated .desktop entries can be used.
40000000 generate menu layout
This part of the spec is a whole other rabbit hole, and optional. B-)
*/

View File

@ -181,7 +181,8 @@ _ecore_desktop_paths_create(void)
"XDG_DATA_HOME", "XDG_DATA_DIRS",
"~/.local/share:~/.kde/share",
"/usr/local/share:/usr/share",
"applications:applnk:applications/kde",
// "applications:applnk:applications/kde",
"applications:applnk",
"dist/desktop-files:dist/short-menu:gnome/apps",
"xdgdata-apps:apps");
_ecore_desktop_paths_check_and_add(ecore_desktop_paths_desktops,