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
.
Response:
text/plain