]> Pileus Git - wmpus/blobdiff - conf.c
Add fullscreen support
[wmpus] / conf.c
diff --git a/conf.c b/conf.c
index da0f5c9d8c654320bfe9e706387184c859f11b65..407165546c72e4c83c8234672753aef4bac011f7 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Andy Spencer <andy753421@gmail.com>
+ * Copyright (c) 2011-2012, Andy Spencer <andy753421@gmail.com>
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -23,7 +23,7 @@
 #include "conf.h"
 
 /* Types */
-typedef enum { number, string } type_t;
+typedef enum { NUMBER, STRING } type_t;
 
 typedef struct {
        type_t  type;
@@ -63,7 +63,7 @@ static void conf_set(const char *key, int num, const char *str)
        if ((entry = conf_get(key))) {
                tdelete(entry, &conf, conf_cmp);
                free(entry->key);
-               if (entry->type == string)
+               if (entry->type == STRING)
                        free(entry->str);
                free(entry);
        }
@@ -72,11 +72,13 @@ static void conf_set(const char *key, int num, const char *str)
        entry = new0(entry_t);
        entry->key = strdup(key);
        if (str) {
-               entry->type = string;
+               entry->type = STRING;
                entry->str  = strdup(str);
+               //printf("set_str: %s = %s\n", key, str);
        } else {
-               entry->type = number;
+               entry->type = NUMBER;
                entry->num  = num;
+               //printf("set_num: %s = %d\n", key, num);
        }
        tsearch(entry, &conf, conf_cmp);
 }
@@ -98,10 +100,10 @@ static char *strtrim(char *str)
 static void load_file(const char *path)
 {
        char line[256]={}, section[256]={};
-       char key[256]={}, val[256]={};
+       char key[256]={}, val[256]={}, fullkey[256]={};
        FILE *fd = fopen(path, "rt");
        if (!fd) return;
-       printf("load_file: %s\n", path);
+       //printf("load_file: %s\n", path);
        while (fgets(line, sizeof(line), fd)) {
                /* Find special characters */
                char *lbrace = strchr(           line   , '[');
@@ -121,27 +123,32 @@ static void load_file(const char *path)
                        /* Check for numbers/plain strings */
                        memcpy(key, line, equal-line);
                        memcpy(val, lquote+1, rquote-lquote-1);
-                       char *_key = strtrim(key);
-                       conf_set_str(_key, val);
-                       printf("  [%s.%s] = [%s]\n", section, _key, val);
+                       snprintf(fullkey, sizeof(key), "%s.%s",
+                                       section, strtrim(key));
+                       if (!strchr(fullkey, ' ')) {
+                               conf_set_str(fullkey, val);
+                               //printf("  [%s] = [%s]\n", fullkey, val);
+                       }
                }
                else if (section[0] && equal) {
                        /* Check for strings */
                        memcpy(key, line, equal-line);
                        strcpy(val, equal+1);
-                       char *_key = strtrim(key);
-                       char *_val = strtrim(val);
-                       char *end;
-                       int num = strtol(_val, &end, 10);
-                       if (end != val && *end == '\0')
-                               conf_set_int(_key, num);
-                       else if (!strcasecmp(_val, "true"))
-                               conf_set_int(_key, 1);
-                       else if (!strcasecmp(_val, "false"))
-                               conf_set_int(_key, 0);
-                       else
-                               conf_set_str(_key, _val);
-                       printf("  [%s.%s] = [%s]\n", section, _key, _val);
+                       snprintf(fullkey, sizeof(key), "%s.%s",
+                                       section, strtrim(key));
+                       if (!strchr(fullkey, ' ')) {
+                               char *end, *trim = strtrim(val);
+                               int num = strtol(trim, &end, 10);
+                               if (end != val && *end == '\0')
+                                       conf_set_int(fullkey, num);
+                               else if (!strcasecmp(trim, "true"))
+                                       conf_set_int(fullkey, 1);
+                               else if (!strcasecmp(trim, "false"))
+                                       conf_set_int(fullkey, 0);
+                               else
+                                       conf_set_str(fullkey, trim);
+                               //printf("  [%s] = [%s]\n", fullkey, trim);
+                       }
                }
        }
        fclose(fd);
@@ -150,13 +157,13 @@ static void load_file(const char *path)
 /* Load config from command line options */
 static struct option long_options[] = {
        /* name hasarg flag val */
-       {"border",  2, NULL, 'b'},
-       {"margin",  2, NULL, 'm'},
-       {"capture", 0, NULL, 'c'},
-       {"int",     1, NULL, 'i'},
-       {"str",     1, NULL, 's'},
-       {"help",    0, NULL, 'h'},
-       {NULL,      0, NULL,  0 },
+       {"no-capture", 0, NULL, 'n'},
+       {"border",     2, NULL, 'b'},
+       {"margin",     2, NULL, 'm'},
+       {"int",        1, NULL, 'i'},
+       {"str",        1, NULL, 's'},
+       {"help",       0, NULL, 'h'},
+       {NULL,         0, NULL,  0 },
 };
 
 static void usage(int argc, char **argv)
@@ -165,9 +172,9 @@ static void usage(int argc, char **argv)
        printf("  %s [OPTION...]\n", argv[0]);
        printf("\n");
        printf("Options:\n");
+       printf("  -n, --no-capture   Do not arrange pre existing windows\n");
        printf("  -b, --border=n     Draw an n pixel window border\n");
        printf("  -m, --margin=n     Leave an n pixel margin around windows\n");
-       printf("  -c, --capture      Automatically arrange all existing windows\n");
        printf("  -i, --int=key=num  Set integer config option\n");
        printf("  -s, --str=key=str  Set string config option\n");
        printf("  -h, --help         Print usage information\n");
@@ -177,19 +184,19 @@ static void load_args(int argc, char **argv)
 {
        char *key, *val;
        while (1) {
-               int c = getopt_long(argc, argv, "b:m:ch", long_options, NULL);
+               int c = getopt_long(argc, argv, "nb:m:i:s:h", long_options, NULL);
                if (c == -1)
                        break;
                switch (c) {
+               case 'n':
+                       conf_set_int("main.no-capture", 1);
+                       break;
                case 'b':
                        conf_set_int("main.border", str2num(optarg, 2));
                        break;
                case 'm':
                        conf_set_int("main.margin", str2num(optarg, 15));
                        break;
-               case 'c':
-                       conf_set_int("main.capture", 1);
-                       break;
                case 'i':
                case 's':
                        key = strdup(optarg);
@@ -215,10 +222,11 @@ static void load_args(int argc, char **argv)
 
 
 /* Configuration file functions */
-int conf_get_int(const char *key)
+int conf_get_int(const char *key, int def)
 {
        entry_t *entry = conf_get(key);
-       return entry ? entry->num : 0;
+       return entry && entry->type == NUMBER
+               ? entry->num : def;
 }
 
 void conf_set_int(const char *key, int value)
@@ -226,10 +234,11 @@ void conf_set_int(const char *key, int value)
        conf_set(key, value, NULL);
 }
 
-const char *conf_get_str(const char *key)
+const char *conf_get_str(const char *key, const char *def)
 {
        entry_t *entry = conf_get(key);
-       return entry ? entry->str : NULL;
+       return entry && entry->type == STRING
+               ? entry->str : def;
 }
 
 void conf_set_str(const char *key, const char *value)
@@ -247,8 +256,9 @@ void conf_init(int argc, char **argv)
 {
        conf_argc = argc;
        conf_argv = argv;
-       snprintf(conf_path, sizeof(conf_path),
-               "%s/%s", getenv("HOME"), ".wmpus");
+       snprintf(conf_path, sizeof(conf_path), "%s/%s",
+                       getenv("HOME") ?: getenv("HOMEPATH") ?: ".",
+                       ".wmpus");
        conf_reload();
 }