aboutsummaryrefslogtreecommitdiff
path: root/sway/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/config.c')
-rw-r--r--sway/config.c221
1 files changed, 115 insertions, 106 deletions
diff --git a/sway/config.c b/sway/config.c
index 6d39839d..9f65e8a2 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -8,6 +8,7 @@
#include "log.h"
#include "commands.h"
#include "config.h"
+#include "layout.h"
struct sway_config *config;
@@ -15,121 +16,143 @@ static bool exists(const char *path) {
return access(path, R_OK) != -1;
}
-static char *get_config_path() {
- char *name = "/.sway/config";
- const char *home = getenv("HOME");
+void config_defaults(struct sway_config *config) {
+ config->symbols = create_list();
+ config->modes = create_list();
+ config->cmd_queue = create_list();
+ config->workspace_outputs = create_list();
+ config->current_mode = malloc(sizeof(struct sway_mode));
+ config->current_mode->name = NULL;
+ config->current_mode->bindings = create_list();
+ list_add(config->modes, config->current_mode);
+ // Flags
+ config->focus_follows_mouse = true;
+ config->mouse_warping = true;
+ config->reloading = false;
+ config->active = false;
+ config->failed = false;
+ config->gaps_inner = 0;
+ config->gaps_outer = 0;
+}
- // Check home dir
- sway_log(L_DEBUG, "Trying to find config in ~/.sway/config");
- char *temp = malloc(strlen(home) + strlen(name) + 1);
- strcpy(temp, home);
- strcat(temp, name);
- if (exists(temp)) {
- return temp;
- }
+void free_mode(struct sway_mode *mode) {
+ free(mode->name);
+ free_flat_list(mode->bindings);
+}
- // Check XDG_CONFIG_HOME with fallback to ~/.config/
- sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/sway/config");
- char *xdg_config_home = getenv("XDG_CONFIG_HOME");
- if (xdg_config_home == NULL) {
- sway_log(L_DEBUG, "Falling back to ~/.config/sway/config");
- name = "/.config/sway/config";
- temp = malloc(strlen(home) + strlen(name) + 1);
- strcpy(temp, home);
- strcat(temp, name);
- } else {
- name = "/sway/config";
- temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
- strcpy(xdg_config_home, home);
- strcat(temp, name);
+void free_config(struct sway_config *config) {
+ int i;
+ for (i = 0; i < config->modes->length; ++i) {
+ free_mode((struct sway_mode *)config->modes->items[i]);
}
- if (exists(temp)) {
- return temp;
+ free_flat_list(config->modes);
+ for (i = 0; i < config->workspace_outputs->length; ++i) {
+ struct workspace_output *wso = config->workspace_outputs->items[i];
+ free(wso->output);
+ free(wso->workspace);
}
-
- // Check /etc/
- sway_log(L_DEBUG, "Trying to find config in /etc/sway/config");
- strcpy(temp, "/etc/sway/config");
- if (exists(temp)) {
- return temp;
+ free_flat_list(config->workspace_outputs);
+ free_flat_list(config->cmd_queue);
+ for (i = 0; i < config->symbols->length; ++i) {
+ struct sway_variable *sym = config->symbols->items[i];
+ free(sym->name);
+ free(sym->value);
}
+ free_flat_list(config->symbols);
+}
- // Check XDG_CONFIG_DIRS
- sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS");
- char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS");
- if (xdg_config_dirs != NULL) {
- list_t *paths = split_string(xdg_config_dirs, ":");
- name = "/sway/config";
- int i;
- for (i = 0; i < paths->length; i++ ) {
- temp = malloc(strlen(paths->items[i]) + strlen(name) + 1);
- strcpy(temp, paths->items[i]);
- strcat(temp, name);
- if (exists(temp)) {
- free_flat_list(paths);
- return temp;
- }
- }
- free_flat_list(paths);
- }
+static const char *search_paths[] = {
+ "$home/.sway/config",
+ "$config/sway/config",
+ "/etc/sway/config",
+ "$home/.i3/config",
+ "$config/.i3/config",
+ "/etc/i3/config"
+};
- //Now fall back to i3 paths and try the same thing
- name = "/.i3/config";
- sway_log(L_DEBUG, "Trying to find config in ~/.i3/config");
- temp = malloc(strlen(home) + strlen(name) + 1);
- strcpy(temp, home);
- strcat(temp, name);
- if (exists(temp)) {
- return temp;
+static char *get_config_path() {
+ char *home = getenv("HOME");
+ if (home) {
+ home = strdup(getenv("HOME"));
}
-
- sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_HOME/i3/config");
- if (xdg_config_home == NULL) {
- sway_log(L_DEBUG, "Falling back to ~/.config/i3/config");
- name = "/.config/i3/config";
- temp = malloc(strlen(home) + strlen(name) + 1);
- strcpy(temp, home);
- strcat(temp, name);
+ char *config = getenv("XDG_CONFIG_HOME");
+ if (config) {
+ config = strdup(getenv("XDG_CONFIG_HOME"));
+ } else if (home) {
+ const char *def = "/.config";
+ config = malloc(strlen(home) + strlen(def) + 1);
+ strcpy(config, home);
+ strcat(config, def);
} else {
- name = "/i3/config";
- temp = malloc(strlen(xdg_config_home) + strlen(name) + 1);
- strcpy(xdg_config_home, home);
- strcat(temp, name);
- }
- if (exists(temp)) {
- return temp;
+ home = strdup("");
+ config = strdup("");
}
- sway_log(L_DEBUG, "Trying to find config in /etc/i3/config");
- strcpy(temp, "/etc/i3/config");
- if (exists(temp)) {
- return temp;
+ // Set up a temporary config for holding set variables
+ struct sway_config *temp_config = malloc(sizeof(struct sway_config));
+ config_defaults(temp_config);
+ const char *set_home = "set $home ";
+ char *_home = malloc(strlen(home) + strlen(set_home) + 1);
+ strcpy(_home, set_home);
+ strcat(_home, home);
+ handle_command(temp_config, _home);
+ free(_home);
+ const char *set_config = "set $config ";
+ char *_config = malloc(strlen(config) + strlen(set_config) + 1);
+ strcpy(_config, set_config);
+ strcat(_config, config);
+ handle_command(temp_config, _config);
+ free(_config);
+
+ char *test = NULL;
+ int i;
+ for (i = 0; i < sizeof(search_paths) / sizeof(char *); ++i) {
+ test = strdup(search_paths[i]);
+ test = do_var_replacement(temp_config, test);
+ sway_log(L_DEBUG, "Checking for config at %s", test);
+ if (exists(test)) {
+ goto _continue;
+ }
+ free(test);
+ test = NULL;
}
sway_log(L_DEBUG, "Trying to find config in XDG_CONFIG_DIRS");
+ char *xdg_config_dirs = getenv("XDG_CONFIG_DIRS");
if (xdg_config_dirs != NULL) {
list_t *paths = split_string(xdg_config_dirs, ":");
- name = "/i3/config";
+ char *name = "/sway/config";
int i;
for (i = 0; i < paths->length; i++ ) {
- temp = malloc(strlen(paths->items[i]) + strlen(name) + 1);
- strcpy(temp, paths->items[i]);
- strcat(temp, name);
- if (exists(temp)) {
+ test = malloc(strlen(paths->items[i]) + strlen(name) + 1);
+ strcpy(test, paths->items[i]);
+ strcat(test, name);
+ if (exists(test)) {
free_flat_list(paths);
- return temp;
+ return test;
}
+ free(test);
+ test = NULL;
}
free_flat_list(paths);
}
- return NULL;
+_continue:
+ free_config(temp_config);
+ free(home);
+ free(config);
+ return test;
}
-bool load_config(void) {
+bool load_config(const char *file) {
sway_log(L_INFO, "Loading config");
- char *path = get_config_path();
+ char *path;
+ if (file != NULL) {
+ path = strdup(file);
+ } else {
+ path = get_config_path();
+ }
if (path == NULL) {
sway_log(L_ERROR, "Unable to find a config file!");
@@ -155,23 +178,6 @@ bool load_config(void) {
return config_load_success;
}
-void config_defaults(struct sway_config *config) {
- config->symbols = create_list();
- config->modes = create_list();
- config->cmd_queue = create_list();
- config->workspace_outputs = create_list();
- config->current_mode = malloc(sizeof(struct sway_mode));
- config->current_mode->name = NULL;
- config->current_mode->bindings = create_list();
- list_add(config->modes, config->current_mode);
- // Flags
- config->focus_follows_mouse = true;
- config->mouse_warping = true;
- config->reloading = false;
- config->active = false;
- config->failed = false;
-}
-
bool read_config(FILE *file, bool is_active) {
struct sway_config *temp_config = malloc(sizeof(struct sway_config));
config_defaults(temp_config);
@@ -186,9 +192,10 @@ bool read_config(FILE *file, bool is_active) {
int temp_depth = 0; // Temporary: skip all config sections with depth
while (!feof(file)) {
+ int _;
char *line = read_line(file);
- strip_comments(line);
- strip_whitespace(line);
+ line = strip_whitespace(line, &_);
+ line = strip_comments(line);
if (!line[0]) {
goto _continue;
}
@@ -224,6 +231,8 @@ _continue:
if (is_active) {
temp_config->reloading = false;
+ container_map(&root_container, reset_gaps, NULL);
+ arrange_windows(&root_container, -1, -1);
}
config = temp_config;