Version 0.6 (2012-04-08) * Add support for user-defined cdmrc: Since cdm(1) is run with user priviledge, users can still circumvent administrator's settings by simply running a modified version of cdm(1) and use his own config. Therefore it's technically meaningless to specify everything in a config file located in /etc/. Multilevel config can be more flexible (see the implementation of submenus after Casper's modifications), just like with bash(1), zsh(1), etc. * Classify menu items into console programs and X programs: Console programs are directly `exec'ed. X programs are run in a way similar to that in cdm 0.5.3. Programs are specified in the bash array `$binlist', and their names are in the array `$namelist'. Their types ( aka "flags"), as denoted by `C' (console programs) or `X' (X programs), are specified in the array `$flaglist'. So with the current architecture, cdm(1) submenus can be implemented by letting one cdm(1) `exec' another cdm(1) with a different config file (see the "user-defined cdmrc" section). Also, one can log in his account and autostart cdm(1) (using `exec cdm' in .profile or so), and let cdm(1) launch his desktop, or just drop to his $SHELL by `exec $SHELL'. So the architecture is more flexible than cdm 0.5.3. Right way to *auto*start cdm(1) -- use `exec cdm': login(1) -/spawn/-> $SHELL -/exec/-> cdm(1) -/exec/-> console program login(1) -/spawn/-> $SHELL -/exec/-> cdm(1) -> /exit/ | ^ /spawn/ /return/ v | cdm-xlaunch(1) | /Launch and put to background/ v X program Wrong way to *auto*start cdm(1) -- just run (spawn) `cdm': login(1) -/spawn/-> $SHELL /So the shell does not exit (note 1)/ | ^ /spawn/ /return/ v | cdm(1) -/run console program or X program/ Note 1: Cannot configure $SHELL to exit conditionally on the exit of cdm(1), because cdm might `exec' to arbitrary program as specified by the user, of which the return values' meanings could not be predicted. It is also not advisable to let cdm(1) to wait for the running program to exit (instead of `exec' the program or use the method in cdm-xlaunch(1) to put the program to background), since that just adds a (mostly) useless sleeping cdm(1) on the process table when the program is running. * Change `$menu' to a bash array: This makes escaping and quoting in the menu possible and elegant for both cdm(1) and cdmrc, which adds possibility for providing arguments to programs in `$binlist' (formerly known as `$wmbinlist'). `$usexinit' and related code is removed accordingly. * Use a better way to safely launch a program in the background: See . `$loginshell' is removed accordingly. * Remove `$allowconsole', `shutdownmenu()', etc.: Since the related things can be set in config files as "console programs", `$binlist' supports commands with whitespaces, and submenus can be elegantly implemented with cdm `exec'ing another cdm with a different config file. * Code separation: Code messing with X would only be run if an X program is to be run. `xstart()' code is moved to `cdm-xlaunch(1)', since it's relatively independent code and thus would be sometimes useful for running as a standalone program. * Replace self-made info formatting code with `functions.sh': checkyesno() is removed too since gentoo's `functions.sh' already provides it. `functions.sh' can be substituted with custom ones of course. * Use signal names (not numbers) in `trap'. * Changes to variable names: The changed are generally intended to make it easier to reason about the actually effects of the variables. `$theme' -> `$dialogrc': bacause the "theme" file is essentially a dialogrc file. This is mainly affected by the Arch philosophy: "simplicity as without unnecessary additions, modifications, or complications". BTW, `$dialogrc' should now be set to an absolute path, making it possible to make use of dialogrc's in the whole file system. `$cosolekittime' -> `$cktimeout': indicate "timeout" here. * Reformat comments: Expanded tabs to avoid problem with editors.