aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/output/background.c2
-rw-r--r--sway/commands/reload.c2
-rw-r--r--sway/config.c53
-rw-r--r--sway/ipc-json.c2
-rw-r--r--sway/ipc-server.c26
5 files changed, 71 insertions, 14 deletions
diff --git a/sway/commands/output/background.c b/sway/commands/output/background.c
index c2c138f8..4ed56c2a 100644
--- a/sway/commands/output/background.c
+++ b/sway/commands/output/background.c
@@ -80,7 +80,7 @@ struct cmd_results *output_cmd_background(int argc, char **argv) {
if (config->reading && *src != '/') {
// src file is inside configuration dir
- char *conf = strdup(config->current_config);
+ char *conf = strdup(config->current_config_path);
if (!conf) {
wlr_log(WLR_ERROR, "Failed to duplicate string");
free(src);
diff --git a/sway/commands/reload.c b/sway/commands/reload.c
index 9fc213c4..c6715f9c 100644
--- a/sway/commands/reload.c
+++ b/sway/commands/reload.c
@@ -7,7 +7,7 @@ struct cmd_results *cmd_reload(int argc, char **argv) {
if ((error = checkarg(argc, "reload", EXPECTED_EQUAL_TO, 0))) {
return error;
}
- if (!load_main_config(config->current_config, true)) {
+ if (!load_main_config(config->current_config_path, true)) {
return cmd_results_new(CMD_FAILURE, "reload", "Error(s) reloading config.");
}
diff --git a/sway/config.c b/sway/config.c
index d0e0e432..c59f4f0d 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -117,6 +117,7 @@ void free_config(struct sway_config *config) {
free(config->floating_scroll_left_cmd);
free(config->floating_scroll_right_cmd);
free(config->font);
+ free((char *)config->current_config_path);
free((char *)config->current_config);
free(config);
}
@@ -205,6 +206,7 @@ static void config_defaults(struct sway_config *config) {
if (!(config->active_bar_modifiers = create_list())) goto cleanup;
if (!(config->config_chain = create_list())) goto cleanup;
+ config->current_config_path = NULL;
config->current_config = NULL;
// borders
@@ -304,8 +306,6 @@ static char *get_config_path(void) {
return NULL; // Not reached
}
-const char *current_config_path;
-
static bool load_config(const char *path, struct sway_config *config) {
if (path == NULL) {
wlr_log(WLR_ERROR, "Unable to find a config file!");
@@ -313,7 +313,6 @@ static bool load_config(const char *path, struct sway_config *config) {
}
wlr_log(WLR_INFO, "Loading config from %s", path);
- current_config_path = path;
struct stat sb;
if (stat(path, &sb) == 0 && S_ISDIR(sb.st_mode)) {
@@ -333,7 +332,6 @@ static bool load_config(const char *path, struct sway_config *config) {
wlr_log(WLR_ERROR, "Error(s) loading config!");
}
- current_config_path = NULL;
return true;
}
@@ -358,7 +356,7 @@ bool load_main_config(const char *file, bool is_active) {
config->active = true;
}
- config->current_config = path;
+ config->current_config_path = path;
list_add(config->config_chain, path);
config->reading = true;
@@ -428,7 +426,7 @@ bool load_main_config(const char *file, bool is_active) {
static bool load_include_config(const char *path, const char *parent_dir,
struct sway_config *config) {
// save parent config
- const char *parent_config = config->current_config;
+ const char *parent_config = config->current_config_path;
char *full_path;
int len = strlen(path);
@@ -466,25 +464,25 @@ static bool load_include_config(const char *path, const char *parent_dir,
}
}
- config->current_config = real_path;
+ config->current_config_path = real_path;
list_add(config->config_chain, real_path);
int index = config->config_chain->length - 1;
if (!load_config(real_path, config)) {
free(real_path);
- config->current_config = parent_config;
+ config->current_config_path = parent_config;
list_del(config->config_chain, index);
return false;
}
- // restore current_config
- config->current_config = parent_config;
+ // restore current_config_path
+ config->current_config_path = parent_config;
return true;
}
bool load_include_configs(const char *path, struct sway_config *config) {
char *wd = getcwd(NULL, 0);
- char *parent_path = strdup(config->current_config);
+ char *parent_path = strdup(config->current_config_path);
const char *parent_dir = dirname(parent_path);
if (chdir(parent_dir) < 0) {
@@ -561,6 +559,23 @@ static char *expand_line(const char *block, const char *line, bool add_brace) {
}
bool read_config(FILE *file, struct sway_config *config) {
+ bool reading_main_config = false;
+ char *current_config, *config_pos;
+ long config_size = 0;
+ if (config->current_config == NULL) {
+ reading_main_config = true;
+
+ fseek(file, 0, SEEK_END);
+ config_size = ftell(file);
+ rewind(file);
+
+ config_pos = current_config = malloc(config_size + 1);
+ if (current_config == NULL) {
+ wlr_log(WLR_ERROR, "Unable to allocate buffer for config contents");
+ return false;
+ }
+ }
+
bool success = true;
int line_number = 0;
char *line;
@@ -573,6 +588,14 @@ bool read_config(FILE *file, struct sway_config *config) {
}
line_number++;
wlr_log(WLR_DEBUG, "Read line %d: %s", line_number, line);
+
+ if (reading_main_config) {
+ size_t l = strlen(line);
+ memcpy(config_pos, line, l); // don't copy terminating character
+ config_pos += l;
+ *config_pos++ = '\n';
+ }
+
line = strip_whitespace(line);
if (line[0] == '#') {
free(line);
@@ -592,6 +615,8 @@ bool read_config(FILE *file, struct sway_config *config) {
if (!expanded) {
list_foreach(stack, free);
list_free(stack);
+ free(line);
+ free(current_config);
return false;
}
wlr_log(WLR_DEBUG, "Expanded line: %s", expanded);
@@ -607,7 +632,7 @@ bool read_config(FILE *file, struct sway_config *config) {
case CMD_FAILURE:
case CMD_INVALID:
wlr_log(WLR_ERROR, "Error on line %i '%s': %s (%s)", line_number,
- line, res->error, config->current_config);
+ line, res->error, config->current_config_path);
success = false;
break;
@@ -652,6 +677,10 @@ bool read_config(FILE *file, struct sway_config *config) {
list_foreach(stack, free);
list_free(stack);
+ if (reading_main_config) {
+ current_config[config_size - 1] = '\0';
+ config->current_config = current_config;
+ }
return success;
}
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index b9289e25..3d0e88f0 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -2,6 +2,7 @@
#include <stdio.h>
#include <ctype.h>
#include "log.h"
+#include "sway/config.h"
#include "sway/ipc-json.h"
#include "sway/tree/container.h"
#include "sway/tree/workspace.h"
@@ -41,6 +42,7 @@ json_object *ipc_json_get_version() {
json_object_object_add(version, "major", json_object_new_int(major));
json_object_object_add(version, "minor", json_object_new_int(minor));
json_object_object_add(version, "patch", json_object_new_int(patch));
+ json_object_object_add(version, "loaded_config_file_name", json_object_new_string(config->current_config_path));
return version;
}
diff --git a/sway/ipc-server.c b/sway/ipc-server.c
index 197851cf..c5161a6b 100644
--- a/sway/ipc-server.c
+++ b/sway/ipc-server.c
@@ -17,6 +17,7 @@
#include <unistd.h>
#include <wayland-server.h>
#include "sway/commands.h"
+#include "sway/config.h"
#include "sway/ipc-json.h"
#include "sway/ipc-server.h"
#include "sway/output.h"
@@ -667,6 +668,31 @@ void ipc_client_handle_command(struct ipc_client *client) {
goto exit_cleanup;
}
+ case IPC_GET_BINDING_MODES:
+ {
+ json_object *modes = json_object_new_array();
+ for (int i = 0; i < config->modes->length; i++) {
+ struct sway_mode *mode = config->modes->items[i];
+ json_object_array_add(modes, json_object_new_string(mode->name));
+ }
+ const char *json_string = json_object_to_json_string(modes);
+ client_valid =
+ ipc_send_reply(client, json_string, (uint32_t)strlen(json_string));
+ json_object_put(modes); // free
+ goto exit_cleanup;
+ }
+
+ case IPC_GET_CONFIG:
+ {
+ json_object *json = json_object_new_object();
+ json_object_object_add(json, "config", json_object_new_string(config->current_config));
+ const char *json_string = json_object_to_json_string(json);
+ client_valid =
+ ipc_send_reply(client, json_string, (uint32_t)strlen(json_string));
+ json_object_put(json); // free
+ goto exit_cleanup;
+ }
+
default:
wlr_log(WLR_INFO, "Unknown IPC command type %i", client->current_command);
goto exit_cleanup;