aboutsummaryrefslogtreecommitdiff
path: root/sway/commands
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands')
-rw-r--r--sway/commands/bar.c1
-rw-r--r--sway/commands/bar/bind.c106
-rw-r--r--sway/commands/bar/bindsym.c68
3 files changed, 107 insertions, 68 deletions
diff --git a/sway/commands/bar.c b/sway/commands/bar.c
index 507ee10a..ee5a8ebf 100644
--- a/sway/commands/bar.c
+++ b/sway/commands/bar.c
@@ -8,6 +8,7 @@
// Must be in alphabetical order for bsearch
static struct cmd_handler bar_handlers[] = {
+ { "bindcode", bar_cmd_bindcode },
{ "binding_mode_indicator", bar_cmd_binding_mode_indicator },
{ "bindsym", bar_cmd_bindsym },
{ "colors", bar_cmd_colors },
diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c
new file mode 100644
index 00000000..a4c65ec4
--- /dev/null
+++ b/sway/commands/bar/bind.c
@@ -0,0 +1,106 @@
+#include <libevdev/libevdev.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "sway/commands.h"
+#include "sway/config.h"
+#include "sway/input/cursor.h"
+#include "list.h"
+#include "log.h"
+#include "stringop.h"
+
+static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) {
+ const char *command = code ? "bar bindcode" : "bar bindsym";
+ struct cmd_results *error = NULL;
+ if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, 2))) {
+ return error;
+ }
+ if (!config->current_bar) {
+ return cmd_results_new(CMD_FAILURE, command, "No bar defined.");
+ }
+
+ struct bar_binding *binding = calloc(1, sizeof(struct bar_binding));
+ if (!binding) {
+ return cmd_results_new(CMD_FAILURE, command,
+ "Unable to allocate bar binding");
+ }
+
+ binding->release = false;
+ if (strcmp("--release", argv[0]) == 0) {
+ binding->release = true;
+ argv++;
+ argc--;
+ }
+
+ char *message = NULL;
+ if (code) {
+ binding->button = get_mouse_bindcode(argv[0], &message);
+ } else {
+ binding->button = get_mouse_bindsym(argv[0], &message);
+ }
+ if (message) {
+ free_bar_binding(binding);
+ error = cmd_results_new(CMD_INVALID, command, message);
+ free(message);
+ return error;
+ } else if (!binding->button) {
+ free_bar_binding(binding);
+ return cmd_results_new(CMD_INVALID, command,
+ "Unknown button %s", argv[0]);
+ }
+
+ const char *name = libevdev_event_code_get_name(EV_KEY, binding->button);
+ if (!name) {
+ switch (binding->button) {
+ case SWAY_SCROLL_UP:
+ name = "SWAY_SCROLL_UP";
+ break;
+ case SWAY_SCROLL_DOWN:
+ name = "SWAY_SCROLL_DOWN";
+ break;
+ case SWAY_SCROLL_LEFT:
+ name = "SWAY_SCROLL_LEFT";
+ break;
+ case SWAY_SCROLL_RIGHT:
+ name = "SWAY_SCROLL_RIGHT";
+ break;
+ default:
+ // Unreachable
+ break;
+ }
+ }
+
+ binding->command = join_args(argv + 1, argc - 1);
+
+ list_t *bindings = config->current_bar->bindings;
+ bool overwritten = false;
+ for (int i = 0; i < bindings->length; i++) {
+ struct bar_binding *other = bindings->items[i];
+ if (other->button == binding->button &&
+ other->release == binding->release) {
+ overwritten = true;
+ bindings->items[i] = binding;
+ free_bar_binding(other);
+ wlr_log(WLR_DEBUG, "[bar %s] Updated binding for %u (%s)%s",
+ config->current_bar->id, binding->button, name,
+ binding->release ? " - release" : "");
+ break;
+ }
+ }
+ if (!overwritten) {
+ list_add(bindings, binding);
+ wlr_log(WLR_DEBUG, "[bar %s] Added binding for %u (%s)%s",
+ config->current_bar->id, binding->button, name,
+ binding->release ? " - release" : "");
+ }
+
+ return cmd_results_new(CMD_SUCCESS, NULL, NULL);
+}
+
+struct cmd_results *bar_cmd_bindcode(int argc, char **argv) {
+ return bar_cmd_bind(argc, argv, true);
+}
+
+struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
+ return bar_cmd_bind(argc, argv, false);
+}
diff --git a/sway/commands/bar/bindsym.c b/sway/commands/bar/bindsym.c
deleted file mode 100644
index e6d6220e..00000000
--- a/sway/commands/bar/bindsym.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include "sway/commands.h"
-#include "sway/config.h"
-#include "list.h"
-#include "log.h"
-#include "stringop.h"
-
-struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
- struct cmd_results *error = NULL;
- if ((error = checkarg(argc, "bar bindsym", EXPECTED_AT_LEAST, 2))) {
- return error;
- }
- if (!config->current_bar) {
- return cmd_results_new(CMD_FAILURE, "bar bindsym", "No bar defined.");
- }
-
- struct bar_binding *binding = calloc(1, sizeof(struct bar_binding));
- if (!binding) {
- return cmd_results_new(CMD_FAILURE, "bar bindsym",
- "Unable to allocate bar binding");
- }
-
- binding->release = false;
- if (strcmp("--release", argv[0]) == 0) {
- binding->release = true;
- argv++;
- argc--;
- }
-
- binding->button = 0;
- if (strncasecmp(argv[0], "button", strlen("button")) == 0 &&
- strlen(argv[0]) == strlen("button0")) {
- binding->button = argv[0][strlen("button")] - '0';
- }
- if (binding->button < 1 || binding->button > 9) {
- free_bar_binding(binding);
- return cmd_results_new(CMD_FAILURE, "bar bindsym",
- "Only button<1-9> is supported");
- }
-
- binding->command = join_args(argv + 1, argc - 1);
-
- list_t *bindings = config->current_bar->bindings;
- bool overwritten = false;
- for (int i = 0; i < bindings->length; i++) {
- struct bar_binding *other = bindings->items[i];
- if (other->button == binding->button &&
- other->release == binding->release) {
- overwritten = true;
- bindings->items[i] = binding;
- free_bar_binding(other);
- wlr_log(WLR_DEBUG, "[bar %s] Updated binding for button%u%s",
- config->current_bar->id, binding->button,
- binding->release ? " (release)" : "");
- break;
- }
- }
- if (!overwritten) {
- list_add(bindings, binding);
- wlr_log(WLR_DEBUG, "[bar %s] Added binding for button%u%s",
- config->current_bar->id, binding->button,
- binding->release ? " (release)" : "");
- }
-
- return cmd_results_new(CMD_SUCCESS, NULL, NULL);
-}