summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2015-08-15 21:11:24 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2015-08-15 21:11:24 -0400
commit6cc8ea29e51b785a75b2f5e6242e76dc1804002c (patch)
tree366e434ce4130d67af9a3c0f44c0f187300a6de4
parentMerge pull request #35 from taiyu-len/master (diff)
parentAdded in additional checks for i3 config paths (diff)
downloadsway-6cc8ea29e51b785a75b2f5e6242e76dc1804002c.tar.gz
sway-6cc8ea29e51b785a75b2f5e6242e76dc1804002c.tar.zst
sway-6cc8ea29e51b785a75b2f5e6242e76dc1804002c.zip
Merge pull request #36 from Luminarys/master
Added in config file loading from multiple sources
-rw-r--r--sway/config.c138
1 files changed, 129 insertions, 9 deletions
diff --git a/sway/config.c b/sway/config.c
index d96d23fc..4f576bb9 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -1,6 +1,7 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <stdbool.h> 2#include <stdbool.h>
3#include <stdlib.h> 3#include <stdlib.h>
4#include <unistd.h>
4#include "readline.h" 5#include "readline.h"
5#include "stringop.h" 6#include "stringop.h"
6#include "list.h" 7#include "list.h"
@@ -10,21 +11,140 @@
10 11
11struct sway_config *config; 12struct sway_config *config;
12 13
13bool load_config() { 14static bool exists(const char *path) {
14 sway_log(L_INFO, "Loading config"); 15 return access(path, R_OK) != -1;
15 // TODO: Allow use of more config file locations 16}
16 const char *name = "/.sway/config"; 17
18static char* get_config_path() {
19 char *name = "/.sway/config";
17 const char *home = getenv("HOME"); 20 const char *home = getenv("HOME");
21
22 // Check home dir
23 sway_log(L_DEBUG, "Trying to find config in ~/.sway/config");
18 char *temp = malloc(strlen(home) + strlen(name) + 1); 24 char *temp = malloc(strlen(home) + strlen(name) + 1);
19 strcpy(temp, home); 25 strcpy(temp, home);
20 strcat(temp, name); 26 strcat(temp, name);
21 FILE *f = fopen(temp, "r"); 27 if (exists(temp)) {
28 return temp;
29 }
30
31 // Check XDG_CONFIG_HOME with fallback to ~/.config/
32 sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/sway/config");
33 char *xdg_config_home = getenv("XDG_CONFIG_HOME");
34 if (xdg_config_home == NULL) {
35 sway_log(L_DEBUG, "Falling back to ~/.config/sway/config");
36 name = "/.config/sway/config";
37 temp = malloc(strlen(home) + strlen(name) + 1);
38 strcpy(temp, home);
39 strcat(temp, name);
40 } else {
41 name = "/sway/config";
42 temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
43 strcpy(temp, home);
44 strcat(temp, name);
45 }
46 if (exists(temp)) {
47 return temp;
48 }
49
50 // Check /etc/
51 sway_log(L_DEBUG, "Trying to find config in /etc/sway/config");
52 strcpy(temp, "/etc/sway/config");
53 if (exists(temp)) {
54 return temp;
55 }
56
57 // Check XDG_CONFIG_DIRS
58 sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS");
59 char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS");
60 if (xdg_config_dirs != NULL) {
61 list_t *paths = split_string(xdg_config_dirs, ":");
62 name = "/sway/config";
63 int i;
64 for (i = 0; i < paths->length; i++ ) {
65 temp = malloc(strlen(paths->items[i]) + strlen(name) + 1);
66 strcpy(temp, paths->items[i]);
67 strcat(temp, name);
68 if (exists(temp)) {
69 free_flat_list(paths);
70 return temp;
71 }
72 }
73 free_flat_list(paths);
74 }
75
76 //Now fall back to i3 paths and try the same thing
77 name = "/.i3/config";
78 sway_log(L_DEBUG, "Trying to find config in ~/.i3/config");
79 char *temp = malloc(strlen(home) + strlen(name) + 1);
80 strcpy(temp, home);
81 strcat(temp, name);
82 if (exists(temp)) {
83 return temp;
84 }
85
86 sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/i3/config");
87 char *xdg_config_home = getenv("XDG_CONFIG_HOME");
88 if (xdg_config_home == NULL) {
89 sway_log(L_DEBUG, "Falling back to ~/.config/i3/config");
90 name = "/.config/i3/config";
91 temp = malloc(strlen(home) + strlen(name) + 1);
92 strcpy(temp, home);
93 strcat(temp, name);
94 } else {
95 name = "/i3/config";
96 temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
97 strcpy(temp, home);
98 strcat(temp, name);
99 }
100 if (exists(temp)) {
101 return temp;
102 }
103
104 sway_log(L_DEBUG, "Trying to find config in /etc/i3/config");
105 strcpy(temp, "/etc/i3/config");
106 if (exists(temp)) {
107 return temp;
108 }
109
110 sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS");
111 char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS");
112 if (xdg_config_dirs != NULL) {
113 list_t *paths = split_string(xdg_config_dirs, ":");
114 name = "/i3/config";
115 int i;
116 for (i = 0; i < paths->length; i++ ) {
117 temp = malloc(strlen(paths->items[i]) + strlen(name) + 1);
118 strcpy(temp, paths->items[i]);
119 strcat(temp, name);
120 if (exists(temp)) {
121 free_flat_list(paths);
122 return temp;
123 }
124 }
125 free_flat_list(paths);
126 }
127
128 return NULL;
129}
130
131bool load_config() {
132 sway_log(L_INFO, "Loading config");
133
134 char *path = get_config_path();
135
136 if (path == NULL) {
137 sway_log(L_ERROR, "Unable to find a config file!");
138 return false;
139 }
140
141 FILE *f = fopen(path, "r");
22 if (!f) { 142 if (!f) {
23 fprintf(stderr, "Unable to open %s for reading", temp); 143 fprintf(stderr, "Unable to open %s for reading", path);
24 free(temp); 144 free(path);
25 return false; 145 return false;
26 } 146 }
27 free(temp); 147 free(path);
28 148
29 bool config_load_success; 149 bool config_load_success;
30 if (config) { 150 if (config) {
@@ -95,7 +215,7 @@ bool read_config(FILE *file, bool is_active) {
95 sway_log(L_DEBUG, "Config load failed for line %s", line); 215 sway_log(L_DEBUG, "Config load failed for line %s", line);
96 success = false; 216 success = false;
97 temp_config->failed = true; 217 temp_config->failed = true;
98 } 218 }
99 list_free(args); 219 list_free(args);
100 220
101_continue: 221_continue: