RATMEN.C(1)

NAME
ratmen - create a menu to run commands

SYNOPSIS
ratmen [OPTION]... MENUITEM COMMAND...

ratmen [OPTION]... {-d##|--delimiter ##} MENUITEM##COMMAND ...

DESCRIPTION
Ratmen is a simple program that accepts a list of MENUITEM and COMMAND pairs on the command line. It creates a window that consists of nothing but a menu. When a particular MENUITEM is selected by the user, the corresponding COMMAND is executed or (using --print) printed on standard output.

Menu items and commands may either be given separately (as in ratmenu) using two arguments for each menu option, or, optionally you may specify a delimiter (using the --delimiter option) and specify both menu item and command in the same argument (similar to 9menu). The delimiter may be of any length.

If the command is omitted (or if an empty command is supplied when not using --delimiter) then the menu item text will be used as the command.

OPTIONS
Some options may be specified using X resouces (allowing you to define some defaults you like in your in you ~/.Xresources, ~/.Xdefaults or similar). To make this mechanism as useful as possible I would suggest that you refrain from using such options on the command line, unless you really need to, and instead enable/disable the corresponding X resource setting.

ratmen's default resource class is the name of the executed file, either ratmen or, if the executable was called through a link, the name of the link in question. The command line option --class may be used to override the default X resource class name.

--align {left|center|right}  (X resource: align)
    Aligns the text of the menu entries to the left, center or right. Defaults to left. (Short options -l, -c and -r may also be used for left, center and right respectivelly.)

-b, --back PREVMENU
    Run command PREVMENU when user goes back in the menu hierarchy. Useful when using nested menus; it gives the user a way to back out and return to the previous menu. Note that you can use this option for other things too. The command specified by the --back option is executed when the user hits one of the "back" keys.

--background BGCOLOR  (X resource: background)
    Set the background color to BGCOLOR. By default, the background color is black. BGCOLOR may be the name of any color accepted by your X server.

-C, --class CLASSNAME
    This option allows you to override ratmen's resource class. Normally it is "ratmen", but it can be set to another class such as "ratmenu" to override selected resources.

--debug
    Makes ratmen talk quite a lot on standard error.

-d, --delimiter DELIM
    This changes the behaviour when parsing subsequent menuitem/command pairs.

    Normally the command line argumens are taken to be alternately menu items and their related commands, thus requiring an even number of arguments to be passed to ratmen. (If a command is given as "" it is taken to be the same as the menu item.) This behaviour can make it somewhat difficult to distinguish between menu item arguments and command arguments in cases where the menu grow quite big (e.g. in a script). Therefore an alternative is provided...

    If you specify a delimiter (using --delimiter) this behaviour is changed and the menu item and command are both expected to occur in the same argument, separated by whatever delimiter you've specified. This makes the command line easier to read (for a human) but is sometimes disadvantageous, especially in autogenerated menus, since the delimiter in question cannot occur in the menu item text. (See also "EXAMPLES" below.)

-D, --display DISPLAYNAME
    Use the X display DISPLAYNAME, instead of the default display. Normally you won't need to use this.

--foreground FGCOLOR  (X resource: foreground)
    Set the foreground color to FGCOLOR. By default, the foreground color is black. FGCOLOR may be the name of any color accepted by your X server.

-F, --font FONTNAME  (X resource: font)
    Use the font FONTNAME instead of the default font.

-h, --help
    Output a brief help message.

--mouse  (X resource: mouse)
--no-mouse
    Enable/disable mouse support in ratmen. The mouse support is quite limited (you can't scroll a large menu using the mouse) and is only intended for those moments when you instinctively want to click on something you see in order to select it. See also "MOUSE SUPPORT".

    Use "ratmen.mouse: false" (or `no' or `off') in your X resource file to disable mouse support as a default, and "ratmen.mouse: true" (or `yes' or `on) to enable it.

-i, --item POSITION
    Pre-select menu item number POSITION, instead of the first menu item, upon opening the menu. Menu items are numbered from 1. This is sometimes useful in scripts.

    If POSITION is 0, then no item is selected initially. Going up one item will make the menu jump to the last item, going down will jump to the first item. Pressing enter while no item is selected is the same as aborting. There is no way to zero entries, other than this, so if you move about you cannot return to the state where no item is selected (but why should you ever want that?).

    The described behavior is useful when the initially selected item denotes a `current' value (useful when called from a script) and the absence of a selected item may be used to indicate that there is no such `current' value.

-p, --print
    Prints the COMMAND associated with the selected MENUITEM on standard output instead of running it.

    Using this option you can use a menu for all kinds of selections, and not only for running a program. When using this option COMMAND no longer need to be a valid command at all -- any string will work. See also "EXAMPLES" below.

-o, --scroll-offset ITEMS  (X resource: scrollOffset)
    If a menu is too large to fit in one window, it will become scrollable. Ratmen will try to keep at least ITEMS number of items between the current position and the top or bottom of the menu. If you get closer than this, the menu will scroll. As you get close to the top or bottom of the menu scrolling will cease. (Default scroll offset is 3.)

    Scroll offset may not be larger than half of the menu. If it is it will be cut down to that value.

-S, --shell PROG
    Use PROG as the shell to run commands, instead of /bin/sh. A popular alternative shell is rc(1). If the shell cannot be executed, ratmen will silently fall back to using /bin/sh.

-s, --style {snazzy|dreary}  (X resource: style)
    The default style is dreary, where the highlight bar moves up and down the menu as it does on all conventional keyboard controlled menus. In dreary mode, the highlight bar, which shows the currently selected item, remains stationary while all the menu items are rotated up or down when the cursor keys are moved.

-t, --title NAME
    Change the title of the menu window to NAME. The default title is the last component of the path used to run ratmen, typically, "ratmen".

--unfocus-exit  (X resource: unfocusExit)
--no-unfocus-exit
    FIXME: Currently a `BadWindow' error message is generated by X when the current instance of ratmen dies of unfocus. Does anyone know how to fix this?

    --unfocus-exit causes ratmen to die (without any option being selected) if its window loses focus (it's probably not a good to use in combination with a window manager that automatically focuses the window under your pointer).

    --no-unfocus-exit makes ratmen survive unfocusing. This can be confusing in some cases as it makes it possible to have start several menus at once (normally the previous menu would die from unfocus).

    Use "ratmen.unfocusExit: false" (or `no' or `off') in your X resource file to disable unfocus deaths as a default, and "ratmen.unfocusExit: true" (or `yes' or `on) to enable it.

-V, --version
    This option prints the version of ratmen on the standard output, and then exits with an exit value of zero.

KEYSTROKES
The Up keystrokes move the selection to the next item up. The Down keystrokes move the selection to the next item down. When the selection reaches the top or bottom, it scrolls around to the other side on pressing of the appropriate keystroke. The Select keystrokes execute the command corresponding to the currently selected menu item, and exit ratmen. The Back keystrokes does nothing unless the --back option was used, in which case it will run the command specified by that option and exit ratmen. The Exit keystrokes quit ratmen without doing anything.

    Up      "k", Up_arrow, BackSpace, "-"
    Down    "j", Down_arrow, Space, Tab, "+"
    Select  "l", Right_arrow, Return
    Back    "h", Left_arrow
    Exit    "q", Escape

MOUSE SUPPORT
Ratmen implements limited support for the rodent, you may select an item (left), go to any previous menu, given by --back, (right) or abort the menu (any other; usually middle). The mouse cannot be used to scroll the menu.

Your rodent won't interfere with the normal operation. If you place the pointer on the menu by mistake, simply move it outside of the menu to restore the selection. You may, however, use the keys to manipulate an entry selected with the mouse, in this case the key based selection sticks.

Actions are performed upon releasing a mouse butten. To cancel an action after the button has been pressed, move it outside the menu window and release the button (this goes for all the buttons).

EXAMPLES
How about creating a little remote shell menu? The ratmenuish approach would be

    ratmen --label Remotes xterm "" acme "rsh acme xterm" herman "rsh herman 9term" &

and to do it the 9menu way, type something like

    ratmen --label Remotes -d: xterm "acme:rsh acme xterm" "herman:rsh herman 9term" &

to do the trick. You could also make a menu containing some nice X programs to run. Like this:

    ratmen --label "X progs" ghostview "" xdvi "" xeyes "" xneko "" &

Or like this:

    ratmen --label -d: "X progs" ghostview xdvi xeyes xneko &

That last one is a bit easier on the eyes, don't you think? If you want, you can use the --back to call an "earlier" menu, like this:

    ratmen --back ~/bin/mypreviousmenu "X Eyes" xeyes &

If you'd like to use a menu from within a shell script (a similar technique may of course be employed from any other programming language, such as perl) you could use the following:

    choice=`ratmen -pd: Abort Retry Ignore`

Now any of the options selected will be put into the environment variable `$choice' (note, though, that this may also be empty if the user cancelled the

menu). Here -p (or --print) option is used to print the selected COMMAND to standard out instead of running it, and -d (or --delimiter) is used simply to avoid having to fill out the command line with a lot of ugly "" arguments. (You could, of course, replace the colon in the command line with any character that you don't use in the menu.)

And here are some lines from my ~/.Xresources file, for those interested:

! ratmen ratmen*foreground: yellow ratmen*font: -adobe-courier-medium-r-normal-*-18-*-*-*-m-*-iso8859-1 ratmen*unfocusExit: true

This makes my menus easily distinguishable (since not much else is yellow in my system configuration), easily readable (since I like courier) and doesn't clutty my screen too much in case I happen to forget about them and go about doing something else instead of choosing and item from the menu.

SEE ALSO
/etc/X11/rgb.txt where you may find the names of appropriate colours to use with the --background and --forground options and X resources.

AUTHORS
The initial idea for this program was by Arnold Robbins, after having worked with John Mackin's GWM Blit emulation. Matty Farrow wrote a version using libXg, from which some ideas were borrowed. This code was written by David Hogan and Arnold Robbins. Rich Salz motivated the -shell option. Jonathan Walther modified this code to play nicely with the ratpoison window manager by removing handling of mouse events and iconification.

Zrajm C Akfogh <zrajm@klingonska.org> changed command line syntax into the more standard getopts, added scrolling capacity if menu is to large to fit all at once, added --delimiter, --item, --print, --scroll-offset and --unfocus-exit options and X resource support (Yay! No need to specify those longish font-thingies on the command line any more!).

The name `ratmen' is both an abbreviation of `ratmenu' (from which this program is heavily derived) and a reference to the fact that *I* don't have any religious reasons for not using the rodent (I like the keyboard, but I also like freedom of choice).

HISTORY
[2003-02-21, 12.47-16.18] Implemented `--item' for choosing initially selected item. Menu item and command is now given in the same string, separated with :, which makes for nicer error detection and lesser errors since it is a bit easier to keep track of what does which on the command line.

[2003-02-22, 15.38-16.43]

[2003-02-23, 02.19-02.36] Implemented `--delimiter' which now must be used to get the "menuitem:command" (as opposed to "menuitem" "command") behaviour. This, because I realised that when called from a script using an on-the-fly generated menu it can be quite tedious to make sure that the delimiter does not occur in the `menuitem' string (and thus fuck up the menu). Of course in handwritten menus the delimiter approach is easier to handle, hence I allow for both. Delimiter now also may be more than one character long.

[2003-02-23, 19.08-20.30] Implemented --unfocus-exit which exits the menu if it's window is unfocused.

[2003-02-23, 21.12-21.22]

[2003-02-24, 00.22-00.49]

[2003-02-24, 11.38-17.47] Now reads some options regulating appearance and behaviour from X resources in addition to the command line.

[2003-02-25, 18.47-22.20] Wrote POD. At last found a really good name for the product. The ratmen.

[2003-02-26, 01.38-09.15] Now reads command line option using getopt; thusly supports both --long-options and short ones (and bundles of short ones). Yay! Still haven't been able to get the --unfocus-exit to work properly.

[2003-02-26, 13.27-14.34] Fixxed --unfocus-exit so that it now really makes the menu die of unfocus. Unfortunately, however a `BadWindow' message is generated by X when doing so, which looks quite ugly in ratpoison (which faithfully reports the error). I simply haven't been able to figure out what command is causing this, but my best guess is that there's some unlucky X function still queued which tries to manipulate the window after it has been closed.

[2003-03-03, 00.13-01.54] Added the --print option, which can be extremely useful in scripts and other programs where you want to use a menu for some kind of input, rather than for a platform from which to fire off some program. Added "BUGS" section below. Added the --debug option which (as of now) dumps some info on the events (key/mouse clicks focusing etc.) intercepted from X.

[2003-03-08, 11.21-11.29] Added a declaration of the subroutine `strcasecmp' and thus eliminating a compiler warning. Program worked flawlessy even before (and still does) but with less annoyance for me.. =|:-) The declaration thingy was found on the 'net by googling for "strcasetmp introduction". Made arguments to --align and --style case insensetive.

[2003-03-08, 20.27-22.58] Found and killed a bug which made X resources override the command line options.

[2003-03-09, 07.04-10.15] Totally fixed the bug mentioned in previous comment. Added short options -l, ­c and -r (for left, center and right aligning of the menu text), and changed --label to --title. Also changed the size of the menu window so that it will always be an even number of text lines (looks pretty ogly when only half or a third of the last item can be seen). Opening of window could be still more optimal though (the problem still arises when X refuses to open the window with the requested height, e.g. when one uses frames in ratpoison).

[2003-03-10, 00.53-04.07] v2.0 - Optimized menu redrawing routine for the non-scrolling case (used to flicker quite nastily when moving down large menus fast). Also finally got around to add scrolling capacity for menus too large to fit all at once. Added the related --scroll-offset option and X resource as well.

[2003-03-10, 22.10-23.00] v2.0.1 - Begun fixxing window size bug (interrupted by Buffy - The Vampire Slayer).

[2003-03-11, 00.31-04.25]

[2003-03-12, 00.13-01.14] v2.0.2 - Fixed weird update/redraw bug thingy. Used to get a totally black empty menu sometimes. Bug probably introduced in last session, and now deceased.

[2003-03-19, 10.48-12.38]

[2003-03-19, 14.17-20.18] v2.1 - Wrote better handling of X resources, comlete with readable --debug output and all.

[2003-03-19, 22.40-09.05] v2.2 - Implemented mouse support. Made --item=0 special. Bugfix: Now opens a window of the correct size by telling X that it wants a window whose vertical size should be any number of pixels evenly dividable by the font height. (Rxvt served as a source of inspiration for this feature.) Also added keys Home/PgUp for going to the first item in the menu and End/PgDn to go to the last. --class now really works.

[2003-03-24, 15.41-16.32] v2.2.1 - Added options --mouse and --no-mouse and the corresponding X resource ratmen.mouse -- mouse is enabled by default. Removed the short options -u and -U (synonyms for --unfocus-exit and --no-unfocus-exit) as to not encourage the useage of those options on the command line (should be set using X resources).

[2003-03-28, 11.29-11.32] v2.2.2 - Killed bug which didn't allow spaces to be used in font names (this little bugfix also makes it quite necessary not to end your X resources in any extraneous spaces).

BUGS

o   The snazzy mode. I'm probably going to remove it sometime in the future. I don't use it and I don't see any reason why anybody else should want to either... (Especially not now that we got scrollable dreary mode..)

o   Generates a `BadWindow' when dying of unfocus under the --unfocus-exit option.

    This should be curable by means of XSetErrorHandler(), at least if it is not ratpoison causing these things.

o   Memory leaks? There are probably several (me being totally new to C) but since the execution time should never really accumulate I haven't made it a priority to kill 'em. Please tell me if you find any.

o   When using --item=0 and --style=snazzy one must press arrow down *twice* to select the first item on the menu. (I'll probably fix this by removing the `snazzy' mode.)

TODO
These are the things a want to do next in approximate order of priority:

  o configurable keys for up/down choose etc.
  o manually defined key shortcuts
  o automatically generated key shortcuts
  o multiple selection mode (space=select; enter=finalize)
    (introduce colors for marked entry and marked&selected entry)
  o incremental search in menu (using bottom item space for input)
  o replacing top/bottom item with arrow if scrollable in that direction