]> git.sur5r.net Git - i3/i3/commitdiff
Implement i3's logic for maintaining a list of 'bindsym' directives and passing it...
authorIngo Bürk <ingo.buerk@tngtech.com>
Sat, 2 May 2015 19:54:56 +0000 (21:54 +0200)
committerIngo Bürk <ingo.buerk@tngtech.com>
Fri, 5 Jun 2015 10:30:53 +0000 (12:30 +0200)
include/config.h
src/config_directives.c
src/ipc.c
testcases/t/201-config-parser.t

index 33cbaba0a4cea826c4af9f185338eab05c760310..3955fc7938cb26ec660a1ed7a387a2ca6066d6a7 100644 (file)
@@ -281,13 +281,7 @@ struct Barconfig {
         M_MOD5 = 7
     } modifier;
 
-    /** Command that should be run when mouse wheel up button is pressed over
-     * i3bar to override the default behavior. */
-    char *wheel_up_cmd;
-
-    /** Command that should be run when mouse wheel down button is pressed over
-     * i3bar to override the default behavior. */
-    char *wheel_down_cmd;
+    TAILQ_HEAD(mouse_commands_head, Mousecommand) mouse_commands;
 
     /** Bar position (bottom by default). */
     enum { P_BOTTOM = 0,
@@ -353,6 +347,21 @@ struct Barconfig {
     TAILQ_ENTRY(Barconfig) configs;
 };
 
+/**
+ * Defines a mouse command to be executed instead of the default behavior when
+ * clicking on the non-statusline part of i3bar.
+ *
+ */
+struct Mousecommand {
+    /** The button for this command (e.g., "button1") */
+    char *button;
+
+    /** The command which is to be executed for this button. */
+    char *command;
+
+    TAILQ_ENTRY(Mousecommand) commands;
+};
+
 /**
  * Finds the configuration file to use (either the one specified by
  * override_configpath), the user’s one or the system default) and calls
index cf15d8d4d16fde4a7db18f1901cefbb9fae10204..182f2e3538b583db83c907277e19999e278d540d 100644 (file)
@@ -531,6 +531,23 @@ CFGFUN(bar_modifier, const char *modifier) {
 }
 
 static void bar_configure_mouse_command(const char *button, const char *command) {
+    if (strncasecmp(button, "button", sizeof("button") - 1) != 0) {
+        ELOG("unknown button \"%s\" for mouse command, ignoring.\n", button);
+        return;
+    }
+
+    struct Mousecommand *current;
+    TAILQ_FOREACH(current, &(current_bar.mouse_commands), commands) {
+        if (strcasecmp(current->button, button) == 0) {
+            ELOG("command for button %s was already specified, ignoring.\n", button);
+            return;
+        }
+    }
+
+    struct Mousecommand *new_command = scalloc(sizeof(struct Mousecommand));
+    new_command->button = sstrdup(button);
+    new_command->command = sstrdup(command);
+    TAILQ_INSERT_TAIL(&(current_bar.mouse_commands), new_command, commands);
 }
 
 CFGFUN(bar_wheel_up_cmd, const char *command) {
index ae213b3aa906ff80f3ae6bc500493bbd3acc1ac5..fa02883401015533832637789da5a51b07e9347e 100644 (file)
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -469,6 +469,19 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) {
     y(map_close);
 }
 
+static void dump_mouse_commands(yajl_gen gen, Barconfig *config) {
+    ystr("mouse_commands");
+    y(map_open);
+
+    struct Mousecommand *current;
+    TAILQ_FOREACH(current, &(config->mouse_commands), commands) {
+        ystr(current->button);
+        ystr(current->command);
+    }
+
+    y(map_close);
+}
+
 static void dump_bar_config(yajl_gen gen, Barconfig *config) {
     y(map_open);
 
@@ -549,15 +562,7 @@ static void dump_bar_config(yajl_gen gen, Barconfig *config) {
             break;
     }
 
-    if (config->wheel_up_cmd) {
-        ystr("wheel_up_cmd");
-        ystr(config->wheel_up_cmd);
-    }
-
-    if (config->wheel_down_cmd) {
-        ystr("wheel_down_cmd");
-        ystr(config->wheel_down_cmd);
-    }
+    dump_mouse_commands(gen, config);
 
     ystr("position");
     if (config->position == P_BOTTOM)
index 9dc0f84005d815762c8e2dbe38cdc77bb476d200..faf2f0db7e907e7c1fcc76101044ef6cb23e7f29 100644 (file)
@@ -688,6 +688,7 @@ bar {
 EOT
 
 $expected = <<'EOT';
+cfg_bar_start()
 cfg_bar_output(LVDS-1)
 ERROR: CONFIG: Expected one of these tokens: <end>, '#', 'set', 'i3bar_command', 'status_command', 'socket_path', 'mode', 'hidden_state', 'id', 'modifier', 'wheel_up_cmd', 'wheel_down_cmd', 'bindsym', 'position', 'output', 'tray_output', 'font', 'separator_symbol', 'binding_mode_indicator', 'workspace_buttons', 'strip_workspace_numbers', 'verbose', 'colors', '}'
 ERROR: CONFIG: (in file <stdin>)