From 95b420944cf89272ae4ecaffb1cfcbfdc951dda5 Mon Sep 17 00:00:00 2001 From: speedie Date: Mon, 22 May 2023 22:47:37 +0200 Subject: [PATCH] add a bind file which scripts can use to gain full control over keybinds --- docs/docs.md | 23 +- docs/run-docs.md | 3 + docs/spmenu.conf | 3 +- libs/argv.c | 41 +- libs/conf/config.c | 1252 +++++++++++++++++++++++++------------------- libs/theme/theme.c | 2 +- options.h | 3 +- scripts/spmenu_run | 8 +- spmenu.1 | 30 +- spmenu.c | 3 +- spmenu.html | 32 +- spmenu_run.1 | 6 + 12 files changed, 819 insertions(+), 587 deletions(-) diff --git a/docs/docs.md b/docs/docs.md index 9c99b12..61bfe8f 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -288,7 +288,6 @@ You may use long, descriptive arguments or the shorter arguments. `-lf, --list-file list file` : Specify a file to load entries from - `-ig, --image-gaps gaps` : Set image gaps to gaps @@ -338,19 +337,28 @@ You may use long, descriptive arguments or the shorter arguments. : Set config file to load to file `-lcfg, --load-config` -: Load spmenu configuration (~/.spmenu.conf or ~/.config/spmenu/spmenu.conf) +: Load spmenu configuration (~/.config/spmenu/spmenu.conf) on runtime `-ncfg, --no-load-config` -: Don't load spmenu configuration (~/.spmenu.conf or ~/.config/spmenu/spmenu.conf) +: Don't load spmenu configuration (~/.config/spmenu/spmenu.conf) on runtime + +`-bf, --bind-file file` +: Set bind file to load to file + +`-lbi, --load-binds` +: Exclusively load binds from file (~/.config/spmenu/binds.conf) on runtime + +`-nlbi, --no-load-binds` +: Don't exclusively load binds from file (~/.config/spmenu/binds.conf) on runtime `-tm, --theme theme` -: Load theme 'theme' on runtime. +: Load theme 'theme' on runtime `-ltm, --load-theme` -: Load theme +: Load theme (~/.config/spmenu/theme.conf) on runtime `-nltm, --no-load-theme` -: Don't load theme +: Don't load theme (~/.config/spmenu/theme.conf) on runtime `-v, --version` : Print spmenu version to stdout @@ -831,3 +839,6 @@ email me. ## See also - spmenu_run(1) +- [spmenu wiki](https://spmenu.speedie.site) +- [spmenu git repository](https://git.speedie.site/spmenu) +- [spmenu GitHub mirror](https://github.com/speediegq/spmenu) diff --git a/docs/run-docs.md b/docs/run-docs.md index 521d16a..12e5c35 100644 --- a/docs/run-docs.md +++ b/docs/run-docs.md @@ -155,3 +155,6 @@ email me. ## See also - spmenu(1) +- [spmenu wiki](https://spmenu.speedie.site) +- [spmenu git repository](https://git.speedie.site/spmenu) +- [spmenu GitHub mirror](https://github.com/speediegq/spmenu) diff --git a/docs/spmenu.conf b/docs/spmenu.conf index 5fe5509..771ffcd 100644 --- a/docs/spmenu.conf +++ b/docs/spmenu.conf @@ -201,7 +201,8 @@ spmenu = { /* File options */ file = ( { xresources = 1; // Load .Xresources on startup (0/1) global = 1; // Read global .Xresources colors, programs like Pywal use this. (*.color0, *.color1, etc.) (0/1) - theme = 1; // Load theme (~/.theme.conf or ~/.config/spmenu/theme.conf) on runtime + theme = 1; // Load theme (~/.config/spmenu/theme.conf) on runtime + binds = 1; // Load binds (~/.config/spmenu/binds.conf) on runtime } ); /* Input options */ diff --git a/libs/argv.c b/libs/argv.c index bc23101..8de5987 100644 --- a/libs/argv.c +++ b/libs/argv.c @@ -15,20 +15,28 @@ void readargs(int argc, char *argv[]) { loadtheme = 1; } else if (!strcmp(argv[j], "-nltm") || (!strcmp(argv[j], "--no-load-theme"))) { loadtheme = 0; + } else if (!strcmp(argv[j], "-lbi") || (!strcmp(argv[j], "--load-binds"))) { + loadbinds = 1; + } else if (!strcmp(argv[j], "-nlbi") || (!strcmp(argv[j], "--no-load-binds"))) { + loadbinds = 0; #if USECONFIG } else if (!strcmp(argv[j], "-cf") || (!strcmp(argv[j], "--config-file"))) { // specify a config file if (argv[j+1]) { - cconf = 1; argconf = argv[++j]; } else { - die("This argument requires a second argument.\n"); + die("This argument requires a second argument."); + } + } else if (!strcmp(argv[j], "-bf") || (!strcmp(argv[j], "--bind-file"))) { // specify a bind file + if (argv[j+1]) { + argbinds = argv[++j]; + } else { + die("This argument requires a second argument."); } } else if (!strcmp(argv[j], "-tm") || (!strcmp(argv[j], "--theme"))) { // specify a theme if (argv[j+1]) { - ctheme = 1; argtheme = argv[++j]; } else { - die("This argument requires a second argument.\n"); + die("This argument requires a second argument."); } #endif } @@ -216,6 +224,10 @@ void readargs(int argc, char *argv[]) { || !strcmp(argv[i], "-nltm") || !strcmp(argv[i], "--load-theme") || !strcmp(argv[i], "--no-load-theme") + || !strcmp(argv[i], "-lbi") + || !strcmp(argv[i], "-nlbi") + || !strcmp(argv[i], "--load-binds") + || !strcmp(argv[i], "--no-load-binds") || !strcmp(argv[i], "-gbc") || !strcmp(argv[i], "-ngbc") || !strcmp(argv[i], "--global-colors") @@ -227,6 +239,9 @@ void readargs(int argc, char *argv[]) { || !strcmp(argv[i], "-tm") || !strcmp(argv[i], "--theme") || (argtheme && !strcmp(argv[i], argtheme)) + || !strcmp(argv[i], "-bf") + || !strcmp(argv[i], "--bind-file") + || (argbinds && !strcmp(argv[i], argbinds)) #endif )) continue; @@ -435,6 +450,10 @@ void readargs(int argc, char *argv[]) { || !strcmp(argv[i], "-nltm") || !strcmp(argv[i], "--load-theme") || !strcmp(argv[i], "--no-load-theme") + || !strcmp(argv[i], "-lbi") + || !strcmp(argv[i], "-nlbi") + || !strcmp(argv[i], "--load-binds") + || !strcmp(argv[i], "--no-load-binds") || !strcmp(argv[i], "-gbc") || !strcmp(argv[i], "-ngbc") || !strcmp(argv[i], "--global-colors") @@ -446,6 +465,9 @@ void readargs(int argc, char *argv[]) { || !strcmp(argv[i], "-tm") || !strcmp(argv[i], "--theme") || (argtheme && !strcmp(argv[i], argtheme)) + || !strcmp(argv[i], "-bf") + || !strcmp(argv[i], "--bind-file") + || (argbinds && !strcmp(argv[i], argbinds)) #endif )) continue; @@ -528,7 +550,7 @@ void usage(int status) { "spmenu -t, --top Position spmenu at the top of the screen\n" "spmenu -b, --bottom Position spmenu at the bottom of the screen\n" "spmenu -c, --center Position spmenu at the center of the screen\n" - "\n", status ? stderr : stdout); + , status ? stderr : stdout); // more args fputs("spmenu -hm, --hide-mode Hide mode indicator\n" @@ -582,8 +604,11 @@ void usage(int status) { fputs("spmenu -wm, --managed, --x11-client Spawn spmenu as a window manager controlled client/window. Useful for testing\n" "spmenu -nwm, --unmanaged Don't spawn spmenu as a window manager controlled client/window. Useful for testing\n" "spmenu -cf, --config-file Set config file to load to \n" - "spmenu -lcfg, --load-config Load spmenu configuration (~/.spmenu.conf or ~/.config/spmenu/spmenu.conf)\n" - "spmenu -ncfg, --no-load-config Don't load spmenu configuration (~/.spmenu.conf or ~/.config/spmenu/spmenu.conf)\n" + "spmenu -lcfg, --load-config Load spmenu configuration (~/.config/spmenu/spmenu.conf)\n" + "spmenu -ncfg, --no-load-config Don't load spmenu configuration (~/.config/spmenu/spmenu.conf)\n" + "spmenu -bf, --bind-file Exclusively load binds from \n" + "spmenu -lbi, --load-binds Load spmenu binds (~/.config/spmenu/binds.conf)\n" + "spmenu -nlbi, --no-load-binds Don't load spmenu binds (~/.config/spmenu/binds.conf)\n" "spmenu -tm, --theme Load theme \n" "spmenu -ltm, --load-theme Load theme\n" "spmenu -nltm, --no-load-theme Don't load theme\n" @@ -624,7 +649,7 @@ void usage(int status) { "spmenu -cfc, --caret-foreground Set the caret foreground color\n" "spmenu -cbc, --caret-background Set the caret background color\n" "spmenu -bc, --border-background Set the border color\n" - "\n", status ? stderr : stdout); + , status ? stderr : stdout); // sgr sequences fputs("spmenu -sgr0, --sgr0 Set the SGR 0 color\n" diff --git a/libs/conf/config.c b/libs/conf/config.c index dbf9cdf..67facf9 100644 --- a/libs/conf/config.c +++ b/libs/conf/config.c @@ -5,658 +5,810 @@ void conf_init(void) { char *xdg_conf; char *cfgfile = NULL; + char *bindfile = NULL; char *home = NULL; const char *dest; // don't load configuration - if (!loadconfig) return; + if (loadconfig) { + // get path for configuration file + if (!argconf) { + if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) { + // ~/.config/spmenu/spmenu.conf + home = getenv("HOME"); - // get path for configuration file - if (!cconf || !argconf) { - if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) { - // ~/.config/spmenu/spmenu.conf - home = getenv("HOME"); + // malloc + if (!(cfgfile = malloc(snprintf(NULL, 0, "%s/%s", home, ".config/spmenu/spmenu.conf") + 1))) { + die("spmenu: failed to malloc cfgfile"); + } - // malloc - if (!(cfgfile = malloc(snprintf(NULL, 0, "%s/%s", home, ".config/spmenu/spmenu.conf") + 1))) { + sprintf(cfgfile, "%s/%s", home, ".config/spmenu/spmenu.conf"); + } else { + // malloc + if (!(cfgfile = malloc(snprintf(NULL, 0, "%s/%s", xdg_conf, "spmenu/spmenu.conf") + 1))) { + die("spmenu: failed to malloc cfgfile"); + } + + // XDG_CONFIG_HOME is set, so let's use that instead + sprintf(cfgfile, "%s/%s", xdg_conf, "spmenu/spmenu.conf"); + } + } else { // custom config path + if (!(cfgfile = malloc(snprintf(NULL, 0, "%s", argconf) + 1))) { die("spmenu: failed to malloc cfgfile"); } - sprintf(cfgfile, "%s/%s", home, ".config/spmenu/spmenu.conf"); - } else { - // malloc - if (!(cfgfile = malloc(snprintf(NULL, 0, "%s/%s", xdg_conf, "spmenu/spmenu.conf") + 1))) { - die("spmenu: failed to malloc cfgfile"); + sprintf(cfgfile, "%s", argconf); + } + + // don't bother trying to load if it doesn't exist. + if (access(cfgfile, F_OK) != 0) { + return; + } + + // init config + config_t cfg; + + config_init(&cfg); + + // attempt to read config file to cfg + if (!config_read_file(&cfg, cfgfile)) { + // invalid configuration, but let's try to read it anyway + fprintf(stderr, "spmenu: Invalid configuration.\n"); + } + + // load options spmenu.window + config_setting_t *window_setting = config_lookup(&cfg, "spmenu.window"); + if (window_setting != NULL) { + // look up window entries + for (unsigned int i = 0; i < config_setting_length(window_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(window_setting, i); + + config_setting_lookup_int(conf, "position", &menuposition); // spmenu.window.menuposition + config_setting_lookup_int(conf, "paddingv", &menupaddingv); // spmenu.window.paddingv + config_setting_lookup_int(conf, "paddingh", &menupaddingh); // spmenu.window.paddingh + config_setting_lookup_int(conf, "padding-vertical", &menupaddingv); // spmenu.window.padding-vertical + config_setting_lookup_int(conf, "padding-horizontal", &menupaddingh); // spmenu.window.padding-horizontal + config_setting_lookup_int(conf, "margin-vertical", &menumarginv); // spmenu.window.margin-vertical + config_setting_lookup_int(conf, "margin-horizontal", &menumarginh); // spmenu.window.margin-horizontal + config_setting_lookup_int(conf, "x", &xpos); // spmenu.window.x + config_setting_lookup_int(conf, "y", &xpos); // spmenu.window.y + config_setting_lookup_int(conf, "width", &menuwidth); // spmenu.window.width + config_setting_lookup_int(conf, "border", &borderwidth); // spmenu.window.border + config_setting_lookup_int(conf, "managed", &managed); // spmenu.window.managed + config_setting_lookup_int(conf, "monitor", &mon); // spmenu.window.monitor + config_setting_lookup_int(conf, "alpha", &alpha); // spmenu.window.alpha } - - // XDG_CONFIG_HOME is set, so let's use that instead - sprintf(cfgfile, "%s/%s", xdg_conf, "spmenu/spmenu.conf"); - } - } else { // custom config path - if (!(cfgfile = malloc(snprintf(NULL, 0, "%s", argconf) + 1))) { - die("spmenu: failed to malloc cfgfile"); } - sprintf(cfgfile, "%s", argconf); - } + // load options spmenu.properties + config_setting_t *prop_setting = config_lookup(&cfg, "spmenu.properties"); + if (prop_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(prop_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(prop_setting, i); - // don't bother trying to load if it doesn't exist. - if (access(cfgfile, F_OK) != 0) { - return; - } + // look up + config_setting_lookup_string(conf, "class", &dest); // spmenu.properties.class + class = strdup(dest); - // init config - config_t cfg; - - config_init(&cfg); - - // attempt to read config file to cfg - if (!config_read_file(&cfg, cfgfile)) { - // invalid configuration, but let's try to read it anyway - fprintf(stderr, "spmenu: Invalid configuration.\n"); - } - - // load options spmenu.window - config_setting_t *window_setting = config_lookup(&cfg, "spmenu.window"); - if (window_setting != NULL) { - // look up window entries - for (unsigned int i = 0; i < config_setting_length(window_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(window_setting, i); - - config_setting_lookup_int(conf, "position", &menuposition); // spmenu.window.menuposition - config_setting_lookup_int(conf, "paddingv", &menupaddingv); // spmenu.window.paddingv - config_setting_lookup_int(conf, "paddingh", &menupaddingh); // spmenu.window.paddingh - config_setting_lookup_int(conf, "padding-vertical", &menupaddingv); // spmenu.window.padding-vertical - config_setting_lookup_int(conf, "padding-horizontal", &menupaddingh); // spmenu.window.padding-horizontal - config_setting_lookup_int(conf, "margin-vertical", &menumarginv); // spmenu.window.margin-vertical - config_setting_lookup_int(conf, "margin-horizontal", &menumarginh); // spmenu.window.margin-horizontal - config_setting_lookup_int(conf, "x", &xpos); // spmenu.window.x - config_setting_lookup_int(conf, "y", &xpos); // spmenu.window.y - config_setting_lookup_int(conf, "width", &menuwidth); // spmenu.window.width - config_setting_lookup_int(conf, "border", &borderwidth); // spmenu.window.border - config_setting_lookup_int(conf, "managed", &managed); // spmenu.window.managed - config_setting_lookup_int(conf, "monitor", &mon); // spmenu.window.monitor - config_setting_lookup_int(conf, "alpha", &alpha); // spmenu.window.alpha + config_setting_lookup_int(conf, "dock", &dockproperty); // spmenu.properties.dock + } } - } - // load options spmenu.properties - config_setting_t *prop_setting = config_lookup(&cfg, "spmenu.properties"); - if (prop_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(prop_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(prop_setting, i); + // load options spmenu.powerline + config_setting_t *pwl_setting = config_lookup(&cfg, "spmenu.powerline"); + if (pwl_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(pwl_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(pwl_setting, i); - // look up - config_setting_lookup_string(conf, "class", &dest); // spmenu.properties.class - class = strdup(dest); - - config_setting_lookup_int(conf, "dock", &dockproperty); // spmenu.properties.dock + // look up + config_setting_lookup_int(conf, "promptstyle", &promptpwlstyle); // spmenu.powerline.promptstyle + config_setting_lookup_int(conf, "matchcountstyle", &matchcountpwlstyle); // spmenu.powerline.matchcountstyle + config_setting_lookup_int(conf, "modestyle", &modepwlstyle); // spmenu.powerline.modestyle + config_setting_lookup_int(conf, "capsstyle", &capspwlstyle); // spmenu.powerline.capsstyle + config_setting_lookup_int(conf, "prompt", &powerlineprompt); // spmenu.powerline.prompt + config_setting_lookup_int(conf, "matchcount", &powerlinecount); // spmenu.powerline.matchcount + config_setting_lookup_int(conf, "mode", &powerlinemode); // spmenu.powerline.mode + config_setting_lookup_int(conf, "caps", &powerlinecaps); // spmenu.powerline.caps + } } - } - // load options spmenu.powerline - config_setting_t *pwl_setting = config_lookup(&cfg, "spmenu.powerline"); - if (pwl_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(pwl_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(pwl_setting, i); + // load options spmenu.center + config_setting_t *center_setting = config_lookup(&cfg, "spmenu.center"); + if (center_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(center_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(center_setting, i); - // look up - config_setting_lookup_int(conf, "promptstyle", &promptpwlstyle); // spmenu.powerline.promptstyle - config_setting_lookup_int(conf, "matchcountstyle", &matchcountpwlstyle); // spmenu.powerline.matchcountstyle - config_setting_lookup_int(conf, "modestyle", &modepwlstyle); // spmenu.powerline.modestyle - config_setting_lookup_int(conf, "capsstyle", &capspwlstyle); // spmenu.powerline.capsstyle - config_setting_lookup_int(conf, "prompt", &powerlineprompt); // spmenu.powerline.prompt - config_setting_lookup_int(conf, "matchcount", &powerlinecount); // spmenu.powerline.matchcount - config_setting_lookup_int(conf, "mode", &powerlinemode); // spmenu.powerline.mode - config_setting_lookup_int(conf, "caps", &powerlinecaps); // spmenu.powerline.caps + config_setting_lookup_int(conf, "width", &minwidth); // spmenu.center.width + } } - } - // load options spmenu.center - config_setting_t *center_setting = config_lookup(&cfg, "spmenu.center"); - if (center_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(center_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(center_setting, i); + // load options spmenu.text + config_setting_t *text_setting = config_lookup(&cfg, "spmenu.text"); + if (text_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(text_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(text_setting, i); - config_setting_lookup_int(conf, "width", &minwidth); // spmenu.center.width + // look up + if (config_setting_lookup_string(conf, "font", &dest)) // spmenu.text.font + strcpy(font, strdup(dest)); + + config_setting_lookup_int(conf, "padding", &textpadding); // spmenu.text.padding + config_setting_lookup_int(conf, "normitempadding", &normitempadding); // spmenu.text.normitempadding + config_setting_lookup_int(conf, "selitempadding", &selitempadding); // spmenu.text.selitempadding + config_setting_lookup_int(conf, "priitempadding", &priitempadding); // spmenu.text.priitempadding + + if (config_setting_lookup_string(conf, "leftarrow", &dest)) // spmenu.text.leftarrow + leftarrow = strdup(dest); + + if (config_setting_lookup_string(conf, "rightarrow", &dest)) // spmenu.text.rightarrow + rightarrow = strdup(dest); + + if (config_setting_lookup_string(conf, "password", &dest)) + password = strdup(dest); + + if (config_setting_lookup_string(conf, "prompt", &dest)) + prompt = strdup(dest); + + if (config_setting_lookup_string(conf, "capslockon", &dest)) + capslockontext = strdup(dest); + + if (config_setting_lookup_string(conf, "capslockoff", &dest)) + capslockofftext = strdup(dest); + + if (config_setting_lookup_string(conf, "input", &dest)) + input = strdup(dest); + } } - } - // load options spmenu.text - config_setting_t *text_setting = config_lookup(&cfg, "spmenu.text"); - if (text_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(text_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(text_setting, i); + // load options spmenu.alpha + config_setting_t *alpha_setting = config_lookup(&cfg, "spmenu.alpha"); + if (alpha_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(alpha_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(alpha_setting, i); - // look up - if (config_setting_lookup_string(conf, "font", &dest)) // spmenu.text.font - strcpy(font, strdup(dest)); + // look up + config_setting_lookup_int(conf, "itemnormfg", &alpha_itemnormfg); // spmenu.alpha.itemnormfg + config_setting_lookup_int(conf, "itemnormbg", &alpha_itemnormbg); // spmenu.alpha.itemnormbg - config_setting_lookup_int(conf, "padding", &textpadding); // spmenu.text.padding - config_setting_lookup_int(conf, "normitempadding", &normitempadding); // spmenu.text.normitempadding - config_setting_lookup_int(conf, "selitempadding", &selitempadding); // spmenu.text.selitempadding - config_setting_lookup_int(conf, "priitempadding", &priitempadding); // spmenu.text.priitempadding + if (!config_setting_lookup_int(conf, "itemnormfg2", &alpha_itemnormfg2)) // spmenu.alpha.itemnormfg2 + config_setting_lookup_int(conf, "itemnormfg", &alpha_itemnormfg2); - if (config_setting_lookup_string(conf, "leftarrow", &dest)) // spmenu.text.leftarrow - leftarrow = strdup(dest); + if (!config_setting_lookup_int(conf, "itemnormbg2", &alpha_itemnormbg2)) // spmenu.alpha.itemnormbg2 + config_setting_lookup_int(conf, "itemnormbg", &alpha_itemnormbg2); - if (config_setting_lookup_string(conf, "rightarrow", &dest)) // spmenu.text.rightarrow - rightarrow = strdup(dest); + config_setting_lookup_int(conf, "itemselfg", &alpha_itemselfg); // spmenu.alpha.itemselfg + config_setting_lookup_int(conf, "itemselbg", &alpha_itemselbg); // spmenu.alpha.itemselbg - if (config_setting_lookup_string(conf, "password", &dest)) - password = strdup(dest); + if (!config_setting_lookup_int(conf, "itemmarkedfg", &alpha_itemmarkedfg)) + config_setting_lookup_int(conf, "itemselfg", &alpha_itemmarkedfg); - if (config_setting_lookup_string(conf, "prompt", &dest)) - prompt = strdup(dest); + if (!config_setting_lookup_int(conf, "itemmarkedbg", &alpha_itemmarkedbg)) + config_setting_lookup_int(conf, "itemselbg", &alpha_itemmarkedbg); - if (config_setting_lookup_string(conf, "capslockon", &dest)) - capslockontext = strdup(dest); + config_setting_lookup_int(conf, "itemnormprifg", &alpha_itemnormprifg); // spmenu.alpha.itemnormprifg + config_setting_lookup_int(conf, "itemnormpribg", &alpha_itemnormpribg); // spmenu.alpha.itemnormpribg + config_setting_lookup_int(conf, "itemselprifg", &alpha_itemselprifg); // spmenu.alpha.itemselprifg + config_setting_lookup_int(conf, "itemselpribg", &alpha_itemselpribg); // spmenu.alpha.itemselpribg - if (config_setting_lookup_string(conf, "capslockoff", &dest)) - capslockofftext = strdup(dest); + config_setting_lookup_int(conf, "inputfg", &alpha_inputfg); // spmenu.alpha.inputfg + config_setting_lookup_int(conf, "inputbg", &alpha_inputbg); // spmenu.alpha.inputbg - if (config_setting_lookup_string(conf, "input", &dest)) - input = strdup(dest); + config_setting_lookup_int(conf, "menu", &alpha_menu); // spmenu.alpha.menu + + config_setting_lookup_int(conf, "promptfg", &alpha_promptfg); // spmenu.alpha.promptfg + config_setting_lookup_int(conf, "promptbg", &alpha_promptbg); // spmenu.alpha.promptbg + + config_setting_lookup_int(conf, "larrowfg", &alpha_larrowfg); // spmenu.alpha.larrowfg + config_setting_lookup_int(conf, "larrowbg", &alpha_larrowbg); // spmenu.alpha.larrowbg + config_setting_lookup_int(conf, "rarrowfg", &alpha_rarrowfg); // spmenu.alpha.rarrowfg + config_setting_lookup_int(conf, "rarrowbg", &alpha_rarrowbg); // spmenu.alpha.rarrowbg + + config_setting_lookup_int(conf, "hlnormfg", &alpha_hlnormfg); // spmenu.alpha.hlnormfg + config_setting_lookup_int(conf, "hlnormbg", &alpha_hlnormbg); // spmenu.alpha.hlnormbg + config_setting_lookup_int(conf, "hlselfg", &alpha_hlselfg); // spmenu.alpha.hlselfg + config_setting_lookup_int(conf, "hlselbg", &alpha_hlselbg); // spmenu.alpha.hlselbg + + config_setting_lookup_int(conf, "numfg", &alpha_numfg); // spmenu.alpha.numfg + config_setting_lookup_int(conf, "numbg", &alpha_numbg); // spmenu.alpha.numbg + + config_setting_lookup_int(conf, "border", &alpha_border); // spmenu.alpha.border + + config_setting_lookup_int(conf, "caretfg", &alpha_caretfg); // spmenu.alpha.caretfg + config_setting_lookup_int(conf, "caretbg", &alpha_caretbg); // spmenu.alpha.caretbg + + config_setting_lookup_int(conf, "modefg", &alpha_modefg); // spmenu.alpha.modefg + config_setting_lookup_int(conf, "modebg", &alpha_modebg); // spmenu.alpha.modebg + + config_setting_lookup_int(conf, "capsfg", &alpha_capsfg); // spmenu.alpha.capsfg + config_setting_lookup_int(conf, "capsbg", &alpha_capsbg); // spmenu.alpha.capsbg + } } - } - // load options spmenu.alpha - config_setting_t *alpha_setting = config_lookup(&cfg, "spmenu.alpha"); - if (alpha_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(alpha_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(alpha_setting, i); + // load options spmenu.color + config_setting_t *color_setting = config_lookup(&cfg, "spmenu.color"); + if (color_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(color_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(color_setting, i); - // look up - config_setting_lookup_int(conf, "itemnormfg", &alpha_itemnormfg); // spmenu.alpha.itemnormfg - config_setting_lookup_int(conf, "itemnormbg", &alpha_itemnormbg); // spmenu.alpha.itemnormbg + // items + if (config_setting_lookup_string(conf, "itemnormfg", &dest)) + strcpy(colors[SchemeItemNorm1][ColFg], strdup(dest)); - if (!config_setting_lookup_int(conf, "itemnormfg2", &alpha_itemnormfg2)) // spmenu.alpha.itemnormfg2 - config_setting_lookup_int(conf, "itemnormfg", &alpha_itemnormfg2); + if (config_setting_lookup_string(conf, "itemnormbg", &dest)) + strcpy(colors[SchemeItemNorm1][ColBg], strdup(dest)); - if (!config_setting_lookup_int(conf, "itemnormbg2", &alpha_itemnormbg2)) // spmenu.alpha.itemnormbg2 - config_setting_lookup_int(conf, "itemnormbg", &alpha_itemnormbg2); + if (config_setting_lookup_string(conf, "itemnormfg2", &dest)) + strcpy(colors[SchemeItemNorm2][ColFg], strdup(dest)); + else if (config_setting_lookup_string(conf, "itemnormfg", &dest)) + strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "itemselfg", &alpha_itemselfg); // spmenu.alpha.itemselfg - config_setting_lookup_int(conf, "itemselbg", &alpha_itemselbg); // spmenu.alpha.itemselbg + if (config_setting_lookup_string(conf, "itemnormbg2", &dest)) + strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); + else if (config_setting_lookup_string(conf, "itemnormbg", &dest)) + strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); - if (!config_setting_lookup_int(conf, "itemmarkedfg", &alpha_itemmarkedfg)) - config_setting_lookup_int(conf, "itemselfg", &alpha_itemmarkedfg); + if (config_setting_lookup_string(conf, "itemselfg", &dest)) + strcpy(colors[SchemeItemSel][ColFg], strdup(dest)); - if (!config_setting_lookup_int(conf, "itemmarkedbg", &alpha_itemmarkedbg)) - config_setting_lookup_int(conf, "itemselbg", &alpha_itemmarkedbg); + if (config_setting_lookup_string(conf, "itemselbg", &dest)) + strcpy(colors[SchemeItemSel][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "itemnormprifg", &alpha_itemnormprifg); // spmenu.alpha.itemnormprifg - config_setting_lookup_int(conf, "itemnormpribg", &alpha_itemnormpribg); // spmenu.alpha.itemnormpribg - config_setting_lookup_int(conf, "itemselprifg", &alpha_itemselprifg); // spmenu.alpha.itemselprifg - config_setting_lookup_int(conf, "itemselpribg", &alpha_itemselpribg); // spmenu.alpha.itemselpribg + if (config_setting_lookup_string(conf, "itemmarkedfg", &dest)) + strcpy(colors[SchemeItemMarked][ColFg], strdup(dest)); + else if (config_setting_lookup_string(conf, "itemselfg", &dest)) + strcpy(colors[SchemeItemMarked][ColFg], strdup(dest)); - config_setting_lookup_int(conf, "inputfg", &alpha_inputfg); // spmenu.alpha.inputfg - config_setting_lookup_int(conf, "inputbg", &alpha_inputbg); // spmenu.alpha.inputbg + if (config_setting_lookup_string(conf, "itemmarkedbg", &dest)) + strcpy(colors[SchemeItemMarked][ColBg], strdup(dest)); + else if (config_setting_lookup_string(conf, "itemselbg", &dest)) + strcpy(colors[SchemeItemMarked][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "menu", &alpha_menu); // spmenu.alpha.menu + // items with priority + if (config_setting_lookup_string(conf, "itemnormprifg", &dest)) + strcpy(colors[SchemeItemNormPri][ColFg], strdup(dest)); - config_setting_lookup_int(conf, "promptfg", &alpha_promptfg); // spmenu.alpha.promptfg - config_setting_lookup_int(conf, "promptbg", &alpha_promptbg); // spmenu.alpha.promptbg + if (config_setting_lookup_string(conf, "itemnormpribg", &dest)) + strcpy(colors[SchemeItemNormPri][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "larrowfg", &alpha_larrowfg); // spmenu.alpha.larrowfg - config_setting_lookup_int(conf, "larrowbg", &alpha_larrowbg); // spmenu.alpha.larrowbg - config_setting_lookup_int(conf, "rarrowfg", &alpha_rarrowfg); // spmenu.alpha.rarrowfg - config_setting_lookup_int(conf, "rarrowbg", &alpha_rarrowbg); // spmenu.alpha.rarrowbg + if (config_setting_lookup_string(conf, "itemselprifg", &dest)) + strcpy(colors[SchemeItemSelPri][ColFg], strdup(dest)); - config_setting_lookup_int(conf, "hlnormfg", &alpha_hlnormfg); // spmenu.alpha.hlnormfg - config_setting_lookup_int(conf, "hlnormbg", &alpha_hlnormbg); // spmenu.alpha.hlnormbg - config_setting_lookup_int(conf, "hlselfg", &alpha_hlselfg); // spmenu.alpha.hlselfg - config_setting_lookup_int(conf, "hlselbg", &alpha_hlselbg); // spmenu.alpha.hlselbg + if (config_setting_lookup_string(conf, "itemselpribg", &dest)) + strcpy(colors[SchemeItemSelPri][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "numfg", &alpha_numfg); // spmenu.alpha.numfg - config_setting_lookup_int(conf, "numbg", &alpha_numbg); // spmenu.alpha.numbg + // input + if (config_setting_lookup_string(conf, "inputfg", &dest)) + strcpy(colors[SchemeInput][ColFg], strdup(dest)); - config_setting_lookup_int(conf, "border", &alpha_border); // spmenu.alpha.border + if (config_setting_lookup_string(conf, "inputbg", &dest)) + strcpy(colors[SchemeInput][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "caretfg", &alpha_caretfg); // spmenu.alpha.caretfg - config_setting_lookup_int(conf, "caretbg", &alpha_caretbg); // spmenu.alpha.caretbg + // menu + if (config_setting_lookup_string(conf, "menu", &dest)) + strcpy(colors[SchemeMenu][ColBg], strdup(dest)); - config_setting_lookup_int(conf, "modefg", &alpha_modefg); // spmenu.alpha.modefg - config_setting_lookup_int(conf, "modebg", &alpha_modebg); // spmenu.alpha.modebg + // prompt + if (config_setting_lookup_string(conf, "promptfg", &dest)) + strcpy(colors[SchemePrompt][ColFg], strdup(dest)); - config_setting_lookup_int(conf, "capsfg", &alpha_capsfg); // spmenu.alpha.capsfg - config_setting_lookup_int(conf, "capsbg", &alpha_capsbg); // spmenu.alpha.capsbg + if (config_setting_lookup_string(conf, "promptbg", &dest)) + strcpy(colors[SchemePrompt][ColBg], strdup(dest)); + + // arrows + if (config_setting_lookup_string(conf, "larrowfg", &dest)) + strcpy(colors[SchemeLArrow][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "larrowbg", &dest)) + strcpy(colors[SchemeLArrow][ColBg], strdup(dest)); + + if (config_setting_lookup_string(conf, "rarrowfg", &dest)) + strcpy(colors[SchemeRArrow][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "rarrowbg", &dest)) + strcpy(colors[SchemeRArrow][ColBg], strdup(dest)); + + // highlight + if (config_setting_lookup_string(conf, "hlnormfg", &dest)) + strcpy(colors[SchemeNormHighlight][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "hlnormbg", &dest)) + strcpy(colors[SchemeNormHighlight][ColBg], strdup(dest)); + + if (config_setting_lookup_string(conf, "hlselfg", &dest)) + strcpy(colors[SchemeSelHighlight][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "hlselbg", &dest)) + strcpy(colors[SchemeSelHighlight][ColBg], strdup(dest)); + + // number + if (config_setting_lookup_string(conf, "numfg", &dest)) + strcpy(colors[SchemeNumber][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "numbg", &dest)) + strcpy(colors[SchemeNumber][ColBg], strdup(dest)); + + // mode + if (config_setting_lookup_string(conf, "modefg", &dest)) + strcpy(colors[SchemeMode][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "modebg", &dest)) + strcpy(colors[SchemeMode][ColBg], strdup(dest)); + + // caps + if (config_setting_lookup_string(conf, "capsfg", &dest)) + strcpy(colors[SchemeCaps][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "capsbg", &dest)) + strcpy(colors[SchemeCaps][ColBg], strdup(dest)); + + // border + if (config_setting_lookup_string(conf, "border", &dest)) + strcpy(colors[SchemeBorder][ColBg], strdup(dest)); + + // caret + if (config_setting_lookup_string(conf, "caretfg", &dest)) + strcpy(colors[SchemeCaret][ColFg], strdup(dest)); + + if (config_setting_lookup_string(conf, "caretbg", &dest)) + strcpy(colors[SchemeCaret][ColBg], strdup(dest)); + + // sgr colors + if (config_setting_lookup_string(conf, "sgr0", &dest)) + strcpy(textcolors[0], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr1", &dest)) + strcpy(textcolors[1], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr2", &dest)) + strcpy(textcolors[2], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr3", &dest)) + strcpy(textcolors[3], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr4", &dest)) + strcpy(textcolors[4], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr5", &dest)) + strcpy(textcolors[5], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr6", &dest)) + strcpy(textcolors[6], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr7", &dest)) + strcpy(textcolors[7], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr8", &dest)) + strcpy(textcolors[8], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr9", &dest)) + strcpy(textcolors[9], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr10", &dest)) + strcpy(textcolors[10], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr11", &dest)) + strcpy(textcolors[11], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr12", &dest)) + strcpy(textcolors[12], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr13", &dest)) + strcpy(textcolors[13], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr14", &dest)) + strcpy(textcolors[14], strdup(dest)); + if (config_setting_lookup_string(conf, "sgr15", &dest)) + strcpy(textcolors[15], strdup(dest)); + + // coloritems int + config_setting_lookup_int(conf, "coloritems", &coloritems); + config_setting_lookup_int(conf, "sgr", &sgr); + } } - } - // load options spmenu.color - config_setting_t *color_setting = config_lookup(&cfg, "spmenu.color"); - if (color_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(color_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(color_setting, i); + // load options spmenu.image + config_setting_t *img_setting = config_lookup(&cfg, "spmenu.image"); + if (img_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(img_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(img_setting, i); - // items - if (config_setting_lookup_string(conf, "itemnormfg", &dest)) - strcpy(colors[SchemeItemNorm1][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemnormbg", &dest)) - strcpy(colors[SchemeItemNorm1][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemnormfg2", &dest)) - strcpy(colors[SchemeItemNorm2][ColFg], strdup(dest)); - else if (config_setting_lookup_string(conf, "itemnormfg", &dest)) - strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemnormbg2", &dest)) - strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); - else if (config_setting_lookup_string(conf, "itemnormbg", &dest)) - strcpy(colors[SchemeItemNorm2][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemselfg", &dest)) - strcpy(colors[SchemeItemSel][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemselbg", &dest)) - strcpy(colors[SchemeItemSel][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemmarkedfg", &dest)) - strcpy(colors[SchemeItemMarked][ColFg], strdup(dest)); - else if (config_setting_lookup_string(conf, "itemselfg", &dest)) - strcpy(colors[SchemeItemMarked][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemmarkedbg", &dest)) - strcpy(colors[SchemeItemMarked][ColBg], strdup(dest)); - else if (config_setting_lookup_string(conf, "itemselbg", &dest)) - strcpy(colors[SchemeItemMarked][ColBg], strdup(dest)); - - // items with priority - if (config_setting_lookup_string(conf, "itemnormprifg", &dest)) - strcpy(colors[SchemeItemNormPri][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemnormpribg", &dest)) - strcpy(colors[SchemeItemNormPri][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemselprifg", &dest)) - strcpy(colors[SchemeItemSelPri][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "itemselpribg", &dest)) - strcpy(colors[SchemeItemSelPri][ColBg], strdup(dest)); - - // input - if (config_setting_lookup_string(conf, "inputfg", &dest)) - strcpy(colors[SchemeInput][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "inputbg", &dest)) - strcpy(colors[SchemeInput][ColBg], strdup(dest)); - - // menu - if (config_setting_lookup_string(conf, "menu", &dest)) - strcpy(colors[SchemeMenu][ColBg], strdup(dest)); - - // prompt - if (config_setting_lookup_string(conf, "promptfg", &dest)) - strcpy(colors[SchemePrompt][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "promptbg", &dest)) - strcpy(colors[SchemePrompt][ColBg], strdup(dest)); - - // arrows - if (config_setting_lookup_string(conf, "larrowfg", &dest)) - strcpy(colors[SchemeLArrow][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "larrowbg", &dest)) - strcpy(colors[SchemeLArrow][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "rarrowfg", &dest)) - strcpy(colors[SchemeRArrow][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "rarrowbg", &dest)) - strcpy(colors[SchemeRArrow][ColBg], strdup(dest)); - - // highlight - if (config_setting_lookup_string(conf, "hlnormfg", &dest)) - strcpy(colors[SchemeNormHighlight][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "hlnormbg", &dest)) - strcpy(colors[SchemeNormHighlight][ColBg], strdup(dest)); - - if (config_setting_lookup_string(conf, "hlselfg", &dest)) - strcpy(colors[SchemeSelHighlight][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "hlselbg", &dest)) - strcpy(colors[SchemeSelHighlight][ColBg], strdup(dest)); - - // number - if (config_setting_lookup_string(conf, "numfg", &dest)) - strcpy(colors[SchemeNumber][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "numbg", &dest)) - strcpy(colors[SchemeNumber][ColBg], strdup(dest)); - - // mode - if (config_setting_lookup_string(conf, "modefg", &dest)) - strcpy(colors[SchemeMode][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "modebg", &dest)) - strcpy(colors[SchemeMode][ColBg], strdup(dest)); - - // caps - if (config_setting_lookup_string(conf, "capsfg", &dest)) - strcpy(colors[SchemeCaps][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "capsbg", &dest)) - strcpy(colors[SchemeCaps][ColBg], strdup(dest)); - - // border - if (config_setting_lookup_string(conf, "border", &dest)) - strcpy(colors[SchemeBorder][ColBg], strdup(dest)); - - // caret - if (config_setting_lookup_string(conf, "caretfg", &dest)) - strcpy(colors[SchemeCaret][ColFg], strdup(dest)); - - if (config_setting_lookup_string(conf, "caretbg", &dest)) - strcpy(colors[SchemeCaret][ColBg], strdup(dest)); - - // sgr colors - if (config_setting_lookup_string(conf, "sgr0", &dest)) - strcpy(textcolors[0], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr1", &dest)) - strcpy(textcolors[1], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr2", &dest)) - strcpy(textcolors[2], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr3", &dest)) - strcpy(textcolors[3], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr4", &dest)) - strcpy(textcolors[4], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr5", &dest)) - strcpy(textcolors[5], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr6", &dest)) - strcpy(textcolors[6], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr7", &dest)) - strcpy(textcolors[7], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr8", &dest)) - strcpy(textcolors[8], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr9", &dest)) - strcpy(textcolors[9], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr10", &dest)) - strcpy(textcolors[10], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr11", &dest)) - strcpy(textcolors[11], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr12", &dest)) - strcpy(textcolors[12], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr13", &dest)) - strcpy(textcolors[13], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr14", &dest)) - strcpy(textcolors[14], strdup(dest)); - if (config_setting_lookup_string(conf, "sgr15", &dest)) - strcpy(textcolors[15], strdup(dest)); - - // coloritems int - config_setting_lookup_int(conf, "coloritems", &coloritems); - config_setting_lookup_int(conf, "sgr", &sgr); + // look up + config_setting_lookup_int(conf, "width", &imagewidth); // spmenu.image.width + config_setting_lookup_int(conf, "height", &imageheight); // spmenu.image.height + config_setting_lookup_int(conf, "gaps", &imageheight); // spmenu.image.gaps + config_setting_lookup_int(conf, "position", &imageposition); // spmenu.image.position + config_setting_lookup_int(conf, "cache", &generatecache); // spmenu.image.cache + config_setting_lookup_int(conf, "maxcache", &maxcache); // spmenu.image.maxcache + if (config_setting_lookup_string(conf, "cachedir", &dest)) // spmenu.image.cachedir + cachedir = strdup(dest); + } } - } - // load options spmenu.image - config_setting_t *img_setting = config_lookup(&cfg, "spmenu.image"); - if (img_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(img_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(img_setting, i); + // load options spmenu.file + config_setting_t *file_setting = config_lookup(&cfg, "spmenu.file"); + if (file_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(file_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(file_setting, i); - // look up - config_setting_lookup_int(conf, "width", &imagewidth); // spmenu.image.width - config_setting_lookup_int(conf, "height", &imageheight); // spmenu.image.height - config_setting_lookup_int(conf, "gaps", &imageheight); // spmenu.image.gaps - config_setting_lookup_int(conf, "position", &imageposition); // spmenu.image.position - config_setting_lookup_int(conf, "cache", &generatecache); // spmenu.image.cache - config_setting_lookup_int(conf, "maxcache", &maxcache); // spmenu.image.maxcache - if (config_setting_lookup_string(conf, "cachedir", &dest)) // spmenu.image.cachedir - cachedir = strdup(dest); + // look up + config_setting_lookup_int(conf, "theme", &loadtheme); // spmenu.file.theme + config_setting_lookup_int(conf, "binds", &loadbinds); // spmenu.file.binds + config_setting_lookup_int(conf, "global", &globalcolors); // spmenu.file.global + config_setting_lookup_int(conf, "xresources", &xresources); // spmenu.file.xresources + } } - } - // load options spmenu.file - config_setting_t *file_setting = config_lookup(&cfg, "spmenu.file"); - if (file_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(file_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(file_setting, i); + // load options spmenu.input + config_setting_t *input_setting = config_lookup(&cfg, "spmenu.input"); + if (input_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(input_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(input_setting, i); - // look up - config_setting_lookup_int(conf, "theme", &loadtheme); // spmenu.file.theme - config_setting_lookup_int(conf, "global", &globalcolors); // spmenu.file.global - config_setting_lookup_int(conf, "xresources", &xresources); // spmenu.file.xresources + // look up + config_setting_lookup_int(conf, "fast", &fast); // spmenu.input.fast + config_setting_lookup_int(conf, "type", &type); // spmenu.input.type + config_setting_lookup_int(conf, "password", &passwd); // spmenu.input.password + } } - } - // load options spmenu.input - config_setting_t *input_setting = config_lookup(&cfg, "spmenu.input"); - if (input_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(input_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(input_setting, i); + // load options spmenu.output + config_setting_t *output_setting = config_lookup(&cfg, "spmenu.output"); + if (output_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(output_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(output_setting, i); - // look up - config_setting_lookup_int(conf, "fast", &fast); // spmenu.input.fast - config_setting_lookup_int(conf, "type", &type); // spmenu.input.type - config_setting_lookup_int(conf, "password", &passwd); // spmenu.input.password + // look up + config_setting_lookup_int(conf, "printindex", &printindex); // spmenu.output.printindex + config_setting_lookup_int(conf, "incremental", &incremental); // spmenu.output.incremental + } } - } - // load options spmenu.output - config_setting_t *output_setting = config_lookup(&cfg, "spmenu.output"); - if (output_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(output_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(output_setting, i); + // load options spmenu.mode + config_setting_t *mode_setting = config_lookup(&cfg, "spmenu.mode"); + if (mode_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(mode_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(mode_setting, i); - // look up - config_setting_lookup_int(conf, "printindex", &printindex); // spmenu.output.printindex - config_setting_lookup_int(conf, "incremental", &incremental); // spmenu.output.incremental + // look up + config_setting_lookup_int(conf, "default", &mode); // spmenu.mode.default + + config_setting_lookup_string(conf, "normal_text", &dest); // spmenu.mode.normal_text + normtext = strdup(dest); + + config_setting_lookup_string(conf, "insert_text", &dest); // spmenu.mode.insert_text + instext = strdup(dest); + } } - } - // load options spmenu.mode - config_setting_t *mode_setting = config_lookup(&cfg, "spmenu.mode"); - if (mode_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(mode_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(mode_setting, i); + // load options spmenu.match + config_setting_t *match_setting = config_lookup(&cfg, "spmenu.match"); + if (match_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(match_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(match_setting, i); - // look up - config_setting_lookup_int(conf, "default", &mode); // spmenu.mode.default - - config_setting_lookup_string(conf, "normal_text", &dest); // spmenu.mode.normal_text - normtext = strdup(dest); - - config_setting_lookup_string(conf, "insert_text", &dest); // spmenu.mode.insert_text - instext = strdup(dest); + // look up + config_setting_lookup_int(conf, "sort", &sortmatches); // spmenu.match.sort + config_setting_lookup_int(conf, "casesensitive", &casesensitive); // spmenu.match.casesensitive + config_setting_lookup_int(conf, "fuzzy", &fuzzy); // spmenu.match.fuzzy + config_setting_lookup_int(conf, "preselected", &preselected); // spmenu.match.preselected + config_setting_lookup_int(conf, "mark", &mark); // spmenu.match.mark + config_setting_lookup_int(conf, "accuratewidth", &accuratewidth); // spmenu.match.accuratewidth + config_setting_lookup_string(conf, "delimiters", &dest); // spmenu.match.delimiters + worddelimiters = strdup(dest); + if (config_setting_lookup_string(conf, "listfile", &dest)) // spmenu.match.listfile + if (dest && strcmp(strdup(dest), "NULL")) + listfile = strdup(dest); + } } - } - // load options spmenu.match - config_setting_t *match_setting = config_lookup(&cfg, "spmenu.match"); - if (match_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(match_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(match_setting, i); + // load options spmenu.line + config_setting_t *line_setting = config_lookup(&cfg, "spmenu.line"); + if (line_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(line_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(line_setting, i); - // look up - config_setting_lookup_int(conf, "sort", &sortmatches); // spmenu.match.sort - config_setting_lookup_int(conf, "casesensitive", &casesensitive); // spmenu.match.casesensitive - config_setting_lookup_int(conf, "fuzzy", &fuzzy); // spmenu.match.fuzzy - config_setting_lookup_int(conf, "preselected", &preselected); // spmenu.match.preselected - config_setting_lookup_int(conf, "mark", &mark); // spmenu.match.mark - config_setting_lookup_int(conf, "accuratewidth", &accuratewidth); // spmenu.match.accuratewidth - config_setting_lookup_string(conf, "delimiters", &dest); // spmenu.match.delimiters - worddelimiters = strdup(dest); - if (config_setting_lookup_string(conf, "listfile", &dest)) // spmenu.match.listfile - if (dest && strcmp(strdup(dest), "NULL")) - listfile = strdup(dest); + // look up + config_setting_lookup_int(conf, "height", &lineheight); // spmenu.line.height + config_setting_lookup_int(conf, "lines", &lines); // spmenu.line.lines + config_setting_lookup_int(conf, "columns", &columns); // spmenu.line.columns + config_setting_lookup_int(conf, "indentitems", &indentitems); // spmenu.line.indentitems + } } - } - // load options spmenu.line - config_setting_t *line_setting = config_lookup(&cfg, "spmenu.line"); - if (line_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(line_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(line_setting, i); + // load options spmenu.history + config_setting_t *hist_setting = config_lookup(&cfg, "spmenu.history"); + if (hist_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(hist_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(hist_setting, i); - // look up - config_setting_lookup_int(conf, "height", &lineheight); // spmenu.line.height - config_setting_lookup_int(conf, "lines", &lines); // spmenu.line.lines - config_setting_lookup_int(conf, "columns", &columns); // spmenu.line.columns - config_setting_lookup_int(conf, "indentitems", &indentitems); // spmenu.line.indentitems + // look up + config_setting_lookup_int(conf, "max", &maxhist); // spmenu.history.max + config_setting_lookup_int(conf, "duplicate", &histdup); // spmenu.history.duplicate + } } - } - // load options spmenu.history - config_setting_t *hist_setting = config_lookup(&cfg, "spmenu.history"); - if (hist_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(hist_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(hist_setting, i); + // load options spmenu.hide + config_setting_t *hide_setting = config_lookup(&cfg, "spmenu.hide"); + if (hide_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(hide_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(hide_setting, i); - // look up - config_setting_lookup_int(conf, "max", &maxhist); // spmenu.history.max - config_setting_lookup_int(conf, "duplicate", &histdup); // spmenu.history.duplicate + // look up + config_setting_lookup_int(conf, "input", &hideinput); // spmenu.hide.input + config_setting_lookup_int(conf, "larrow", &hidelarrow); // spmenu.hide.larrow + config_setting_lookup_int(conf, "rarrow", &hiderarrow); // spmenu.hide.rarrow + config_setting_lookup_int(conf, "prompt", &hideprompt); // spmenu.hide.prompt + config_setting_lookup_int(conf, "items", &hideitem); // spmenu.hide.items + config_setting_lookup_int(conf, "powerline", &hidepowerline); // spmenu.hide.powerline + config_setting_lookup_int(conf, "caret", &hidecaret); // spmenu.hide.caret + config_setting_lookup_int(conf, "highlight", &hidehighlight); // spmenu.hide.highlight + config_setting_lookup_int(conf, "matchcount", &hidematchcount); // spmenu.hide.matchcount + config_setting_lookup_int(conf, "mode", &hidemode); // spmenu.hide.mode + config_setting_lookup_int(conf, "caps", &hidecaps); // spmenu.hide.caps + config_setting_lookup_int(conf, "hideimage", &hideimage); // spmenu.hide.image + } } - } - // load options spmenu.hide - config_setting_t *hide_setting = config_lookup(&cfg, "spmenu.hide"); - if (hide_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(hide_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(hide_setting, i); + // load options spmenu.pango + config_setting_t *pango_setting = config_lookup(&cfg, "spmenu.pango"); + if (pango_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(pango_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(pango_setting, i); - // look up - config_setting_lookup_int(conf, "input", &hideinput); // spmenu.hide.input - config_setting_lookup_int(conf, "larrow", &hidelarrow); // spmenu.hide.larrow - config_setting_lookup_int(conf, "rarrow", &hiderarrow); // spmenu.hide.rarrow - config_setting_lookup_int(conf, "prompt", &hideprompt); // spmenu.hide.prompt - config_setting_lookup_int(conf, "items", &hideitem); // spmenu.hide.items - config_setting_lookup_int(conf, "powerline", &hidepowerline); // spmenu.hide.powerline - config_setting_lookup_int(conf, "caret", &hidecaret); // spmenu.hide.caret - config_setting_lookup_int(conf, "highlight", &hidehighlight); // spmenu.hide.highlight - config_setting_lookup_int(conf, "matchcount", &hidematchcount); // spmenu.hide.matchcount - config_setting_lookup_int(conf, "mode", &hidemode); // spmenu.hide.mode - config_setting_lookup_int(conf, "caps", &hidecaps); // spmenu.hide.caps - config_setting_lookup_int(conf, "hideimage", &hideimage); // spmenu.hide.image + // look up + config_setting_lookup_int(conf, "item", &pango_item); // spmenu.pango.input + config_setting_lookup_int(conf, "highlight", &pango_highlight); // spmenu.pango.highlight + config_setting_lookup_int(conf, "prompt", &pango_prompt); // spmenu.pango.rarrow + config_setting_lookup_int(conf, "input", &pango_input); // spmenu.pango.input + config_setting_lookup_int(conf, "leftarrow", &pango_leftarrow); // spmenu.pango.leftarrow + config_setting_lookup_int(conf, "rightarrow", &pango_rightarrow); // spmenu.pango.rightarrow + config_setting_lookup_int(conf, "numbers", &pango_numbers); // spmenu.pango.numbers + config_setting_lookup_int(conf, "mode", &pango_mode); // spmenu.pango.mode + config_setting_lookup_int(conf, "caps", &pango_caps); // spmenu.pango.caps + config_setting_lookup_int(conf, "password", &pango_password); // spmenu.pango.mode + } } - } - // load options spmenu.pango - config_setting_t *pango_setting = config_lookup(&cfg, "spmenu.pango"); - if (pango_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(pango_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(pango_setting, i); + // load options spmenu.keys + config_setting_t *key_setting = config_lookup(&cfg, "spmenu.keys"); + if (key_setting != NULL) { + int nmode = 0; - // look up - config_setting_lookup_int(conf, "item", &pango_item); // spmenu.pango.input - config_setting_lookup_int(conf, "highlight", &pango_highlight); // spmenu.pango.highlight - config_setting_lookup_int(conf, "prompt", &pango_prompt); // spmenu.pango.rarrow - config_setting_lookup_int(conf, "input", &pango_input); // spmenu.pango.input - config_setting_lookup_int(conf, "leftarrow", &pango_leftarrow); // spmenu.pango.leftarrow - config_setting_lookup_int(conf, "rightarrow", &pango_rightarrow); // spmenu.pango.rightarrow - config_setting_lookup_int(conf, "numbers", &pango_numbers); // spmenu.pango.numbers - config_setting_lookup_int(conf, "mode", &pango_mode); // spmenu.pango.mode - config_setting_lookup_int(conf, "caps", &pango_caps); // spmenu.pango.caps - config_setting_lookup_int(conf, "password", &pango_password); // spmenu.pango.mode - } - } + for (unsigned int i = 0; i < config_setting_length(key_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(key_setting, i); - // load options spmenu.keys - config_setting_t *key_setting = config_lookup(&cfg, "spmenu.keys"); - if (key_setting != NULL) { - int nmode = 0; + // look up + config_setting_lookup_string(conf, "modifier", &dest); - for (unsigned int i = 0; i < config_setting_length(key_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(key_setting, i); - - // look up - config_setting_lookup_string(conf, "modifier", &dest); - - for (int j = 0; j < LENGTH(ml); j++) { - if (!strcmp(ml[j].mod, strdup(dest))) { - ckeys[i].mod = ml[j].modifier; + for (int j = 0; j < LENGTH(ml); j++) { + if (!strcmp(ml[j].mod, strdup(dest))) { + ckeys[i].mod = ml[j].modifier; + } } - } - if (config_setting_lookup_int(conf, "mode", &nmode)) { - ckeys[i].mode = nmode; - } - - config_setting_lookup_string(conf, "key", &dest); - - for (int j = 0; j < LENGTH(kl); j++) { - if (!strcmp(kl[j].key, strdup(dest))) { - ckeys[i].keysym = kl[j].keysym; + if (config_setting_lookup_int(conf, "mode", &nmode)) { + ckeys[i].mode = nmode; } - } - config_setting_lookup_string(conf, "function", &dest); + config_setting_lookup_string(conf, "key", &dest); - for (int j = 0; j < LENGTH(fl); j++) { - if (!strcmp(fl[j].function, strdup(dest))) { - ckeys[i].func = fl[j].func; + for (int j = 0; j < LENGTH(kl); j++) { + if (!strcmp(kl[j].key, strdup(dest))) { + ckeys[i].keysym = kl[j].keysym; + } } - } - config_setting_lookup_string(conf, "argument", &dest); + config_setting_lookup_string(conf, "function", &dest); - for (int j = 0; j < LENGTH(al); j++) { - if (!strcmp(al[j].argument, strdup(dest))) { - ckeys[i].arg = al[j].arg; + for (int j = 0; j < LENGTH(fl); j++) { + if (!strcmp(fl[j].function, strdup(dest))) { + ckeys[i].func = fl[j].func; + } } - } - config_setting_lookup_int(conf, "ignoreglobalkeys", &ignoreglobalkeys); + config_setting_lookup_string(conf, "argument", &dest); + + for (int j = 0; j < LENGTH(al); j++) { + if (!strcmp(al[j].argument, strdup(dest))) { + ckeys[i].arg = al[j].arg; + } + } + + config_setting_lookup_int(conf, "ignoreglobalkeys", &ignoreglobalkeys); + } } + + // load options spmenu.mouse + config_setting_t *mouse_setting = config_lookup(&cfg, "spmenu.mouse"); + if (mouse_setting != NULL) { + for (unsigned int i = 0; i < config_setting_length(mouse_setting); ++i) { + config_setting_t *conf = config_setting_get_elem(mouse_setting, i); + + for (int j = 0; j < LENGTH(ctp); j++) { + if (!strcmp(ctp[j].tclick, strdup(dest))) { + cbuttons[i].click = ctp[j].click; + } + } + + // look up + config_setting_lookup_string(conf, "modifier", &dest); + + for (int j = 0; j < LENGTH(ml); j++) { + if (!strcmp(ml[j].mod, strdup(dest))) { + cbuttons[i].mask = ml[j].modifier; + } + } + + config_setting_lookup_string(conf, "button", &dest); + + for (int j = 0; j < LENGTH(btp); j++) { + if (!strcmp(btp[j].click, strdup(dest))) { + cbuttons[i].button = btp[j].button; + } + } + + config_setting_lookup_string(conf, "function", &dest); + + for (int j = 0; j < LENGTH(fl); j++) { + if (!strcmp(fl[j].function, strdup(dest))) { + cbuttons[i].func = fl[j].func; + } + } + + config_setting_lookup_string(conf, "argument", &dest); + + for (int j = 0; j < LENGTH(al); j++) { + if (!strcmp(al[j].argument, strdup(dest))) { + cbuttons[i].arg = al[j].arg; + } + } + + config_setting_lookup_int(conf, "ignoreglobalmouse", &ignoreglobalmouse); + } + } + + // we're done with this config + config_destroy(&cfg); } - // load options spmenu.mouse - config_setting_t *mouse_setting = config_lookup(&cfg, "spmenu.mouse"); - if (mouse_setting != NULL) { - for (unsigned int i = 0; i < config_setting_length(mouse_setting); ++i) { - config_setting_t *conf = config_setting_get_elem(mouse_setting, i); - - // look up - config_setting_lookup_string(conf, "click", &dest); - - for (int j = 0; j < LENGTH(ctp); j++) { - if (!strcmp(ctp[j].tclick, strdup(dest))) { - cbuttons[i].click = ctp[j].click; - } - } - - // look up - config_setting_lookup_string(conf, "modifier", &dest); - - for (int j = 0; j < LENGTH(ml); j++) { - if (!strcmp(ml[j].mod, strdup(dest))) { - cbuttons[i].mask = ml[j].modifier; - } - } - - config_setting_lookup_string(conf, "button", &dest); - - for (int j = 0; j < LENGTH(btp); j++) { - if (!strcmp(btp[j].click, strdup(dest))) { - cbuttons[i].button = btp[j].button; - } - } - - config_setting_lookup_string(conf, "function", &dest); - - for (int j = 0; j < LENGTH(fl); j++) { - if (!strcmp(fl[j].function, strdup(dest))) { - cbuttons[i].func = fl[j].func; - } - } - - config_setting_lookup_string(conf, "argument", &dest); - - for (int j = 0; j < LENGTH(al); j++) { - if (!strcmp(al[j].argument, strdup(dest))) { - cbuttons[i].arg = al[j].arg; - } - } - - config_setting_lookup_int(conf, "ignoreglobalmouse", &ignoreglobalmouse); - } + // load the theme now + if (loadtheme) { + theme_load(); + } + + if (loadbinds) { + if (!argbinds) { + if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) { + home = getenv("HOME"); + + if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", home, ".config/spmenu/binds.conf") + 1))) { + die("spmenu: failed to malloc bindfile"); + } + + sprintf(bindfile, "%s/%s", home, ".config/spmenu/binds.conf"); + } else { + if (!(bindfile = malloc(snprintf(NULL, 0, "%s/%s", xdg_conf, "spmenu/binds.conf") + 1))) { + die("spmenu: failed to malloc bindfile"); + } + + sprintf(bindfile, "%s/%s", xdg_conf, "spmenu/binds.conf"); + } + } else { // custom keys path + if (!(bindfile = malloc(snprintf(NULL, 0, "%s", argbinds) + 1))) { + die("spmenu: failed to malloc bindfile"); + } + + sprintf(bindfile, "%s", argbinds); + } + + // don't bother trying to load if it doesn't exist. + if (access(bindfile, F_OK) != 0) { + return; + } + + // init config + config_t bind; + + config_init(&bind); + + // attempt to read config file to cfg + if (!config_read_file(&bind, bindfile)) { + // invalid configuration, but let's try to read it anyway + fprintf(stderr, "spmenu: Invalid keys file.\n"); + } + + // load options binds.keys + config_setting_t *key_bind = config_lookup(&bind, "bind.keys"); + if (key_bind != NULL) { + int nmode = 0; + + memset(ckeys, '\0', LENGTH(ckeys)-1); + for (unsigned int i = 0; i < config_setting_length(key_bind); ++i) { + config_setting_t *conf = config_setting_get_elem(key_bind, i); + + // look up + config_setting_lookup_string(conf, "modifier", &dest); + + for (int j = 0; j < LENGTH(ml); j++) { + if (!strcmp(ml[j].mod, strdup(dest))) { + ckeys[i].mod = ml[j].modifier; + } + } + + if (config_setting_lookup_int(conf, "mode", &nmode)) { + ckeys[i].mode = nmode; + } + + config_setting_lookup_string(conf, "key", &dest); + + for (int j = 0; j < LENGTH(kl); j++) { + if (!strcmp(kl[j].key, strdup(dest))) { + ckeys[i].keysym = kl[j].keysym; + } + } + + config_setting_lookup_string(conf, "function", &dest); + + for (int j = 0; j < LENGTH(fl); j++) { + if (!strcmp(fl[j].function, strdup(dest))) { + ckeys[i].func = fl[j].func; + } + } + + config_setting_lookup_string(conf, "argument", &dest); + + for (int j = 0; j < LENGTH(al); j++) { + if (!strcmp(al[j].argument, strdup(dest))) { + ckeys[i].arg = al[j].arg; + } + } + + config_setting_lookup_int(conf, "ignoreglobalkeys", &ignoreglobalkeys); + } + } + + // load options binds.mouse + config_setting_t *mouse_bind = config_lookup(&bind, "bind.mouse"); + if (mouse_bind != NULL) { + memset(cbuttons, '\0', LENGTH(cbuttons)-1); + for (unsigned int i = 0; i < config_setting_length(mouse_bind); ++i) { + config_setting_t *conf = config_setting_get_elem(mouse_bind, i); + + // look up + config_setting_lookup_string(conf, "click", &dest); + + for (int j = 0; j < LENGTH(ctp); j++) { + if (!strcmp(ctp[j].tclick, strdup(dest))) { + cbuttons[i].click = ctp[j].click; + } + } + + // look up + config_setting_lookup_string(conf, "modifier", &dest); + + for (int j = 0; j < LENGTH(ml); j++) { + if (!strcmp(ml[j].mod, strdup(dest))) { + cbuttons[i].mask = ml[j].modifier; + } + } + + config_setting_lookup_string(conf, "button", &dest); + + for (int j = 0; j < LENGTH(btp); j++) { + if (!strcmp(btp[j].click, strdup(dest))) { + cbuttons[i].button = btp[j].button; + } + } + + config_setting_lookup_string(conf, "function", &dest); + + for (int j = 0; j < LENGTH(fl); j++) { + if (!strcmp(fl[j].function, strdup(dest))) { + cbuttons[i].func = fl[j].func; + } + } + + config_setting_lookup_string(conf, "argument", &dest); + + for (int j = 0; j < LENGTH(al); j++) { + if (!strcmp(al[j].argument, strdup(dest))) { + cbuttons[i].arg = al[j].arg; + } + } + + config_setting_lookup_int(conf, "ignoreglobalmouse", &ignoreglobalmouse); + } + } + + // finally done + config_destroy(&bind); } - // we're done here - config_destroy(&cfg); - if (loadtheme) theme_load(); return; } diff --git a/libs/theme/theme.c b/libs/theme/theme.c index 6c8742a..998778b 100644 --- a/libs/theme/theme.c +++ b/libs/theme/theme.c @@ -10,7 +10,7 @@ void theme_load(void) { if (!loadconfig) return; // get path for configuration file - if (!ctheme || !argtheme) { + if (!argtheme) { if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) { // ~/.config/spmenu/theme.conf home = getenv("HOME"); diff --git a/options.h b/options.h index bc98e61..94dd8a7 100644 --- a/options.h +++ b/options.h @@ -9,8 +9,9 @@ static char *class = "spmenu"; /* Class for spmenu */ static int fast = 0; /* Grab keyboard first */ static int xresources = 1; /* Enable .Xresources support */ static int globalcolors = 1; /* Recognize global colors (such as colors generated by Pywal) */ -static int loadconfig = 1; /* Load configuration (~/.spmenu.conf or ~/.config/spmenu/spmenu.conf) on runtime */ +static int loadconfig = 1; /* Load configuration (~/.config/spmenu/spmenu.conf) on runtime */ static int loadtheme = 1; /* Load theme (~/.theme.conf or ~/.config/spmenu/theme.conf) on runtime */ +static int loadbinds = 1; /* Load keybind file (~/.config/spmenu/binds.conf) on runtime */ static int mon = -1; /* Monitor to run spmenu on */ /* Window options */ diff --git a/scripts/spmenu_run b/scripts/spmenu_run index 2f919ec..10f5e77 100755 --- a/scripts/spmenu_run +++ b/scripts/spmenu_run @@ -36,8 +36,8 @@ DMENU_COMPAT="${DMENU_COMPAT:-false}" AUTOREFRESH="${AUTOREFRESH:-false}" MULTISELECT="${MULTISELECT:-true}" -DESKTOP_DIR="${DESKTOP_DIR:-${DESTDIR}${PREFIX}/share/applications}" -ICON_DIR="${ICON_DIR:-${DESTDIR}${PREFIX}/share/icons/hicolor ${DESTDIR}${PREFIX}/share/pixmaps}" +DESKTOP_DIR="${DESKTOP_DIR:-${DESTDIR}${PREFIX}/share/applications ${HOME}/.local/share/applications}" +ICON_DIR="${ICON_DIR:-${DESTDIR}${PREFIX}/share/icons/hicolor ${HOME}/.local/share/icons/hicolor ${DESTDIR}${PREFIX}/share/pixmaps}" TEMPORARY_DIR="${TEMPORARY_DIR:-$CONFDIR/spmenu/run/cache}" IMAGE="${IMAGE:-true}" LOGFILE="${LOGFILE:-/tmp/spmenu_run.log}" @@ -247,8 +247,8 @@ DEFAULT_FEATURE="run" # spmenu_run default feature (run/fm/desktop/help) HELP_COLOR="#FFFF00" # .desktop options -DESKTOP_DIR="\${DESTDIR}\${PREFIX}/share/applications" # Directories for .desktop entries -ICON_DIR="\${DESTDIR}\${PREFIX}/share/icons/hicolor \${DESTDIR}\${PREFIX}/share/pixmaps" # Directories for icons defined in the entries +DESKTOP_DIR="\${DESTDIR}\${PREFIX}/share/applications \${HOME}/.local/share/applications" # Directories for .desktop entries +ICON_DIR="\${DESTDIR}\${PREFIX}/share/icons/hicolor \${HOME}/.local/share/icons/hicolor \${DESTDIR}\${PREFIX}/share/pixmaps" # Directories for icons defined in the entries TEMPORARY_DIR="\$CONFDIR/spmenu/run/cache" # Directory used to store cached entries HIDDEN_ENTRY_KEYWORDS="\$HIDDEN_KEYWORDS" # Keywords that will be ignored, needs to be in grep -vE syntax. ENTRY_KEYWORDS="\$KEYWORDS" # Keywords that will be matched, needs to be in grep -E syntax. diff --git a/spmenu.1 b/spmenu.1 index e324307..6c36161 100644 --- a/spmenu.1 +++ b/spmenu.1 @@ -362,21 +362,31 @@ Useful for testing Set config file to load to file .TP \f[V]-lcfg, --load-config\f[R] -Load spmenu configuration (\[ti]/.spmenu.conf or -\[ti]/.config/spmenu/spmenu.conf) +Load spmenu configuration (\[ti]/.config/spmenu/spmenu.conf) on runtime .TP \f[V]-ncfg, --no-load-config\f[R] -Don\[cq]t load spmenu configuration (\[ti]/.spmenu.conf or -\[ti]/.config/spmenu/spmenu.conf) +Don\[cq]t load spmenu configuration (\[ti]/.config/spmenu/spmenu.conf) +on runtime +.TP +\f[V]-bf, --bind-file file\f[R] +Set bind file to load to file +.TP +\f[V]-lbi, --load-binds\f[R] +Exclusively load binds from file (\[ti]/.config/spmenu/binds.conf) on +runtime +.TP +\f[V]-nlbi, --no-load-binds\f[R] +Don\[cq]t exclusively load binds from file +(\[ti]/.config/spmenu/binds.conf) on runtime .TP \f[V]-tm, --theme theme\f[R] -Load theme `theme' on runtime. +Load theme `theme' on runtime .TP \f[V]-ltm, --load-theme\f[R] -Load theme +Load theme (\[ti]/.config/spmenu/theme.conf) on runtime .TP \f[V]-nltm, --no-load-theme\f[R] -Don\[cq]t load theme +Don\[cq]t load theme (\[ti]/.config/spmenu/theme.conf) on runtime .TP \f[V]-v, --version\f[R] Print spmenu version to stdout @@ -1538,3 +1548,9 @@ me. .SS See also .IP \[bu] 2 spmenu_run(1) +.IP \[bu] 2 +spmenu wiki (https://spmenu.speedie.site) +.IP \[bu] 2 +spmenu git repository (https://git.speedie.site/spmenu) +.IP \[bu] 2 +spmenu GitHub mirror (https://github.com/speediegq/spmenu) diff --git a/spmenu.c b/spmenu.c index d927dc2..42f5880 100644 --- a/spmenu.c +++ b/spmenu.c @@ -191,10 +191,9 @@ static int fullscreen = 0; // config file #if USECONFIG -static int cconf = 0; // use custom config path? -static int ctheme = 0; // use custom theme path? static char *argconf = NULL; // arg config path static char *argtheme = NULL; // arg theme path +static char *argbinds = NULL; // arg binds path #endif // set an integer to 1 if we have rtl enabled, this saves a lot of lines and duplicate code diff --git a/spmenu.html b/spmenu.html index dc9d674..8636ffd 100644 --- a/spmenu.html +++ b/spmenu.html @@ -602,25 +602,38 @@ Set config file to load to file
-lcfg, --load-config
-Load spmenu configuration (~/.spmenu.conf or -~/.config/spmenu/spmenu.conf) +Load spmenu configuration (~/.config/spmenu/spmenu.conf) on runtime
-ncfg, --no-load-config
-Don’t load spmenu configuration (~/.spmenu.conf or -~/.config/spmenu/spmenu.conf) +Don’t load spmenu configuration (~/.config/spmenu/spmenu.conf) on +runtime +
+
-bf, --bind-file file
+
+Set bind file to load to file +
+
-lbi, --load-binds
+
+Exclusively load binds from file (~/.config/spmenu/binds.conf) on +runtime +
+
-nlbi, --no-load-binds
+
+Don’t exclusively load binds from file (~/.config/spmenu/binds.conf) on +runtime
-tm, --theme theme
-Load theme ‘theme’ on runtime. +Load theme ‘theme’ on runtime
-ltm, --load-theme
-Load theme +Load theme (~/.config/spmenu/theme.conf) on runtime
-nltm, --no-load-theme
-Don’t load theme +Don’t load theme (~/.config/spmenu/theme.conf) on runtime
-v, --version
@@ -1541,6 +1554,11 @@ alternatively email me.

See also

diff --git a/spmenu_run.1 b/spmenu_run.1 index 460f9b3..3a15bf5 100644 --- a/spmenu_run.1 +++ b/spmenu_run.1 @@ -196,3 +196,9 @@ me. .SS See also .IP \[bu] 2 spmenu(1) +.IP \[bu] 2 +spmenu wiki (https://spmenu.speedie.site) +.IP \[bu] 2 +spmenu git repository (https://git.speedie.site/spmenu) +.IP \[bu] 2 +spmenu GitHub mirror (https://github.com/speediegq/spmenu)