use getopt for option parsing

This commit is contained in:
Sascha Kruse 2011-11-14 17:12:13 +01:00
parent 9b89836e73
commit 57ba1d5ffe

164
dunst.c
View File

@ -5,6 +5,7 @@
#include <ctype.h> #include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <getopt.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
@ -516,94 +517,121 @@ show_win(void) {
int int
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
int i; int c;
now = time(&now); now = time(&now);
dc = initdc(); dc = initdc();
for(i = 1; i < argc; i++) { while(1) {
/* switches */ static struct option long_options[] = {
if(!strcmp(argv[i], "-b")) { {"help", no_argument, NULL, 'h'},
geometry.mask |= YNegative; {"fn", required_argument, NULL, 'F'},
} {"nb", required_argument, NULL, 'n'},
if(!strcmp(argv[i], "-v")) { {"nf", required_argument, NULL, 'N'},
verbose = True; {"lb", required_argument, NULL, 'l'},
} {"lf", required_argument, NULL, 'L'},
else if(!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help")) {"cb", required_argument, NULL, 'c'},
usage(EXIT_SUCCESS); {"cf", required_argument, NULL, 'C'},
{"to", required_argument, NULL, 't'},
{"lto", required_argument, NULL, '0'},
{"nto", required_argument, NULL, '1'},
{"cto", required_argument, NULL, '2'},
{"mon", required_argument, NULL, 'm'},
{"format", required_argument, NULL, 'f'},
{"key", required_argument, NULL, 'k'},
{"geometry", required_argument, NULL, 'g'},
{"mod", required_argument, NULL, 'M'},
{0,0,0,0}
};
/* options */
else if(i == argc-1) { int option_index = 0;
fprintf(stderr, "Option needs an argument\n");
usage(1); c = getopt_long_only(argc, argv, "bh", long_options, &option_index);
if(c == -1) {
break;
} }
else if(!strcmp(argv[i], "-fn"))
font = argv[++i]; switch(c)
else if(!strcmp(argv[i], "-nb")) {
normbgcolor = argv[++i]; case 0:
else if(!strcmp(argv[i], "-nf")) break;
normfgcolor = argv[++i]; case 'h':
else if(!strcmp(argv[i], "-lb")) usage(EXIT_SUCCESS);
lowbgcolor = argv[++i]; break;
else if(!strcmp(argv[i], "-lf")) case 'F':
lowfgcolor = argv[++i]; font = optarg;
else if(!strcmp(argv[i], "-cb")) break;
critbgcolor = argv[++i]; case 'n':
else if(!strcmp(argv[i], "-cf")) normbgcolor = optarg;
critfgcolor = argv[++i]; break;
else if(!strcmp(argv[i], "-to")) { case 'N':
timeouts[0] = atoi(argv[++i]); normfgcolor = optarg;
break;
case 'l':
lowbgcolor = optarg;
break;
case 'L':
lowfgcolor = optarg;
break;
case 'c':
critbgcolor = optarg;
break;
case 'C':
critfgcolor = optarg;
break;
case 't':
timeouts[0] = atoi(optarg);
timeouts[1] = timeouts[0]; timeouts[1] = timeouts[0];
} break;
else if(!strcmp(argv[i], "-lto")) case '0':
timeouts[0] = atoi(argv[++i]); timeouts[0] = atoi(optarg);
else if(!strcmp(argv[i], "-nto")) break;
timeouts[1] = atoi(argv[++i]); case '1':
else if(!strcmp(argv[i], "-cto")) timeouts[1] = atoi(optarg);
timeouts[2] = atoi(argv[++i]); break;
else if(!strcmp(argv[i], "-mon")) { case '2':
scr.scr = atoi(argv[++i]); timeouts[2] = atoi(optarg);
} break;
else if(!strcmp(argv[i], "-format")) { case 'm':
format = argv[++i]; scr.scr = atoi(optarg);
} break;
else if(!strcmp(argv[i], "-key")) { case 'f':
key = XStringToKeysym(argv[i+1]); format = optarg;
if(key == NoSymbol) { break;
fprintf(stderr, "Unable to grab key: %s.\n", argv[i+1]); case 'k':
exit(EXIT_FAILURE); key = XStringToKeysym(optarg);
} break;
i++; case 'g':
} geometry.mask = XParseGeometry(optarg,
else if(!strcmp(argv[i], "-geometry")) { &geometry.x, &geometry.y,
geometry.mask = XParseGeometry(argv[++i], &geometry.x, &geometry.y, &geometry.w, &geometry.h); &geometry.w, &geometry.h);
} break;
else if(!strcmp(argv[i], "-mod")) { case 'M':
if(!strcmp(argv[i+1], "ctrl")) { if(!strcmp(optarg, "ctrl")) {
mask |= ControlMask; mask |= ControlMask;
} }
else if(!strcmp(argv[i+1], "shift")) { else if(!strcmp(optarg, "mod1")) {
mask |= ShiftMask;
}
else if(!strcmp(argv[i+1], "mod1")) {
mask |= Mod1Mask; mask |= Mod1Mask;
} }
else if(!strcmp(argv[i+1], "mod2")) { else if(!strcmp(optarg, "mod2")) {
mask |= Mod2Mask; mask |= Mod2Mask;
} }
else if(!strcmp(argv[i+1], "mod3")) { else if(!strcmp(optarg, "mod3")) {
mask |= Mod3Mask; mask |= Mod3Mask;
} }
else if(!strcmp(argv[i+1], "mod4")) { else if(!strcmp(optarg, "mod4")) {
mask |= Mod4Mask; mask |= Mod4Mask;
} else { } else {
fprintf(stderr, "Unable to find mask: %s\n", argv[i+1]); fprintf(stderr, "Unable to find mask: %s\n", optarg);
fprintf(stderr, "See manpage for list of available masks\n"); fprintf(stderr, "See manpage for list of available masks\n");
} }
i++; break;
} default:
else
usage(EXIT_FAILURE); usage(EXIT_FAILURE);
break;
}
} }
initdbus(); initdbus();