aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2018-01-20 11:32:07 -0500
committerTony Crisci <tony@dubstepdish.com>2018-01-20 11:34:57 -0500
commit9e0595f26bcca2a4d0aa735c4cd9fc4f792918bf (patch)
tree1417f4b913875db24efc5418481ab057679680cd
parent3dd915876d459a2aeeb7a5864330f5bc30bc2f00 (diff)
input config handler context
-rw-r--r--include/sway/config.h8
-rw-r--r--include/sway/input/input-manager.h1
-rw-r--r--sway/commands.c3
-rw-r--r--sway/commands/input.c28
-rw-r--r--sway/commands/input/accel_profile.c2
-rw-r--r--sway/commands/input/click_method.c4
-rw-r--r--sway/commands/input/drag_lock.c2
-rw-r--r--sway/commands/input/dwt.c2
-rw-r--r--sway/commands/input/events.c6
-rw-r--r--sway/commands/input/left_handed.c2
-rw-r--r--sway/commands/input/middle_emulation.c2
-rw-r--r--sway/commands/input/natural_scroll.c2
-rw-r--r--sway/commands/input/pointer_accel.c2
-rw-r--r--sway/commands/input/scroll_method.c2
-rw-r--r--sway/commands/input/tap.c3
-rw-r--r--sway/commands/input/xkb_layout.c3
-rw-r--r--sway/commands/input/xkb_model.c3
-rw-r--r--sway/commands/input/xkb_options.c3
-rw-r--r--sway/commands/input/xkb_rules.c3
-rw-r--r--sway/commands/input/xkb_variant.c3
-rw-r--r--sway/config.c10
21 files changed, 69 insertions, 25 deletions
diff --git a/include/sway/config.h b/include/sway/config.h
index 0a9c4595..1ab96b51 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -350,6 +350,11 @@ struct sway_config {
list_t *command_policies;
list_t *feature_policies;
list_t *ipc_policies;
+
+ // Context for command handlers
+ struct {
+ struct input_config *input_config;
+ } handler_context;
};
void pid_workspace_add(struct pid_workspace *pw);
@@ -375,6 +380,9 @@ bool read_config(FILE *file, struct sway_config *config);
* Free config struct
*/
void free_config(struct sway_config *config);
+
+void config_clear_handler_context(struct sway_config *config);
+
void free_sway_variable(struct sway_variable *var);
/**
* Does variable replacement for a string based on the config's currently loaded variables.
diff --git a/include/sway/input/input-manager.h b/include/sway/input/input-manager.h
index 53064eed..8388f930 100644
--- a/include/sway/input/input-manager.h
+++ b/include/sway/input/input-manager.h
@@ -5,7 +5,6 @@
#include "sway/config.h"
#include "list.h"
-extern struct input_config *current_input_config;
extern struct seat_config *current_seat_config;
/**
diff --git a/sway/commands.c b/sway/commands.c
index 1005cf68..fd2e1514 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -70,10 +70,7 @@ void apply_input_config(struct input_config *input) {
list_add(config->input_configs, input);
}
- struct input_config *old_input_config = current_input_config;
- current_input_config = input;
sway_input_manager_apply_input_config(input_manager, input);
- current_input_config = old_input_config;
}
void apply_seat_config(struct seat_config *seat) {
diff --git a/sway/commands/input.c b/sway/commands/input.c
index 5ea39f62..5de65621 100644
--- a/sway/commands/input.c
+++ b/sway/commands/input.c
@@ -11,8 +11,12 @@ struct cmd_results *cmd_input(int argc, char **argv) {
}
if (config->reading && strcmp("{", argv[1]) == 0) {
- current_input_config = new_input_config(argv[0]);
- wlr_log(L_DEBUG, "entering input block: %s", current_input_config->identifier);
+ free_input_config(config->handler_context.input_config);
+ config->handler_context.input_config = new_input_config(argv[0]);
+ if (!config->handler_context.input_config) {
+ return cmd_results_new(CMD_FAILURE, NULL, "Couldn't allocate config");
+ }
+ wlr_log(L_DEBUG, "entering input block: %s", argv[0]);
return cmd_results_new(CMD_BLOCK_INPUT, NULL, NULL);
}
@@ -20,15 +24,16 @@ struct cmd_results *cmd_input(int argc, char **argv) {
return error;
}
+ bool has_context = (config->handler_context.input_config != NULL);
+ if (!has_context) {
+ // caller did not give a context so create one just for this command
+ config->handler_context.input_config = new_input_config(argv[0]);
+ }
+
int argc_new = argc-2;
char **argv_new = argv+2;
struct cmd_results *res;
- struct input_config *old_input_config = current_input_config;
- current_input_config = new_input_config(argv[0]);
- if (!current_input_config) {
- return cmd_results_new(CMD_FAILURE, NULL, "Couldn't allocate config");
- }
if (strcasecmp("accel_profile", argv[1]) == 0) {
res = input_cmd_accel_profile(argc_new, argv_new);
} else if (strcasecmp("click_method", argv[1]) == 0) {
@@ -64,7 +69,12 @@ struct cmd_results *cmd_input(int argc, char **argv) {
} else {
res = cmd_results_new(CMD_INVALID, "input <device>", "Unknown command %s", argv[1]);
}
- free_input_config(current_input_config);
- current_input_config = old_input_config;
+
+ if (!has_context) {
+ // clean up the context we created earlier
+ free_input_config(config->handler_context.input_config);
+ config->handler_context.input_config = NULL;
+ }
+
return res;
}
diff --git a/sway/commands/input/accel_profile.c b/sway/commands/input/accel_profile.c
index f72b7d48..37d6e133 100644
--- a/sway/commands/input/accel_profile.c
+++ b/sway/commands/input/accel_profile.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_accel_profile(int argc, char **argv) {
if ((error = checkarg(argc, "accel_profile", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "accel_profile",
"No input device defined.");
diff --git a/sway/commands/input/click_method.c b/sway/commands/input/click_method.c
index 22eb15f7..8f1f0aa7 100644
--- a/sway/commands/input/click_method.c
+++ b/sway/commands/input/click_method.c
@@ -6,12 +6,12 @@
#include "log.h"
struct cmd_results *input_cmd_click_method(int argc, char **argv) {
- wlr_log(L_DEBUG, "click_method for device: %d %s",
- current_input_config==NULL, current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "click_method", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "click_method",
"No input device defined.");
diff --git a/sway/commands/input/drag_lock.c b/sway/commands/input/drag_lock.c
index 1783978a..8273a7d4 100644
--- a/sway/commands/input/drag_lock.c
+++ b/sway/commands/input/drag_lock.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_drag_lock(int argc, char **argv) {
if ((error = checkarg(argc, "drag_lock", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE,
"drag_lock", "No input device defined.");
diff --git a/sway/commands/input/dwt.c b/sway/commands/input/dwt.c
index 8108a110..995a2f47 100644
--- a/sway/commands/input/dwt.c
+++ b/sway/commands/input/dwt.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_dwt(int argc, char **argv) {
if ((error = checkarg(argc, "dwt", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "dwt", "No input device defined.");
}
diff --git a/sway/commands/input/events.c b/sway/commands/input/events.c
index a1bfbacd..2217f5ce 100644
--- a/sway/commands/input/events.c
+++ b/sway/commands/input/events.c
@@ -6,16 +6,18 @@
#include "log.h"
struct cmd_results *input_cmd_events(int argc, char **argv) {
- wlr_log(L_DEBUG, "events for device: %s",
- current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "events", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "events",
"No input device defined.");
}
+ wlr_log(L_DEBUG, "events for device: %s",
+ current_input_config->identifier);
struct input_config *new_config =
new_input_config(current_input_config->identifier);
diff --git a/sway/commands/input/left_handed.c b/sway/commands/input/left_handed.c
index 35740df3..94b8e03e 100644
--- a/sway/commands/input/left_handed.c
+++ b/sway/commands/input/left_handed.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_left_handed(int argc, char **argv) {
if ((error = checkarg(argc, "left_handed", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "left_handed",
"No input device defined.");
diff --git a/sway/commands/input/middle_emulation.c b/sway/commands/input/middle_emulation.c
index 7bc08ae6..a551fd51 100644
--- a/sway/commands/input/middle_emulation.c
+++ b/sway/commands/input/middle_emulation.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_middle_emulation(int argc, char **argv) {
if ((error = checkarg(argc, "middle_emulation", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "middle_emulation",
"No input device defined.");
diff --git a/sway/commands/input/natural_scroll.c b/sway/commands/input/natural_scroll.c
index a7dcdc2c..c4e19b78 100644
--- a/sway/commands/input/natural_scroll.c
+++ b/sway/commands/input/natural_scroll.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_natural_scroll(int argc, char **argv) {
if ((error = checkarg(argc, "natural_scroll", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "natural_scoll",
"No input device defined.");
diff --git a/sway/commands/input/pointer_accel.c b/sway/commands/input/pointer_accel.c
index d2261a63..171063aa 100644
--- a/sway/commands/input/pointer_accel.c
+++ b/sway/commands/input/pointer_accel.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_pointer_accel(int argc, char **argv) {
if ((error = checkarg(argc, "pointer_accel", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE,
"pointer_accel", "No input device defined.");
diff --git a/sway/commands/input/scroll_method.c b/sway/commands/input/scroll_method.c
index 035262cf..0a1c57ac 100644
--- a/sway/commands/input/scroll_method.c
+++ b/sway/commands/input/scroll_method.c
@@ -9,6 +9,8 @@ struct cmd_results *input_cmd_scroll_method(int argc, char **argv) {
if ((error = checkarg(argc, "scroll_method", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "scroll_method",
"No input device defined.");
diff --git a/sway/commands/input/tap.c b/sway/commands/input/tap.c
index ecab9a5b..e7f03058 100644
--- a/sway/commands/input/tap.c
+++ b/sway/commands/input/tap.c
@@ -6,11 +6,12 @@
#include "log.h"
struct cmd_results *input_cmd_tap(int argc, char **argv) {
- wlr_log(L_DEBUG, "tap for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "tap", EXPECTED_AT_LEAST, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "tap", "No input device defined.");
}
diff --git a/sway/commands/input/xkb_layout.c b/sway/commands/input/xkb_layout.c
index 25db1a33..867e65d3 100644
--- a/sway/commands/input/xkb_layout.c
+++ b/sway/commands/input/xkb_layout.c
@@ -5,11 +5,12 @@
#include "log.h"
struct cmd_results *input_cmd_xkb_layout(int argc, char **argv) {
- wlr_log(L_DEBUG, "xkb layout for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "xkb_layout", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "xkb_layout", "No input device defined.");
}
diff --git a/sway/commands/input/xkb_model.c b/sway/commands/input/xkb_model.c
index 819b796b..e8c8e04e 100644
--- a/sway/commands/input/xkb_model.c
+++ b/sway/commands/input/xkb_model.c
@@ -5,11 +5,12 @@
#include "log.h"
struct cmd_results *input_cmd_xkb_model(int argc, char **argv) {
- wlr_log(L_DEBUG, "xkb model for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "xkb_model", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "xkb_model", "No input device defined.");
}
diff --git a/sway/commands/input/xkb_options.c b/sway/commands/input/xkb_options.c
index ff5f83ec..e9ddd6e3 100644
--- a/sway/commands/input/xkb_options.c
+++ b/sway/commands/input/xkb_options.c
@@ -5,11 +5,12 @@
#include "log.h"
struct cmd_results *input_cmd_xkb_options(int argc, char **argv) {
- wlr_log(L_DEBUG, "xkb options for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "xkb_options", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "xkb_options", "No input device defined.");
}
diff --git a/sway/commands/input/xkb_rules.c b/sway/commands/input/xkb_rules.c
index aafe0003..926d0ac1 100644
--- a/sway/commands/input/xkb_rules.c
+++ b/sway/commands/input/xkb_rules.c
@@ -5,11 +5,12 @@
#include "log.h"
struct cmd_results *input_cmd_xkb_rules(int argc, char **argv) {
- wlr_log(L_DEBUG, "xkb rules for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "xkb_rules", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "xkb_rules", "No input device defined.");
}
diff --git a/sway/commands/input/xkb_variant.c b/sway/commands/input/xkb_variant.c
index 89a61fdc..0e3ffd41 100644
--- a/sway/commands/input/xkb_variant.c
+++ b/sway/commands/input/xkb_variant.c
@@ -5,11 +5,12 @@
#include "log.h"
struct cmd_results *input_cmd_xkb_variant(int argc, char **argv) {
- wlr_log(L_DEBUG, "xkb variant for device: %s", current_input_config->identifier);
struct cmd_results *error = NULL;
if ((error = checkarg(argc, "xkb_variant", EXPECTED_EQUAL_TO, 1))) {
return error;
}
+ struct input_config *current_input_config =
+ config->handler_context.input_config;
if (!current_input_config) {
return cmd_results_new(CMD_FAILURE, "xkb_variant", "No input device defined.");
}
diff --git a/sway/config.c b/sway/config.c
index 5ec45b17..54357625 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -54,6 +54,8 @@ static void free_mode(struct sway_mode *mode) {
}
void free_config(struct sway_config *config) {
+ config_clear_handler_context(config);
+
int i;
if (!config) {
@@ -480,6 +482,11 @@ bool load_include_configs(const char *path, struct sway_config *config) {
return true;
}
+void config_clear_handler_context(struct sway_config *config) {
+ free_input_config(config->handler_context.input_config);
+
+ memset(&config->handler_context, 0, sizeof(config->handler_context));
+}
bool read_config(FILE *file, struct sway_config *config) {
bool success = true;
@@ -592,8 +599,6 @@ bool read_config(FILE *file, struct sway_config *config) {
case CMD_BLOCK_INPUT:
wlr_log(L_DEBUG, "End of input block");
- free_input_config(current_input_config);
- current_input_config = NULL;
block = CMD_BLOCK_END;
break;
@@ -635,6 +640,7 @@ bool read_config(FILE *file, struct sway_config *config) {
default:;
}
+ config_clear_handler_context(config);
default:;
}
free(line);