diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 22:12:44 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 22:12:44 +0300 |
commit | 06972a357983a4686dc37a2aa5a8b0bfd2dd4e7e (patch) | |
tree | f7bf0ed9b43250b5560e684cde5efd82ac0841e9 /client | |
parent | 01ff5f48edde73364d8f4b11f4f5480c8cc86789 (diff) | |
download | bemenu-06972a357983a4686dc37a2aa5a8b0bfd2dd4e7e.tar.gz bemenu-06972a357983a4686dc37a2aa5a8b0bfd2dd4e7e.tar.bz2 bemenu-06972a357983a4686dc37a2aa5a8b0bfd2dd4e7e.zip |
CLI interface, aka option parsing.
Diffstat (limited to 'client')
-rw-r--r-- | client/client.c | 142 |
1 files changed, 140 insertions, 2 deletions
diff --git a/client/client.c b/client/client.c index 2f95d52..fb94ea5 100644 --- a/client/client.c +++ b/client/client.c @@ -3,6 +3,140 @@ #include <string.h> #include <assert.h> #include <bemenu.h> +#include <getopt.h> + +static struct { + bmFilterMode filterMode; + int wrap; + unsigned int lines; + const char *title; + int selected; + int bottom; + int grab; + int monitor; +} client = { + BM_FILTER_MODE_DMENU, /* filterMode */ + 0, /* wrap */ + 0, /* lines */ + "bemenu", /* title */ + 0, /* selected */ + 0, /* bottom */ + 0, /* grab */ + 0 /* monitor */ +}; + +static void printVersion(const char *name) +{ + char *base = strrchr(name, '/'); + printf("%s v%s\n", (base ? base + 1 : name), bmVersion()); + puts("<o/ \e[5mDISCO\e[m"); +} + +static void usage(FILE *out, const char *name) +{ + char *base = strrchr(name, '/'); + fprintf(out, "usage: %s [options]\n", (base ? base + 1 : name)); + fputs("Options\n" + " -h, --help display this help and exit.\n" + " -v, --version display version.\n" + " -i, --ignorecase match items case insensitively.\n" + " -w, --wrap wraps cursor selection.\n" + " -l, --list list items vertically with the given number of lines.\n" + " -p, --prompt defines the prompt text to be displayed.\n" + " -I, --index select item at index automatically.\n\n" + + "Backend specific options\n" + " c = ncurses\n" // x == x11 + " (...) At end of help indicates the backend support for option.\n\n" + + " -b, --bottom appears at the bottom of the screen. ()\n" + " -f, --grab grabs the keyboard before reading stdin. ()\n" + " -m, --monitor index of monitor where menu will appear. ()\n" + " -fn, --fn defines the font to be used. ()\n" + " -nb, --nb defines the normal background color. ()\n" + " -nf, --nf defines the normal foreground color. ()\n" + " -sb, --sb defines the selected background color. ()\n" + " -sf, --sf defines the selected foreground color. ()\n" + + + , out); + exit((out == stderr ? EXIT_FAILURE : EXIT_SUCCESS)); +} + +static void parseArgs(int *argc, char **argv[]) +{ + static const struct option opts[] = { + { "help", no_argument, 0, 'h' }, + { "version", no_argument, 0, 'v' }, + + { "ignorecase", no_argument, 0, 'i' }, + { "wrap", no_argument, 0, 'w' }, + { "list", required_argument, 0, 'l' }, + { "prompt", required_argument, 0, 'p' }, + { "index", required_argument, 0, 'I' }, + + { "bottom", no_argument, 0, 'b' }, + { "grab", no_argument, 0, 'f' }, + { "monitor", required_argument, 0, 'm' }, + { "fn", required_argument, 0, 0x100 }, + { "nb", required_argument, 0, 0x101 }, + { "nf", required_argument, 0, 0x102 }, + { "sb", required_argument, 0, 0x103 }, + { "sf", required_argument, 0, 0x104 }, + { 0, 0, 0, 0 } + }; + + for (;;) { + int opt = getopt_long(*argc, *argv, "hviw:I:p:Ibf:m", opts, NULL); + if (opt < 0) + break; + + switch (opt) { + case 'h': + usage(stdout, *argv[0]); + break; + case 'v': + printVersion(*argv[0]); + exit(EXIT_SUCCESS); + + case 'i': + client.filterMode = BM_FILTER_MODE_DMENU_CASE_INSENSITIVE; + break; + case 'w': + client.wrap = 1; + break; + case 'l': + client.lines = strtol(optarg, NULL, 10); + break; + case 'p': + client.title = optarg; + break; + case 'I': + client.selected = strtol(optarg, NULL, 10); + break; + + case 'b': + client.bottom = 1; + break; + case 'f': + client.grab = 1; + break; + case 'm': + client.monitor = strtol(optarg, NULL, 10); + break; + + case 0x100: + case 0x101: + case 0x102: + case 0x103: + case 0x104: + break; + } + } + + *argc -= optind; + *argv += optind; +} static void readItemsToMenuFromStdin(bmMenu *menu) { @@ -44,15 +178,19 @@ static void readItemsToMenuFromStdin(bmMenu *menu) int main(int argc, char **argv) { - (void)argc, (void)argv; + parseArgs(&argc, &argv); bmMenu *menu = bmMenuNew(BM_DRAW_MODE_CURSES); if (!menu) return EXIT_FAILURE; - bmMenuSetTitle(menu, "bemenu"); + bmMenuSetTitle(menu, client.title); + bmMenuSetFilterMode(menu, client.filterMode); + readItemsToMenuFromStdin(menu); + bmMenuSetHighlightedIndex(menu, client.selected); + bmKey key; unsigned int unicode; int status = 0; |