--- /dev/null
+.TH PROG 1
+.SH NAME
+xmenu \- menu utility for X
+.SH SYNOPSIS
+.B xmenu
+.RB [ \-w ]
+.SH DESCRIPTION
+.B xmenu
+is a menu for X,
+it reads a list of newline-separated items from stdin,
+shows a menu for the user to select one of the items,
+and outputs the item selected to stdout.
+.PP
+The options are as follows:
+.TP
+.B -w
+Asks the window manager to draw a border around the menus.
+Without this options, the menus do not have border drawn by the window manager.
+.PP
+Each item read from stdin has the following format:
+.IP
+.EX
+ITEM := TABS LABEL TABS COMMAND NEWLINE
+.EE
+.PP
+That means, each item is composed by
+tabs, followed by a label, followed by more tabs, followed by a command,
+and ended by a newline.
+.IP
+The initial tabs indicate the menu hierarchy:
+items indented with a tab is shown in a submenu of the preceding item not indented.
+.IP
+The label is the string that will be shown as a item in the menu.
+An item without label is considered a separator and is drawn as a thin line in the menu
+separating the item above from the item below.
+.IP
+The command is the string that will be output after selecting the item.
+.IP
+The newline terminates the item specification.
+.SH EXAMPLES
+The following is an script exemplifying the use
+.BR xmenu .
+The output is redirected to xargs to make a command to be run by the shell.
+.IP
+.EX
+#!/bin/sh
+
+cat <<EOF | ./xmenu | xargs sh -c
+Applications
+ Web Browser firefox
+ Image editor gimp
+Terminal (xterm) xterm
+Terminal (urxvt) urxvt
+Terminal (st) st
+
+Shutdown poweroff
+Reboot reboot
+EOF
+.EE
+.PP
+For example, by selecting \(lqApplications\(rq, a new menu will appear.
+Selecting \(lqWeb Browser\(rq in the new menu will open firefox.
+.SH SEE ALSO
+.IR dmenu (1),
+.IR 9menu (1),
+.IR thingmenu (1)
static void parsestdin(void);
static void run(void);
static void freewindow(struct Menu *menu);
-static void cleanupexit(void);
+static void cleanup(void);
static void usage(void);
/* X variables */
/* run event loop */
run();
- return 1; /* UNREACHABLE */
+ cleanup();
+
+ return 0;
}
/* get color from color string */
struct Item *previtem = NULL;
XEvent ev;
- setcurrmenu(rootmenu);
-
while (!XNextEvent(dpy, &ev)) {
switch(ev.type) {
case Expose:
setcurrmenu(item->submenu);
} else {
printf("%s\n", item->output);
- cleanupexit();
+ return;
}
drawmenu();
} else {
- cleanupexit();
+ return;
}
break;
case LeaveNotify:
/* cleanup and exit */
static void
-cleanupexit(void)
+cleanup(void)
{
freewindow(rootmenu);
XFreeFont(dpy, dc.font);
XFreeGC(dpy, dc.gc);
XCloseDisplay(dpy);
- exit(0);
}
/* show usage */
static void
usage(void)
{
- (void)fprintf(stderr, "usage: xmenu [-w] menuname\n");
+ (void)fprintf(stderr, "usage: xmenu [-w]\n");
exit(1);
}