void readargs(int argc, char *argv[]) { int i = 0; int j = 0; int cxrdb = 0; int hxrdb = 0; // check if we should load the xrdb/config, because it needs to be loaded before arguments are checked (internal -> xresources -> arguments) for (j = 1; j < argc; j++) { if (!strcmp(argv[j], "-xrdb")) { xresources = 1; } else if (!strcmp(argv[j], "-nxrdb")) { xresources = 0; } else if (!strcmp(argv[j], "-lcfg")) { loadconfig = 1; } else if (!strcmp(argv[j], "-ncfg")) { loadconfig = 0; } } // init/read xrdb if (xresources) { XrmInitialize(); if (loadconfig) { cxrdb = system("[ -e $HOME/.config/spmenu/spmenurc ] && xrdb -override $HOME/.config/spmenu/spmenurc"); hxrdb = system("[ -e $HOME/.spmenurc ] && xrdb -override $HOME/.spmenurc"); } // avoid an annoying warning gcc will spit out when you don't care about the result if (!cxrdb || !hxrdb || cxrdb || hxrdb || xresources) load_xresources(); } // no arguments for (i = 1; i < argc; i++) if (!strcmp(argv[i], "-v")) { // prints version information puts("spmenu-"VERSION); exit(0); } else if (!strcmp(argv[i], "-h")) { // help usage(); } else if (!strcmp(argv[i], "-it")) { // image: top imageposition = 0; } else if (!strcmp(argv[i], "-ib")) { // image: bottom imageposition = 1; } else if (!strcmp(argv[i], "-ic")) { // image: center imageposition = 2; } else if (!strcmp(argv[i], "-itc")) { // image: top center imageposition = 3; } else if (!strcmp(argv[i], "-b")) { // appears at the bottom of the screen menuposition = 0; } else if (!strcmp(argv[i], "-t")) { // appears at the top of the screen menuposition = 1; } else if (!strcmp(argv[i], "-c")) { // appears at the center of the screen menuposition = 2; } else if (!strcmp(argv[i], "-nm")) { // normal mode mode = 0; } else if (!strcmp(argv[i], "-im")) { // insert mode mode = 1; } else if (!strcmp(argv[i], "-f")) { // grabs keyboard before reading stdin fast = 1; } else if (!strcmp(argv[i], "-rw")) { // relative width accuratewidth = 1; } else if (!strcmp(argv[i], "-nrw")) { // no relative width accuratewidth = 0; } else if (!strcmp(argv[i], "-xrdb")) { // xresources xresources = 1; } else if (!strcmp(argv[i], "-nxrdb")) { // no xresources xresources = 0; } else if (!strcmp(argv[i], "-F")) { // fuzzy matching fuzzy = 0; } else if (!strcmp(argv[i], "-s")) { // case-sensitive item matching casesensitive = 1; } else if (!strcmp(argv[i], "-ns")) { // case-insensitive item matching casesensitive = 0; } else if (!strcmp(argv[i], "-S")) { // don't sort sortmatches = 0; } else if (!strcmp(argv[i], "-nso")) { // don't sort sortmatches = 0; } else if (!strcmp(argv[i], "-so")) { // don't sort sortmatches = 1; } else if (!strcmp(argv[i], "-gc")) { // generate image cache generatecache = 1; } else if (!strcmp(argv[i], "-ngc")) { // don't generate image cache generatecache = 0; } else if (!strcmp(argv[i], "-wm")) { // display as managed wm window managed = 1; } else if (!strcmp(argv[i], "-nwm")) { // don't display as managed wm window managed = 0; } else if (!strcmp(argv[i], "-na")) { // disable alpha alpha = 0; } else if (!strcmp(argv[i], "-a")) { // alpha alpha = 1; } else if (!strcmp(argv[i], "-tp")) { // allow the user to type type = 1; } else if (!strcmp(argv[i], "-nt")) { // don't allow the user to type type = 0; } else if (!strcmp(argv[i], "-P")) { // is the input a password passwd = 1; } else if (!strcmp(argv[i], "-hmc")) { // hide match count hidematchcount = 1; } else if (!strcmp(argv[i], "-smc")) { // don't hide match count hidematchcount = 0; } else if (!strcmp(argv[i], "-hm")) { // hide mode indicator hidemode = 1; } else if (!strcmp(argv[i], "-sm")) { // don't hide mode indicator hidemode = 0; } else if (!strcmp(argv[i], "-hla")) { // hide left arrow hidelarrow = 1; } else if (!strcmp(argv[i], "-sla")) { // don't hide left arrow hidelarrow = 0; } else if (!strcmp(argv[i], "-hra")) { // hide right arrow hiderarrow = 1; } else if (!strcmp(argv[i], "-sra")) { // don't hide right arrow hiderarrow = 0; } else if (!strcmp(argv[i], "-hpr")) { // hide prompt hideprompt = 1; } else if (!strcmp(argv[i], "-spr")) { // don't hide prompt hideprompt = 0; } else if (!strcmp(argv[i], "-hc")) { // hide cursor hidecursor = 1; } else if (!strcmp(argv[i], "-sc")) { // don't hide cursor hidecursor = 0; } else if (!strcmp(argv[i], "-hhl")) { // hide highlighting hidehighlight = 1; } else if (!strcmp(argv[i], "-shl")) { // don't hide highlighting hidehighlight = 0; } else if (!strcmp(argv[i], "-hi")) { // hide image hideimage = 1; } else if (!strcmp(argv[i], "-si")) { // don't hide image hideimage = 0; } else if (!strcmp(argv[i], "-ip")) { // indent to prompt width indentitems = 1; } else if (!strcmp(argv[i], "-nip")) { // don't indent to prompt width indentitems = 0; } else if (i + 1 == argc) { int arg = i; int pr = 1; if (strcmp(argv[i-1], "-xrdb") || strcmp(argv[i-1], "-nxrdb") || strcmp(argv[i-1], "-lcfg") || strcmp(argv[i-1], "-ncfg") ) pr = 0; if (arg != 1 && pr) fprintf(stderr, "spmenu: The '%s' option requires an argument.\n", argv[i-1]); else if (pr) fprintf(stderr, "spmenu: Invalid argument: '%s'\n", argv[i]); // dmenu compatibility arguments } else if (!strcmp(argv[i], "-i")) { // case-insensitive item matching, for compatibility reasons casesensitive = 0; // these options take one argument } else if (!strcmp(argv[i], "-g")) { // number of columns in grid columns = atoi(argv[++i]); if (lines == 0) lines = 1; } else if (!strcmp(argv[i], "-Ps")) { // password symbol password = argv[++i]; } else if (!strcmp(argv[i], "-l")) { // number of lines in grid lines = atoi(argv[++i]); } else if (!strcmp(argv[i], "-mh")) { // minimum height of one menu line lineheight += atoi(argv[++i]); if (columns == 0) columns = 1; } else if (!strcmp(argv[i], "-lp")) { // vertical padding menupaddingv = atoi(argv[++i]); } else if (!strcmp(argv[i], "-hp")) { // horizontal padding menupaddingh = atoi(argv[++i]); } else if (!strcmp(argv[i], "-pri")) { // high priority (csv) hpitems = tokenize(argv[++i], ",", &hplength); } else if (!strcmp(argv[i], "-ig")) { // gaps between image imagegaps = atoi(argv[++i]); } else if (!strcmp(argv[i], "-la")) { // left arrow symbol leftarrow = argv[++i]; } else if (!strcmp(argv[i], "-ra")) { // right arrow symbol rightarrow = argv[++i]; } else if (!strcmp(argv[i], "-m")) // monitor mon = atoi(argv[++i]); else if (!strcmp(argv[i], "-bw")) { // border width borderwidth = atoi(argv[++i]); } else if (!strcmp(argv[i], "-H")) // hist file location histfile = argv[++i]; else if (!strcmp(argv[i], "-x")) // window x offset dmx = atoi(argv[++i]); else if (!strcmp(argv[i], "-y")) // window y offset (from bottom up if -b) dmy = atoi(argv[++i]); else if (!strcmp(argv[i], "-z")) // make spmenu this wide dmw = atoi(argv[++i]); else if (!strcmp(argv[i], "-p")) // adds prompt to left of input field prompt = argv[++i]; else if (!strcmp(argv[i], "-fn")) // font or font set fonts[0] = argv[++i]; else if (!strcmp(argv[i], "-nmt")) // normal mode text strcpy(normtext, argv[++i]); else if (!strcmp(argv[i], "-imt")) { // insert mode text strcpy(instext, argv[++i]); // dmenu compatibility options } else if (!strcmp(argv[i], "-nb")) { // normal background color colors[SchemeItemNorm][ColBg] = argv[++i]; colors[SchemeMenu][ColBg] = argv[++i]; colors[SchemeInput][ColBg] = argv[++i]; colors[SchemePrompt][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-nf")) { // normal foreground color colors[SchemeItemNorm][ColFg] = argv[++i]; colors[SchemeMenu][ColFg] = argv[++i]; colors[SchemeInput][ColFg] = argv[++i]; colors[SchemePrompt][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-sb")) { // selected background color colors[SchemeItemSel][ColBg] = argv[++i]; colors[SchemeMenu][ColBg] = argv[++i]; colors[SchemeInput][ColBg] = argv[++i]; colors[SchemePrompt][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-sf")) { // selected foreground color colors[SchemeItemSel][ColFg] = argv[++i]; colors[SchemeMenu][ColFg] = argv[++i]; colors[SchemeInput][ColBg] = argv[++i]; colors[SchemePrompt][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-is")) { // image size char buf[255]; memset(buf, 0, sizeof(buf)); memcpy(buf, argv[++i], sizeof(buf)-1); if(sscanf(buf, "%dx%d", &imagewidth, &imageheight) == 1) imageheight = imagewidth; } else if (!strcmp(argv[i], "-w")) { // embedding window id embed = argv[++i]; } else if (!strcmp(argv[i], "-n")) { // preselected item preselected = atoi(argv[++i]); // spmenu colors } else if (!strcmp(argv[i], "-nif")) { // normal item foreground color colors[SchemeItemNorm][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-nib")) { // normal item background color colors[SchemeItemNorm][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-sif")) { // selected item foreground color colors[SchemeItemSel][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-sib")) { // selected item background color colors[SchemeItemSel][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-npf")) { // normal item priority foreground color colors[SchemeItemNormPri][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-npb")) { // normal item priority background color colors[SchemeItemNormPri][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-spf")) { // selected item priority foreground color colors[SchemeItemSelPri][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-spb")) { // selected item priority background color colors[SchemeItemSelPri][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-mbg")) { // menu color colors[SchemeMenu][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-pfg")) { // prompt fg color colors[SchemePrompt][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-pbg")) { // prompt bg color colors[SchemePrompt][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-ifg")) { // input fg color colors[SchemeInput][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-pfg")) { // input bg color colors[SchemeInput][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-shf")) { // selected highlight foreground color colors[SchemeSelHighlight][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-shf")) { // selected highlight foreground color colors[SchemeSelHighlight][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-nhf")) { // normal highlight foreground color colors[SchemeNormHighlight][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-shb")) { // selected highlight foreground color colors[SchemeSelHighlight][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-nhb")) { // normal highlight foreground color colors[SchemeNormHighlight][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-nbg")) { // numbgcolor colors[SchemeNumber][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-nfg")) { // numfgcolor colors[SchemeNumber][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-mbg")) { // mode colors[SchemeMode][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-mfg")) { // mode colors[SchemeMode][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-laf")) { // left arrow fg colors[SchemeLArrow][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-raf")) { // right arrow fg colors[SchemeRArrow][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-lab")) { // left arrow bg colors[SchemeLArrow][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-rab")) { // right arrow bg colors[SchemeRArrow][ColFg] = argv[++i]; } else if (!strcmp(argv[i], "-bc")) { // border colors[SchemeBorder][ColBg] = argv[++i]; } else if (!strcmp(argv[i], "-cc")) // caret color colors[SchemeCaret][ColFg] = argv[++i]; // sgr colors else if (!strcmp(argv[i], "-sgr0")) textcolors[0] = argv[++i]; // sgr color 0 else if (!strcmp(argv[i], "-sgr1")) textcolors[1] = argv[++i]; // sgr color 1 else if (!strcmp(argv[i], "-sgr2")) textcolors[2] = argv[++i]; // sgr color 2 else if (!strcmp(argv[i], "-sgr3")) textcolors[3] = argv[++i]; // sgr color 3 else if (!strcmp(argv[i], "-sgr4")) textcolors[4] = argv[++i]; // sgr color 4 else if (!strcmp(argv[i], "-sgr5")) textcolors[5] = argv[++i]; // sgr color 5 else if (!strcmp(argv[i], "-sgr6")) textcolors[6] = argv[++i]; // sgr color 6 else if (!strcmp(argv[i], "-sgr7")) textcolors[7] = argv[++i]; // sgr color 7 else if (!strcmp(argv[i], "-sgr8")) textcolors[8] = argv[++i]; // sgr color 8 else if (!strcmp(argv[i], "-sgr9")) textcolors[9] = argv[++i]; // sgr color 9 else if (!strcmp(argv[i], "-sgr10")) textcolors[10] = argv[++i]; // sgr color 10 else if (!strcmp(argv[i], "-sgr11")) textcolors[11] = argv[++i]; // sgr color 11 else if (!strcmp(argv[i], "-sgr12")) textcolors[12] = argv[++i]; // sgr color 12 else if (!strcmp(argv[i], "-sgr13")) textcolors[13] = argv[++i]; // sgr color 13 else if (!strcmp(argv[i], "-sgr14")) textcolors[14] = argv[++i]; // sgr color 14 else if (!strcmp(argv[i], "-sgr15")) textcolors[15] = argv[++i]; // sgr color 15 else fprintf(stderr, "spmenu: Invalid argument: '%s'\n", argv[i]); if (casesensitive) { fstrncmp = strncmp; fstrstr = strstr; } else { fstrncmp = strncasecmp; fstrstr = cistrstr; } } void usage(void) { fputs("spmenu: dynamic menu\n\n" "- Arguments -\n" "spmenu -l Set line count to stdin\n" "spmenu -mh Set spmenu line height to \n" "spmenu -g Set the number of grids to \n" "spmenu -gc Generate image cache\n" "spmenu -ngc Don't generate image cache\n" "spmenu -rw Enable relative input width\n" "spmenu -nrw Disable relative input width\n" "spmenu -f Grabs keyboard before reading stdin\n" "spmenu -F Enable fuzzy matching\n" "spmenu -P Hide characters\n" "spmenu -Ps Set the password symbol to \n" "spmenu -p Set spmenu prompt text to \n" "spmenu -ip Indent items to prompt width\n" "spmenu -nip Don't indent items to prompt width\n" "spmenu -a Enable alpha\n" "spmenu -na Disable alpha\n" "spmenu -tp Allow the user to type\n" "spmenu -nt Don't allow typing, the user must select an option\n" "spmenu -x Offset spmenu x position by \n" "spmenu -y Offset spmenu y position by \n" "spmenu -n Preselect in the list of items\n" "spmenu -z Width of the spmenu window\n" "spmenu -nmt Set normal mode text to \n" "spmenu -imt Set insert mode text to \n" "spmenu -bw Width of the border. 0 will disable the border\n" "spmenu -so Sort matches\n" "spmenu -nso Don't sort matches\n" "spmenu -pri Specify a list of items that take priority\n" "spmenu -s Use case-sensitive matching\n" "spmenu -ns Use case-insensitive matching\n" "spmenu -nm Start spmenu in normal mode\n" "spmenu -im Start spmenu in insert mode\n" "spmenu -t Position spmenu at the top of the screen\n" "spmenu -b Position spmenu at the bottom of the screen\n" "spmenu -c Position spmenu at the center of the screen\n" "spmenu -hm Hide mode indicator\n" "spmenu -hmc Hide match count\n" "spmenu -hla Hide left arrow\n" "spmenu -hra Hide right arrow\n" "spmenu -hpr Hide prompt\n" "spmenu -hc Hide cursor\n" "spmenu -hhl Hide highlight\n" "spmenu -hi Hide image\n" "spmenu -sm Show mode indicator\n" "spmenu -smc Show match count\n" "spmenu -sla Show left arrow\n" "spmenu -sra Show right arrow\n" "spmenu -spr Show prompt\n" "spmenu -sc Show cursor\n" "spmenu -shl Show highlight\n" "spmenu -si Show image\n" "spmenu -xrdb Load .Xresources on runtime\n" "spmenu -nxrdb Don't load .Xresources on runtime\n" "spmenu -m Specify a monitor to run spmenu on\n" "spmenu -w Embed spmenu inside \n" "spmenu -H Specify a path to save the history to\n" "spmenu -ig Set image gaps to \n" "spmenu -lp Set the vertical padding\n" "spmenu -hp Set the horizontal padding\n" "spmenu -la Set the left arrow to \n" "spmenu -ra Set the right arrow to \n" "spmenu -is Image size\n" "spmenu -it Position the image at the top\n" "spmenu -ib Position the image at the bottom\n" "spmenu -ic Position the image in the center\n" "spmenu -itc Position the image in the top center\n" "spmenu -wm Spawn spmenu as a window manager controlled client/window. Useful for testing\n" "spmenu -nwm Don't spawn spmenu as a window manager controlled client/window. Useful for testing\n" "spmenu -lcfg Load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc)\n" "spmenu -ncfg Don't load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc)\n" "spmenu -v Print spmenu version to stdout\n" "\n", stdout); fputs("- Appearance arguments -\n" "spmenu -fn Set the spmenu font to \n" "spmenu -nif Set the normal item foreground color\n" "spmenu -nib Set the normal item background color\n" "spmenu -sif Set the selected item foreground color\n" "spmenu -sib Set the selected item background color\n" "spmenu -npf Set the normal item (high priority) foreground color\n" "spmenu -npb Set the normal item (high priority) background color\n" "spmenu -spf Set the selected item (high priority) foreground color\n" "spmenu -spb Set the selected item (high priority) background color\n" "spmenu -pfg Set the prompt foreground color\n" "spmenu -pbg Set the prompt background color\n" "spmenu -ifg Set input foreground color\n" "spmenu -ibg Set input background color\n" "spmenu -mbg Set the menu background color\n" "spmenu -nhf Set the normal highlight foreground color\n" "spmenu -nhb Set the normal highlight background color\n" "spmenu -shf Set the selected highlight foreground color\n" "spmenu -shb Set the selected highlight background color\n" "spmenu -shb Set the selected highlight background color\n" "spmenu -nfg Set the foreground color for the match count\n" "spmenu -nbg Set the background color for the match count\n" "spmenu -mfg Set the foreground color for the mode indicator\n" "spmenu -mbg Set the background color for the mode indicator\n" "spmenu -laf Set the left arrow foreground color\n" "spmenu -raf Set the right arrow foreground color\n" "spmenu -lab Set the left arrow background color\n" "spmenu -rab Set the right arrow background color\n" "spmenu -cc Set the caret color\n" "spmenu -bc Set the border color\n" "spmenu -sgr0 Set the SGR 0 color\n" "spmenu -sgr1 Set the SGR 1 color\n" "spmenu -sgr2 Set the SGR 2 color\n" "spmenu -sgr3 Set the SGR 3 color\n" "spmenu -sgr4 Set the SGR 4 color\n" "spmenu -sgr5 Set the SGR 5 color\n" "spmenu -sgr6 Set the SGR 6 color\n" "spmenu -sgr7 Set the SGR 7 color\n" "spmenu -sgr8 Set the SGR 8 color\n" "spmenu -sgr9 Set the SGR 9 color\n" "spmenu -sgr10 Set the SGR 10 color\n" "spmenu -sgr11 Set the SGR 11 color\n" "spmenu -sgr12 Set the SGR 12 color\n" "spmenu -sgr13 Set the SGR 13 color\n" "spmenu -sgr14 Set the SGR 14 color\n" "spmenu -sgr15 Set the SGR 15 color\n" "\n", stdout); fputs("- dmenu compatibility -\n" "spmenu -S Don't sort matches\n" "spmenu -i Use case-insensitive matching\n" "spmenu -nb Set the normal background color\n" "spmenu -nf Set the normal foreground color\n" "spmenu -sb Set the selected background color\n" "spmenu -sf Set the selected foreground color\n" , stdout); exit(1); }