iAdding ARGBEGIN for flexible parameter handling and fixing the manpage. - thingmenu - A simple graphical menu launcher for X11. Err bitreich.org 70 hgit clone git://bitreich.org/thingmenu URL:git://bitreich.org/thingmenu bitreich.org 70 1Log /scm/thingmenu/log.gph bitreich.org 70 1Files /scm/thingmenu/files.gph bitreich.org 70 1Refs /scm/thingmenu/refs.gph bitreich.org 70 1Tags /scm/thingmenu/tag bitreich.org 70 1LICENSE /scm/thingmenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit e54f54c03160ab7e6615e15f9ee0984ab5d2e9dc /scm/thingmenu/commit/e54f54c03160ab7e6615e15f9ee0984ab5d2e9dc.gph bitreich.org 70 1parent 0255257e75f6f3820d695394eb80cd20dcf78e78 /scm/thingmenu/commit/0255257e75f6f3820d695394eb80cd20dcf78e78.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Sat, 4 Aug 2012 22:30:22 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdding ARGBEGIN for flexible parameter handling and fixing the manpage. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A arg.h | 41 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M thingmenu.1 | 11 ++++------- Err bitreich.org 70 i M thingmenu.c | 113 +++++++++++++------------------ Err bitreich.org 70 i Err bitreich.org 70 i3 files changed, 91 insertions(+), 74 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/arg.h b/arg.h /scm/thingmenu/file/arg.h.gph bitreich.org 70 i@@ -0,0 +1,41 @@ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Copy me if you can. Err bitreich.org 70 i+ * by 20h Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ Err bitreich.org 70 i+#ifndef __ARG_H__ Err bitreich.org 70 i+#define __ARG_H__ Err bitreich.org 70 i+ Err bitreich.org 70 i+extern char *argv0; Err bitreich.org 70 i+ Err bitreich.org 70 i+#define USED(x) ((void)(x)) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ Err bitreich.org 70 i+ argv[0] && argv[0][1]\ Err bitreich.org 70 i+ && argv[0][0] == '-';\ Err bitreich.org 70 i+ argc--, argv++) {\ Err bitreich.org 70 i+ char _argc;\ Err bitreich.org 70 i+ char **_argv;\ Err bitreich.org 70 i+ if (argv[0][1] == '-' && argv[0][2] == '\0') {\ Err bitreich.org 70 i+ argv++;\ Err bitreich.org 70 i+ argc--;\ Err bitreich.org 70 i+ break;\ Err bitreich.org 70 i+ }\ Err bitreich.org 70 i+ for (argv[0]++, _argv = argv; argv[0][0];\ Err bitreich.org 70 i+ argv[0]++) {\ Err bitreich.org 70 i+ if (_argv != argv)\ Err bitreich.org 70 i+ break;\ Err bitreich.org 70 i+ _argc = argv[0][0];\ Err bitreich.org 70 i+ switch (_argc) Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ARGEND }\ Err bitreich.org 70 i+ USED(_argc);\ Err bitreich.org 70 i+ }\ Err bitreich.org 70 i+ USED(argv);\ Err bitreich.org 70 i+ USED(argc); Err bitreich.org 70 i+ Err bitreich.org 70 i+#define EARGF(x) ((argv[1] == NULL)? ((x), abort(), (char *)0) :\ Err bitreich.org 70 i+ (argc--, argv++, argv[0])) Err bitreich.org 70 i+ Err bitreich.org 70 i+#endif Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/thingmenu.1 b/thingmenu.1 /scm/thingmenu/file/thingmenu.1.gph bitreich.org 70 i@@ -13,8 +13,8 @@ Err bitreich.org 70 i .Op Fl s Err bitreich.org 70 i .Op Fl o Err bitreich.org 70 i .Op Fl g Ar geometry Err bitreich.org 70 i-.Op Fl ws Ar widthscaling Err bitreich.org 70 i-.Op Fl hs Ar heightscaling Err bitreich.org 70 i+.Op Fl w Ar widthscaling Err bitreich.org 70 i+.Op Fl e Ar heightscaling Err bitreich.org 70 i .Op Fl - Err bitreich.org 70 i .Ar label0 cmd0 [label1 cmd1 ...] Err bitreich.org 70 i .Ek Err bitreich.org 70 i@@ -49,7 +49,6 @@ options and default settings. Err bitreich.org 70 i Do not append a Err bitreich.org 70 i .Qq "Cancel" Err bitreich.org 70 i menu item. Err bitreich.org 70 i-. Err bitreich.org 70 i .Bd -filled Err bitreich.org 70 i .It Fl s Err bitreich.org 70 i Disable the oneshot behaviour. After one button click Err bitreich.org 70 i@@ -66,10 +65,10 @@ Use the horizontal layout. Err bitreich.org 70 i .It Fl g Err bitreich.org 70 i Define the X11 geometry string, which is to be used. Err bitreich.org 70 i . Err bitreich.org 70 i-.It Fl ws Err bitreich.org 70 i+.It Fl w Err bitreich.org 70 i Define the width scaling. Err bitreich.org 70 i . Err bitreich.org 70 i-.It Fl hs Err bitreich.org 70 i+.It Fl e Err bitreich.org 70 i Define the height scaling. Err bitreich.org 70 i . Err bitreich.org 70 i .El Err bitreich.org 70 i@@ -91,7 +90,6 @@ After that the menu will not exit (-s). Err bitreich.org 70 i .Ed Err bitreich.org 70 i .Bd -literal Err bitreich.org 70 i % thingmenu -s -ww 300 -- "Reboot now" reboot Err bitreich.org 70 i- Err bitreich.org 70 i .Ed Err bitreich.org 70 i .Bd -filled Err bitreich.org 70 i This will create a centered menu, which is aligned based on the length of the Err bitreich.org 70 i@@ -99,7 +97,6 @@ label texts. After the first clicked entry it will exit. Err bitreich.org 70 i .Ed Err bitreich.org 70 i .Bd -literal Err bitreich.org 70 i % thingmenu "Force reboot" "reboot -f" Shutdown shutdown Err bitreich.org 70 i- Err bitreich.org 70 i .Ed Err bitreich.org 70 i .Bd -filled Err bitreich.org 70 i An example how to create multi-level menus is shown in the thingmenu-menu.sh Err bitreich.org 70 1diff --git a/thingmenu.c b/thingmenu.c /scm/thingmenu/file/thingmenu.c.gph bitreich.org 70 i@@ -106,6 +106,10 @@ int nentries = 0; Err bitreich.org 70 i int oneshot = 1; Err bitreich.org 70 i Bool ispressing = 0; Err bitreich.org 70 i Err bitreich.org 70 i+char *argv0; Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "arg.h" Err bitreich.org 70 i+ Err bitreich.org 70 i /* configuration, allows nested code to access above variables */ Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i Err bitreich.org 70 i@@ -594,10 +598,10 @@ updateentries(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-usage(char *argv0) Err bitreich.org 70 i+usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "usage: %s [-hxso] [-g geometry] [-ws widthscaling] " Err bitreich.org 70 i- "[-hs heightscaling] [--] " Err bitreich.org 70 i+ fprintf(stderr, "usage: %s [-hxso] [-g geometry] [-w widthscaling] " Err bitreich.org 70 i+ "[-e heightscaling] [--] " Err bitreich.org 70 i "label0 cmd0 [label1 cmd1 ...]\n", argv0); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -610,74 +614,49 @@ main(int argc, char *argv[]) Err bitreich.org 70 i int i, xr, yr, bitm; Err bitreich.org 70 i unsigned int wr, hr; Err bitreich.org 70 i Err bitreich.org 70 i+ argv0 = argv[0]; Err bitreich.org 70 i Err bitreich.org 70 i addexit = True; Err bitreich.org 70 i Err bitreich.org 70 i if (argc < 2) Err bitreich.org 70 i- usage(argv[0]); Err bitreich.org 70 i- i = 1; Err bitreich.org 70 i- for (; argv[i]; i++) { Err bitreich.org 70 i- if (argv[i][0] != '-') Err bitreich.org 70 i- break; Err bitreich.org 70 i- if (argv[i][1] == '-') { Err bitreich.org 70 i- i++; Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- switch (argv[i][1]) { Err bitreich.org 70 i- case 'g': Err bitreich.org 70 i- if (i >= argc - 1) Err bitreich.org 70 i- break; Err bitreich.org 70 i- bitm = XParseGeometry(argv[i+1], &xr, &yr, &wr, &hr); Err bitreich.org 70 i- if (bitm & XValue) Err bitreich.org 70 i- wx = xr; Err bitreich.org 70 i- if (bitm & YValue) Err bitreich.org 70 i- wy = yr; Err bitreich.org 70 i- if (bitm & WidthValue) Err bitreich.org 70 i- ww = (int)wr; Err bitreich.org 70 i- if (bitm & HeightValue) Err bitreich.org 70 i- wh = (int)hr; Err bitreich.org 70 i- if (bitm & XNegative && wx == 0) Err bitreich.org 70 i- wx = -1; Err bitreich.org 70 i- if (bitm & YNegative && wy == 0) Err bitreich.org 70 i- wy = -1; Err bitreich.org 70 i- i++; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'h': Err bitreich.org 70 i- switch ((i >= argc - 1)? 0 : argv[i][2]) { Err bitreich.org 70 i- case 's': Err bitreich.org 70 i- heightscaling = atof(argv[i+1]); Err bitreich.org 70 i- i++; Err bitreich.org 70 i- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- usage(argv[0]); Err bitreich.org 70 i- } Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'o': Err bitreich.org 70 i- horizontal = True; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 's': Err bitreich.org 70 i- oneshot = 0; Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'w': Err bitreich.org 70 i- switch ((i >= argc - 1)? 0 : argv[i][2]) { Err bitreich.org 70 i- case 's': Err bitreich.org 70 i- widthscaling = atof(argv[i+1]); Err bitreich.org 70 i- i++; Err bitreich.org 70 i- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- usage(argv[0]); Err bitreich.org 70 i- } Err bitreich.org 70 i- break; Err bitreich.org 70 i- case 'x': Err bitreich.org 70 i- addexit = False; Err bitreich.org 70 i- break; Err bitreich.org 70 i- default: Err bitreich.org 70 i- usage(argv[0]); Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ARGBEGIN { Err bitreich.org 70 i+ case 'g': Err bitreich.org 70 i+ bitm = XParseGeometry(EARGF(usage()), &xr, &yr, &wr, &hr); Err bitreich.org 70 i+ if (bitm & XValue) Err bitreich.org 70 i+ wx = xr; Err bitreich.org 70 i+ if (bitm & YValue) Err bitreich.org 70 i+ wy = yr; Err bitreich.org 70 i+ if (bitm & WidthValue) Err bitreich.org 70 i+ ww = (int)wr; Err bitreich.org 70 i+ if (bitm & HeightValue) Err bitreich.org 70 i+ wh = (int)hr; Err bitreich.org 70 i+ if (bitm & XNegative && wx == 0) Err bitreich.org 70 i+ wx = -1; Err bitreich.org 70 i+ if (bitm & YNegative && wy == 0) Err bitreich.org 70 i+ wy = -1; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'e': Err bitreich.org 70 i+ heightscaling = atof(EARGF(usage())); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'o': Err bitreich.org 70 i+ horizontal = True; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 's': Err bitreich.org 70 i+ oneshot = 0; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'w': Err bitreich.org 70 i+ widthscaling = atof(EARGF(usage())); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ case 'x': Err bitreich.org 70 i+ addexit = False; Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ default: Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i+ } ARGEND; Err bitreich.org 70 i Err bitreich.org 70 i- for (; argv[i]; i++) { Err bitreich.org 70 i+ for (i = 0; argv[i]; i++) { Err bitreich.org 70 i label = argv[i]; Err bitreich.org 70 i if (!argv[i+1]) Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -696,7 +675,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i die("strdup returned NULL\n"); Err bitreich.org 70 i } Err bitreich.org 70 i if (nentries < 1) Err bitreich.org 70 i- usage(argv[0]); Err bitreich.org 70 i+ usage(); Err bitreich.org 70 i Err bitreich.org 70 i if (addexit) { Err bitreich.org 70 i entries = realloc(entries, sizeof(entries[0])*(++nentries)); Err bitreich.org 70 .