diff --git a/docs/docs.md b/docs/docs.md index 3e9739c..90233fb 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -278,11 +278,15 @@ You may use long, descriptive arguments or the shorter arguments. `-nwm, --unmanaged` : Don't spawn spmenu as a window manager controlled client/window. Useful for testing +`-cf, --config-file file` +: Set config file to load to file + `-lcfg, --load-config` -: Load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc) +: Load spmenu configuration (~/.config/spmenu/spmenu.conf, ~/.spmenurc or ~/.config/spmenu/spmenurc) `-ncfg, --no-load-config` -: Don't load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc) +: Don't load spmenu configuration (~/.config/spmenu/spmenu.conf, ~/.spmenurc +or ~/.config/spmenu/spmenurc) `-v, --version` : Print spmenu version to stdout diff --git a/libs/argv.c b/libs/argv.c index cb1e1a7..712d0c2 100644 --- a/libs/argv.c +++ b/libs/argv.c @@ -4,7 +4,7 @@ readargs(int argc, char *argv[]) int i = 0; int j = 0; - int cxrdb = 0; + int profilecmd = 0; // check if we should load the xrdb/config, because it needs to be loaded before arguments are checked // priority: internal -> config -> xresources -> arguments @@ -21,6 +21,13 @@ readargs(int argc, char *argv[]) globalcolors = 1; } else if (!strcmp(argv[j], "-ngbc") || (!strcmp(argv[j], "--no-global-colors"))) { globalcolors = 0; + } 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"); + } } } @@ -34,10 +41,10 @@ readargs(int argc, char *argv[]) // also load config/profile if .Xresources if (loadconfig) { - cxrdb = system("command -v spmenu_profile > /dev/null && spmenu_profile --spmenu-load-default-profile > /dev/null"); + profilecmd = system("command -v spmenu_profile > /dev/null && spmenu_profile --spmenu-load-default-profile > /dev/null"); } - if (!cxrdb||cxrdb) // load .Xresources, cxrdb is only here to avoid an annoying gcc warning + if (!profilecmd||profilecmd) // load .Xresources, profilecmd is only here to avoid an annoying gcc warning load_xresources(); } @@ -170,6 +177,9 @@ readargs(int argc, char *argv[]) || !strcmp(argv[i], "-ngbc") || !strcmp(argv[i], "--global-colors") || !strcmp(argv[i], "--no-global-colors") + || !strcmp(argv[i], "-cf") + || !strcmp(argv[i], "--config-file") + || !strcmp(argv[i], argconf) )) continue; else @@ -350,6 +360,13 @@ readargs(int argc, char *argv[]) || !strcmp(argv[i], "-ncfg") || !strcmp(argv[i], "--load-config") || !strcmp(argv[i], "--no-load-config") + || !strcmp(argv[i], "-gbc") + || !strcmp(argv[i], "-ngbc") + || !strcmp(argv[i], "--global-colors") + || !strcmp(argv[i], "--no-global-colors") + || !strcmp(argv[i], "-cf") + || !strcmp(argv[i], "--config-file") + || !strcmp(argv[i], argconf) )) continue; else @@ -460,8 +477,9 @@ usage(void) "spmenu -itc, --image-topcenter Position the image in the top center\n" "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 -lcfg, --load-config Load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc)\n" - "spmenu -ncfg, --no-load-config Don't load spmenu configuration (~/.spmenu or ~/.config/spmenu/spmenurc)\n" + "spmenu -cf, --config-file Set config file to load to \n" + "spmenu -lcfg, --load-config Load spmenu configuration (~/.config/spmenu/spmenu.conf, ~/.spmenu or ~/.config/spmenu/spmenurc)\n" + "spmenu -ncfg, --no-load-config Don't load spmenu configuration (~/.config/spmenu/spmenu.conf, ~/.spmenu or ~/.config/spmenu/spmenurc)\n" "spmenu -v, --version Print spmenu version to stdout\n" "\n", stdout); diff --git a/libs/conf/config.c b/libs/conf/config.c index 37cd990..c9bbce2 100644 --- a/libs/conf/config.c +++ b/libs/conf/config.c @@ -12,24 +12,32 @@ conf_init(void) if (!loadconfig) return; // get path for configuration file - if (!(xdg_conf = getenv("XDG_CONFIG_HOME"))) { - // ~/.config/spmenu/spmenu.conf - home = getenv("HOME"); + 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))) { + 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"); + } + + // 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"); - } - - // XDG_CONFIG_HOME is set, so let's use that instead - sprintf(cfgfile, "%s/%s", xdg_conf, "spmenu/spmenu.conf"); + sprintf(cfgfile, "%s", argconf); } // don't bother trying to load if it doesn't exist. diff --git a/spmenu.1 b/spmenu.1 index a7447e7..b2a9829 100644 --- a/spmenu.1 +++ b/spmenu.1 @@ -298,13 +298,16 @@ Useful for testing Don\[cq]t spawn spmenu as a window manager controlled client/window. Useful for testing .TP +\f[V]-cf, --config-file file\f[R] +Set config file to load to file +.TP \f[V]-lcfg, --load-config\f[R] -Load spmenu configuration (\[ti]/.spmenu or -\[ti]/.config/spmenu/spmenurc) +Load spmenu configuration (\[ti]/.config/spmenu/spmenu.conf, +\[ti]/.spmenurc or \[ti]/.config/spmenu/spmenurc) .TP \f[V]-ncfg, --no-load-config\f[R] -Don\[cq]t load spmenu configuration (\[ti]/.spmenu or -\[ti]/.config/spmenu/spmenurc) +Don\[cq]t load spmenu configuration (\[ti]/.config/spmenu/spmenu.conf, +\[ti]/.spmenurc or \[ti]/.config/spmenu/spmenurc) .TP \f[V]-v, --version\f[R] Print spmenu version to stdout diff --git a/spmenu.c b/spmenu.c index bfde0c2..0170f95 100644 --- a/spmenu.c +++ b/spmenu.c @@ -161,6 +161,11 @@ static int imageh = 0; static int imageg = 0; #endif +#if USECONFIG +static int cconf = 0; // custom config path +static char *argconf = NULL; +#endif + // set an integer to 1 if we have rtl enabled, this saves a lot of lines and duplicate code #if USERTL static int isrtl = 1;