diff options
Diffstat (limited to 'doc/menu.html/ch7.html')
-rw-r--r-- | doc/menu.html/ch7.html | 821 |
1 files changed, 821 insertions, 0 deletions
diff --git a/doc/menu.html/ch7.html b/doc/menu.html/ch7.html new file mode 100644 index 0000000..3cc602c --- /dev/null +++ b/doc/menu.html/ch7.html @@ -0,0 +1,821 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> + +<html> + +<head> + +<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> + +<title>Debian Menu System - The internals of the menu package</title> + +<link href="index.html" rel="start"> +<link href="ch6.html" rel="prev"> +<link href="ch8.html" rel="next"> +<link href="index.html#contents" rel="contents"> +<link href="index.html#copyright" rel="copyright"> +<link href="ch1.html" rel="chapter" title="1 Introduction"> +<link href="ch2.html" rel="chapter" title="2 Menu from the viewpoint of a user"> +<link href="ch3.html" rel="chapter" title="3 The menu file"> +<link href="ch4.html" rel="chapter" title="4 What packages with applications should do"> +<link href="ch5.html" rel="chapter" title="5 What packages with menu managers should do"> +<link href="ch6.html" rel="chapter" title="6 How a user can override the menus"> +<link href="ch7.html" rel="chapter" title="7 The internals of the menu package"> +<link href="ch8.html" rel="chapter" title="8 Variables and functions in the install-menu scripts"> +<link href="ch2.html#s2.1" rel="section" title="2.1 How/when do the window manager startup files get created?"> +<link href="ch2.html#s2.2" rel="section" title="2.2 Tuning of the generated window manager startup files"> +<link href="ch2.html#s2.3" rel="section" title="2.3 Optimization of menu tree: hints"> +<link href="ch3.html#s3.1" rel="section" title="3.1 Location"> +<link href="ch3.html#s3.2" rel="section" title="3.2 Syntax"> +<link href="ch3.html#s3.3" rel="section" title="3.3 The title field"> +<link href="ch3.html#s3.4" rel="section" title="3.4 The needs field"> +<link href="ch3.html#s3.5" rel="section" title="3.5 The section field"> +<link href="ch3.html#s3.6" rel="section" title="3.6 The command field"> +<link href="ch3.html#s3.7" rel="section" title="3.7 The icon field"> +<link href="ch3.html#s3.8" rel="section" title="3.8 The hints field"> +<link href="ch3.html#s3.9" rel="section" title="3.9 Entries for menu sections."> +<link href="ch3.html#s3.10" rel="section" title="3.10 Fvwm's task and title bars"> +<link href="ch4.html#s4.1" rel="section" title="4.1 Providing a menu file"> +<link href="ch4.html#s4.2" rel="section" title="4.2 Adding a hook for dpkg in your packages"> +<link href="ch6.html#s6.1" rel="section" title="6.1 Configuring the menus"> +<link href="ch6.html#s6.2" rel="section" title="6.2 Specifying that a menu entry should not be displayed"> +<link href="ch6.html#s6.3" rel="section" title="6.3 Including other files"> +<link href="ch7.html#s7.1" rel="section" title="7.1 The update-menus program"> +<link href="ch7.html#s7.2" rel="section" title="7.2 The install-menu program"> +<link href="ch7.html#s7.3" rel="section" title="7.3 The install-menu config script definitions"> +<link href="ch7.html#s7.4" rel="section" title="7.4 Hints, tree optimization"> +<link href="ch8.html#s8.1" rel="section" title="8.1 String constants"> +<link href="ch8.html#s8.2" rel="section" title="8.2 Variables"> +<link href="ch8.html#s8.3" rel="section" title="8.3 Functions"> +<link href="ch8.html#s8.2.1" rel="subsection" title="8.2.1 Special variables"> +<link href="ch8.html#s8.2.2" rel="subsection" title="8.2.2 Preferred variables"> +<link href="ch8.html#s8.2.3" rel="subsection" title="8.2.3 Suggested variables"> + +</head> + +<body> + +<p><a name="ch7"></a></p> +<hr> + +<p> +[ <a href="ch6.html">previous</a> ] +[ <a href="index.html#contents">Contents</a> ] +[ <a href="ch1.html">1</a> ] +[ <a href="ch2.html">2</a> ] +[ <a href="ch3.html">3</a> ] +[ <a href="ch4.html">4</a> ] +[ <a href="ch5.html">5</a> ] +[ <a href="ch6.html">6</a> ] +[ 7 ] +[ <a href="ch8.html">8</a> ] +[ <a href="ch8.html">next</a> ] +</p> + +<hr> + +<h1> +Debian Menu System +<br>Chapter 7 - The internals of the menu package +</h1> + +<hr> + +<hr> + +<h2><a name="s7.1"></a>7.1 The update-menus program</h2> + +<p> +On startup, update-menus checks the file <code>/var/run/update-menus.pid</code> +and the pid in it. If there's an <code>update-menus</code> process with that +pid it kills it. If <code>/var/lib/dpkg/lock</code> exists, it checks to see +if dpkg supports triggers. If so, it uses dpkg-trigger to trigger a real +update-menus run later. Otherwise, it forks to background and returns control +to dpkg. The background process checks the <code>/var/lib/dpkg/lock</code> +file approx. every two second until the file's gone. +</p> + +<p> +Once it's decided to run, whether in the background after dpkg exits, or in the +foreground when used with a trigger-capable dpkg, <code>update-menus</code> +reads the menu-entry files in the following directories: +<code>/etc/menu</code>, <code>/usr/lib/menu</code>, +<code>/usr/share/menu</code>, <code>/usr/share/menu/default</code>. (if a user +runs <code>update-menus</code>, it will add <code>~/.menu</code> to the front +of that list). For every menu entry line in each file it checks if the +corresponding package is installed. The menu entries of all packages marked as +installed by dpkg are added together in one big buffer that is kept in memory +(exception: executable menu entry files are executed, and stdout is placed in +the buffer). +</p> + +<p> +Once it's read all menu entry files, <code>update-menus</code> starts all +executable scripts in <code>/etc/menu-methods/</code>, hands the scripts the +previously created buffer via stdin. (If <code>update-menus</code> is run by a +user, it will first try to run the scripts in <code>~/.menu-methods</code>, and +only if that directory doesn't exist, it will run the scripts in +<code>/etc/menu-methods</code>). +</p> + +<p> +Note that as an aid to debugging, one can use +</p> + +<pre> + update-menus --stdout > /tmp/menu-stdin +</pre> + +<p> +and then view the file <code>/tmp/menu-stdin</code> to see exactly what +<code>update-menus</code> handed the menu-methods on their stdin. +</p> + +<p> +This may also be useful for people writing <code>/etc/menu-method/*</code> +scripts: Running <code>update-menus</code> every time you changed something in +the script may be quite time-consuming. So, it's much easier to run +<code>update-menus --stdout</code> once, and then run +</p> + +<pre> + /etc/menu-methods/mymethod < /tmp/menu-stdin +</pre> + +<p> +(and, if that also takes too long, just try editing /tmp/menu-stdin, and +removing 90% or so of all entries) +</p> + +<hr> + +<h2><a name="s7.2"></a>7.2 The install-menu program</h2> + +<p> +The files <code>/etc/menu-methods/$wm</code> are executable config files that +start with the line +</p> + +<pre> + #!/usr/bin/install-menu +</pre> + +<p> +and thus start that program, handing it the configuration file for the specific +window manager in the first command line argument. This configuration consists +of: +</p> +<ol type="1" start="1" > +<li> +<p> +the compatibility mode ("menu-1" or "menu-2"). +</p> +</li> +</ol> +<ol type="1" start="2" > +<li> +<p> +where the various files should be stored/read. +</p> +</li> +</ol> +<ol type="1" start="3" > +<li> +<p> +what "needs" are supported, and what wrapper files should be used for +each "type". +</p> +</li> +</ol> +<ol type="1" start="4" > +<li> +<p> +how to remove the generated menu files. +</p> +</li> +</ol> + +<p> +See <code>/usr/share/doc/menu/examples/</code> of the menu package for more +comments. +</p> + +<p> +Options to <code>install-menu</code>: +</p> + +<pre> + --remove Remove the menu files instead of generating them. + --verbose Output outline of operations that are performed. +</pre> + +<p> +Some window managers don't support an `include'-like statement in their +<code>system.*rc</code> files (like <code>m4</code> or <code>cpp</code> +preprocessing); they cannot read the <code>menudefs.hook</code> file generated +by install-menu from their <code>system.*rc</code> config file. To still be +able to use them, <code>install-menu</code> will copy the file +<code>$path/$examplercfile</code> to <code>$path/$rcfile</code> (with +<code>$examplercfile</code> and <code>$rcfile</code> defined in the +<code>install-menu</code> config file, and <code>$path</code> either the +<code>$rootprefix</code> or <code>${HOME}/$userprefix</code>, depending on +whether root or user executed the file.), and replace all occurrences of +``install-menu-defs'' with the <code>$genmenu</code> file it just generated. +</p> + +<p> +As an example, consider the following: +<samp>examplercfile=system.foo-wm-example</samp>, +<samp>rcfile=system.foo-wm</samp>, <samp>genmenu=menudefs.hook</samp> and +<samp>rootprefix=/var/lib/foo-wm/menu</samp>. Now, if +<code>install-menu</code> gets run, it will first generate the file +<code>/var/lib/foo-wm/menu/menudefs.hook</code>. Next, it will line-by-line +read the file <code>/var/lib/foo-wm/menu/system.foo-wm-example</code> and copy +its contents to <code>/var/lib/foo-wm/menu/system.foo-wm</code>, replacing +every occurrence of the string <samp>install-menu-defs</samp> with the contents +of the file <code>/var/lib/foo-wm/menu/menudefs.hook</code>. +</p> + +<p> +To activate the file copying in this way, simply define the +<samp>$examplercfile</samp> and <samp>$rcfile</samp> variables in the +<code>install-menu</code> configuration file (for example, see +<code>/etc/menu-methods/fvwm</code>), and make sure there is a +<code>$path/$examplercfile</code> (<samp>$path</samp> being either +<samp>$rootprefix</samp>, or <code>$userprefix</code>.) +</p> + +<p> +If you are writing a menu method, you can use the following to make debugging +it somewhat more easily: +</p> +<ol type="1" start="1" > +<li> +<p> +use <samp>update-menus --stdout > /tmp/menu-stdin</samp> to create a list of +menu entries in <code>/tmp/menu-stdin</code> and then +</p> +</li> +</ol> +<ol type="1" start="2" > +<li> +<p> +you can run just your menu-method with (if it's called wm): +</p> + +<pre> + ./wm -v < /tmp/menu-stdin +</pre> +</li> +</ol> + +<hr> + +<h2><a name="s7.3"></a>7.3 The install-menu config script definitions</h2> + +<p> +The menu-methods in <code>/etc/menu-methods/*</code> are basically made up of a +lot of ``tag=string'' definitions, telling <code>install-menu</code> how to +generate a <code>system.${wm}rc</code> script. This way you can tune the look +of generated <code>system.${wm}rc</code> to your needs. +</p> + +<p> +In the following, something like +</p> + +<pre> + treewalk="c(m)" +</pre> + +<p> +means that the treewalk variable by default has the value "c(m)". +</p> + +<p> +For examples of what these scripts can look like, see +<code>/usr/share/doc/menu/examples/*</code>. +</p> +<dl> +<dt><samp>compat="menu-1"</samp></dt> +<dd> +<p> +Two mode are defined: +</p> +<dl> +<dt><samp>"menu-1"</samp></dt> +<dd> +<p> +menu directives are terminated by an end-of-line character. +</p> +</dd> +</dl> +<dl> +<dt><samp>"menu-2"</samp></dt> +<dd> +<p> +menu directives are terminated by a semicolon character. +</p> +</dd> +</dl> + +<p> +This must be just after the <samp>!include "menu.h"</samp> directive +so that <code>menu.h</code> can use its own compat mode. +</p> +</dd> +</dl> +<dl> +<dt><samp>outputencoding="UTF-8"</samp></dt> +<dd> +<p> +Set the encoding used for output files. Use <samp>iconv --list</samp> to get +the list of supported encoding. Useful values include "UTF-8" and +"ISO-8859-1". The special value "LOCALE" means that the +current locale encoding will be used. If set to an empty string, no +translations are performed. This is the default. +</p> +</dd> +</dl> +<dl> +<dt><samp>outputlanguage=""</samp></dt> +<dd> +<p> +If set to "C" automatic translations will be disabled. Note that you +can still use translate() to perform explicit translation. +</p> +</dd> +</dl> +<dl> +<dt><samp>supported</samp></dt> +<dt><samp>endsupported</samp></dt> +<dd> +<p> +Between the <samp>supported</samp> and <samp>endsupported</samp> keywords you +define what "needs" are supported by this window manager. So, the +following is an example for a wm that supports both needs=x11 and needs=text: +</p> + +<pre> + function q($s) = "\"" esc($s,"\\\"") "\"" + supported + x11 =" ShowEntry(" q(title()) ", " q($command) ")" + text=" ShowEntry(" q(title()) ", " q(term()) ")" + endsupported +</pre> + +<p> +For the variable substitution (and functions, not shown above), see the next +paragraph. In the above example, you'll notice that for the menu entries that +"need=text", the term() function is used. This is a user-supplied +function that will run $command in a X terminal emulator. Also, as X11 is +higher up in the supported list above than text, a package that supplies both a +"needs=X11" and a "needs=text" entry will have the +needs=X11 entry installed, in favour of the needs=text entry. You can continue +lines on the next line with a backslash ("\"), but make sure you +don't add any spaces after the backslash. +</p> +</dd> +</dl> +<dl> +<dt><samp>startmenu=""</samp></dt> +<dt><samp>endmenu=""</samp></dt> +<dt><samp>submenutitle=""</samp></dt> +<dd> +<p> +These define what to print for the beginning/end of a menu, and how to the +print a menu entry that pops up another menu. They are substituted the same +way as the "supported" stuff is; see next paragraph. +</p> +</dd> +</dl> +<dl> +<dt><samp>treewalk="c(m)"</samp></dt> +<dd> +<p> +This string defines in what order to dump the <samp>$startmenu</samp>, +<samp>$endmenu</samp>, and <samp>$submenutitle</samp> (and its children). Each +char in the string refers to: +</p> + +<pre> + c : dump children of menu. + m : dump this menu's $submenutitles + ( : dump $startmenu + ) : dump $endmenu + M : dump all $submenutitles of this menu and this menu's children. +</pre> + +<p> +The default is "c(m)". For olvwm, one needs: "(M)" +</p> +</dd> +</dl> +<dl> +<dt><samp>genmenu=""</samp></dt> +<dd> +<p> +The menu file to generate (usually something like +<samp>system."$wm"rc</samp>). The file itself may depend on the +level or title that is currently being worked on, like +</p> + +<pre> + genmenu="/subdir/" replacewith($section," ","_") "/rc.menu" +</pre> + +<p> +(Substitution works just like in the supported stuff, see above). Note that +the files made this way are truncated upon opening, so if you have a genmenu +like the example above, then your <samp>endmenu=</samp> will override the +startmenu stuff (but you probably only need one of the two anyway). +</p> +</dd> +</dl> +<dl> +<dt><samp>rootsection="/Debian"</samp></dt> +<dd> +<p> +the prefix every <samp>$section</samp> variable gets. +</p> +</dd> +</dl> +<dl> +<dt><samp>prerun=""</samp></dt> +<dt><samp>postrun=""</samp></dt> +<dd> +<p> +The commands to run before and after, respectively, the actual generation of +the <code>menudefs.hook</code> (genmenu) file. Commands will be executed by +<code>sh</code>. Example: +</p> + +<pre> + prerun="rm -rf " prefix() "/*" + postrun="killall -USR1 fvwm2" +</pre> + +<p> +(Substitution works just like the supported stuff, see below). +</p> +</dd> +</dl> +<dl> +<dt><samp>preruntest=""</samp></dt> +<dd> +<p> +Just like prerun, but if the return value of the command is non-zero, menu will +quit. +</p> +</dd> +</dl> +<dl> +<dt><samp>also_run=""</samp></dt> +<dd> +<p> +If non-zero, install-menus will, after generating the output files, also load +the file also_run, and use the new assignments to treewalk, genmenu, etc. to +generate more output. This second time, variables like <samp>prerun</samp> and +all of the hint stuff are ignored. +</p> +</dd> +</dl> +<dl> +<dt><samp>removemenu=""</samp></dt> +<dd> +<p> +The command to run when the menu-method is invoked with the option +<samp>--remove</samp>. This should remove all the autogenerated menu files. +If this option is not present, then install menu will remove +<samp>genmenu</samp> if it is a constant string and <samp>rcfile</samp> if it +is defined, and try to remove <samp>prefix()</samp> if it is empty. +</p> +</dd> +</dl> +<dl> +<dt><samp>onlyrunasroot=false</samp></dt> +<dt><samp>onlyrunasuser=false</samp></dt> +<dd> +<p> +If <samp>onlyrunasroot</samp> is set to true, <code>install-menu</code> will +quit silently when run as a user. Similarly for <samp>onlyrunasuser</samp>. +<var><samp>onlyrunasroot</samp> is deprecated since it is simpler to just not +define <samp>userprefix</samp>.</var> On the other hand, +<samp>onlyrunasuser</samp> might be needed if you use <samp>rcfile</samp> since +<samp>rootprefix</samp> is used as a fallback location for the template. +</p> +</dd> +</dl> +<dl> +<dt><samp>preoutput="#Automatically generated file. Do not edit (see /usr/share/doc/menu/html)\n\n"</samp></dt> +<dt><samp>postoutput=""</samp></dt> +<dd> +<p> +Text to put at the beginning resp. end of the generated file ($genmenu). +</p> +</dd> +</dl> +<dl> +<dt><samp>command=""</samp></dt> +<dd> +<p> +A command to run instead of <code>install-menus</code>. This command used to +be needed to get around limitations due to compatibility stuff. But that +compatibility with pre menu-1 stuff has been dropped, and isn't needed any +more. +</p> + +<p> +Example: +</p> + +<pre> + command="cat > /tmp/menu-stdin" +</pre> +</dd> +</dl> +<dl> +<dt><samp>hotkeyexclude=""</samp></dt> +<dd> +<p> +Keys not to use for hotkey generation. You can use the same variables and +functions here as in for example the startmenu sections. +</p> + +<p> +Example: +</p> + +<pre> + hotkeyexclude="q" $section +</pre> +</dd> +</dl> +<dl> +<dt><samp>hotkeycase="insensitive"</samp></dt> +<dd> +<p> +can be either "insensitive" or "sensitive". Determines +whether the hotkeys can be of mixed case (<samp>fvwm2</samp> reads the hotkeys +case-insensitive, <samp>pdmenu</samp> case-sensitive). In case of the titles +"Xa" and "xb", hotkey case-insensitive will generate +"X" and "b", whereas case-sensitive would generate +"X" and "x". +</p> +</dd> +</dl> +<dl> +<dt><samp>sort=$sort ":" $title</samp></dt> +<dd> +<p> +Entries within one menu will be alphabetically sorted by whatever sort returns. +So, if you do <samp>sort=ifelse($command, "1", +"0"):$title</samp>, then all submenus will appear above the commands +in a submenu. (A submenu always has <samp>$command=""</samp>). Or, +as Joey Hess writes: +</p> + +<pre> + You can add another field to the menu items, with whatever name you like, + let's say it's called priority. Then add this line to + /etc/menu-methods/*: + + sort=ifelse($priority, $priority, "9") + + This has the result of sorting things so items with a low priority sort to the + top, and items with no priority default to priority 9 and sort to the bottom. + + (Note that it compares the strings alphabetically, not numerically.) +</pre> +</dd> +</dl> +<dl> +<dt><samp>rcfile=""</samp></dt> +<dd> +<p> +If the window manager doesn't support an "include filename" or +"read(filename)" statement in it's config file, you can rename the +wm's config file to <samp>system."$wm"rc-menu</samp>, and insert a +"install-menu-defs" line (without the quotes, or whitespace around +it, and "install-menu-defs" must be the only thing on the line) in +the <samp>system."$wm"rc-menu</samp> file. This will then get +replaced by the <samp>$genmenu</samp> file that was just created (see also +<samp>$examplercfile</samp>). +</p> +</dd> +</dl> +<dl> +<dt><samp>examplercfile=""</samp></dt> +<dd> +<p> +if needed (see <samp>rcfile</samp>), this is the +<samp>system.rc"$wm"-menu</samp> file. In that case, make +<samp>rcfile=system.rc"$wm"</samp>. +</p> +</dd> +</dl> +<dl> +<dt><samp>rootprefix=""</samp></dt> +<dd> +<p> +The prefix to use when running as root (applies to $genmenu, $rcfile, +$examplercfile and other old cache files). If it is not defined, the +menu-method will be skipped when run as root. +</p> +</dd> +</dl> +<dl> +<dt><samp>userprefix=""</samp></dt> +<dd> +<p> +As <samp>rootprefix</samp>, but when running as user. userprefix is relative +to the user home directory, unless it start with 2 slashes, in which case it is +treated as an absolute path. If it is not defined, the menu-method will be +skipped when run as a user. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_optimize=false</samp></dt> +<dd> +<p> +If set to true, menu will try to generate an `optimal' tree, using the +variables below. If set to false, menu will keep the sections as they are +specified in the menu entry files (and ignore any hint stuff). +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_nentry=6</samp></dt> +<dd> +<p> +Optimal number of entries in a submenu. It's a float, so you can set it to 5.5 +if you cannot decide between 5 and 6. Also, values less than 3 probably don't +work very well at the moment. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_topnentry=5</samp></dt> +<dd> +<p> +Same as hint_nentry, but for the top level menu. Often here are other entries, +added by the window-manager itself (like Exit, Xterm, whatever) that menu +doesn't know about, so that you may want to instruct menu to put less entries +in the top level menu. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_mixedpenalty=15.0</samp></dt> +<dd> +<p> +Penalty for `mixed' menus. Mixed menus are those with both submenus and direct +commands in them. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_minhintfreq=0.1</samp></dt> +<dd> +<p> +Minimal relative frequency for the hints before they are considered. Internal +variable to speed up the tree generation. If you find menu slow, increase this +value (to, say 0.2 or 0.3). +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_mlpenalty=2000</samp></dt> +<dd> +<p> +`max local penalty', while evaluating the possible trees, menu gives +`penalties' for submenus that don't contain the desired number of submenus. +The penalty is sqrt(n_entry_opt-n_entry), and eventually will be calculated as +a sum of all nodes. But to speed things up, menu will discard possibilities in +which any node has a `local' penalty of more than hint_mlpenalty. Increase +this value if you think menu is overlooking your favorite tree (also decrease +minhintfreq), decrease this value if you think menu is wasting too much time. +Because of hint_max_ntry, the influence of this variable is nearly zero +nowadays. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_max_ntry=4</samp></dt> +<dd> +<p> +menu will recursively, for each node, try the hint_max_ntry best local +menu-divisions. +</p> +</dd> +</dl> +<dl> +<dt><samp>hints_max_iter_hint=5</samp></dt> +<dd> +<p> +The search for what hints to use in one menu is rather expensive. But due to +the way things are sorted, menu seems to always find the `best' match in the +first 2% of iterations. Thus, a way to speed things up is simply to cut of +menu searching after `some' iterations are done. This value controls this, and +limits the number of iterations to +5+hint_max_iter_hint*number_of_possible_hints. Set this value to negative to +disable this. +</p> +</dd> +</dl> +<dl> +<dt><samp>hint_debug=false</samp></dt> +<dd> +<p> +Set to true if you want to see loads and loads of debug output. +</p> +</dd> +</dl> + +<hr> + +<h2><a name="s7.4"></a>7.4 Hints, tree optimization</h2> + +<p> +The hints actually work in a rather strange way: when +<samp>hint_optimize=true</samp> then all <samp>$section</samp> elements are +added to the specified <samp>$hints</samp> variable, and the order +(<samp>/Applications/Editors</samp> or <samp>/Editors/Applications</samp>) of +the resulting hints is completely ignored. Then, the hints for each menu entry +are handed to the optimization routine, which will calculate a reasonable tree +for those hints. That tree must comply with the following: +</p> + +<p> +When a user looks for a program "Program" with, say, hints +"Good,Bulky,Heaven", then, while walking through the tree, it should +at every node visited be clear for the user what submenu to select (or the menu +should have "Program" directly in it). So, the top-level menu may +look like +</p> + +<pre> + Good + Hell + Microsoft +</pre> + +<p> +because then a searcher for a menu entry with hints +"Good,Bulky,Heaven" will know to select the submenu "Good". +The toplevel menu may not look like +</p> + +<pre> + Good + Hell + Heaven +</pre> + +<p> +as now it isn't clear whether to visit the Good or the Heaven submenu. +</p> + +<p> +That rule allows usually for many different trees, and the task of the +optimization procedure is to select, in a finite amount of time, the tree that +best matches the user's desire about the optimum number of menu entries. +</p> + +<hr> + +<p> +[ <a href="ch6.html">previous</a> ] +[ <a href="index.html#contents">Contents</a> ] +[ <a href="ch1.html">1</a> ] +[ <a href="ch2.html">2</a> ] +[ <a href="ch3.html">3</a> ] +[ <a href="ch4.html">4</a> ] +[ <a href="ch5.html">5</a> ] +[ <a href="ch6.html">6</a> ] +[ 7 ] +[ <a href="ch8.html">8</a> ] +[ <a href="ch8.html">next</a> ] +</p> + +<hr> + +<p> +Debian Menu System +</p> + +<address> +version 1.4, 10 November 2011<br> +<br> +Joost Witteveen <code><a href="mailto:joostje@debian.org">joostje@debian.org</a></code><br> +Joey Hess <code><a href="mailto:joeyh@debian.org">joeyh@debian.org</a></code><br> +Christian Schwarz <code><a href="mailto:schwarz@debian.org">schwarz@debian.org</a></code><br> +Bill Allombert <code><a href="mailto:ballombe@debian.org">ballombe@debian.org</a></code><br> +<br> +</address> +<hr> + +</body> + +</html> + |