]> git.sur5r.net Git - i3/i3/commitdiff
Add mouse binding pointer position configuration
authorTony Crisci <tony@dubstepdish.com>
Fri, 30 Jan 2015 01:52:52 +0000 (20:52 -0500)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 31 Jan 2015 20:29:48 +0000 (21:29 +0100)
Add the `--whole-window` switch for mouse bindings. This switch controls
what part of the container the pointer must be over to trigger a mouse
binding. The default is to only trigger mouse bindings over the
titlebars. With this switch, a mouse binding will be triggered over the
main part of the window as well.

This is a breaking change to the previous behavior, which would trigger
a mouse binding with a modifier over any part of the window.

fixes #1429

docs/userguide
include/bindings.h
include/config_directives.h
include/data.h
parser-specs/config.spec
src/bindings.c
src/click.c
src/config_directives.c
testcases/t/201-config-parser.t

index 5f00fd6a47f59109000fc111dada66684546ffd6..d6afa334957b23898b6b208068b8de2a57ad3447 100644 (file)
@@ -404,12 +404,12 @@ can configure mouse bindings in a similar way to key bindings.
 
 *Syntax*:
 ----------------------------------
-bindsym [Modifiers+]button[n] command
+bindsym [--whole-window] [Modifiers+]button[n] command
 ----------------------------------
 
-If the binding has no modifiers, it will only run when you click on the
-titlebar of the window. Otherwise, it will run when any part of the window is
-clicked.
+By default, the binding will only run when you click on the titlebar of the
+window. If the +--whole-window+ flag is given, it will run when any part of the
+window is clicked.
 
 *Examples*:
 --------------------------------
@@ -417,7 +417,7 @@ clicked.
 bindsym button2 kill
 
 # The middle button and a modifer over any part of the window kills the window
-bindsym $mod+button2 kill
+bindsym --whole-window $mod+button2 kill
 
 # The right button toggles floating
 bindsym button3 floating toggle
index 02c3f190c9a8d7c0f8933eda4ea1f3806ac20aa2..19345f8c82ad6c6144d8c7bbde53f849bceb86eb 100644 (file)
@@ -24,7 +24,7 @@ const char *DEFAULT_BINDING_MODE;
  *
  */
 Binding *configure_binding(const char *bindtype, const char *modifiers, const char *input_code,
-                           const char *release, const char *command, const char *mode);
+                           const char *release, const char *whole_window, const char *command, const char *mode);
 
 /**
  * Grab the bound keys (tell X to send us keypress events for those keycodes)
index af7b9a90185bbc27069c722d84b28ced8938b186..0f1a6620ef1200f47b2f8b0738a7ab4589a4b24e 100644 (file)
@@ -61,10 +61,10 @@ CFGFUN(color_single, const char *colorclass, const char *color);
 CFGFUN(floating_modifier, const char *modifiers);
 CFGFUN(new_window, const char *windowtype, const char *border, const long width);
 CFGFUN(workspace, const char *workspace, const char *output);
-CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *command);
+CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *whole_window, const char *command);
 
 CFGFUN(enter_mode, const char *mode);
-CFGFUN(mode_binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *command);
+CFGFUN(mode_binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *whole_window, const char *command);
 
 CFGFUN(bar_font, const char *font);
 CFGFUN(bar_mode, const char *mode);
index 1a67685d8d5c9e57ebf6fab51549be8e2b3fd06a..8f2c197df3e11e4a9234323a5fd8b3fd6049b289 100644 (file)
@@ -255,6 +255,11 @@ struct Binding {
         B_UPON_KEYRELEASE_IGNORE_MODS = 2,
     } release;
 
+    /** If this is true for a mouse binding, the binding should be executed
+     * when the button is pressed over any part of the window, not just the
+     * title bar (default). */
+    bool whole_window;
+
     uint32_t number_keycodes;
 
     /** Keycode to bind */
index 4025665d50952c176b139ccaf80de08fa066f796..95c206fe4ae293166e2db6426f8f6c906f838348 100644 (file)
@@ -278,6 +278,8 @@ state FONT:
 state BINDING:
   release = '--release'
       ->
+  whole_window = '--whole-window'
+      ->
   modifiers = 'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5', 'Shift', 'Control', 'Ctrl', 'Mode_switch', '$mod'
       ->
   '+'
@@ -288,8 +290,10 @@ state BINDING:
 state BINDCOMMAND:
   release = '--release'
       ->
+  whole_window = '--whole-window'
+      ->
   command = string
-      -> call cfg_binding($bindtype, $modifiers, $key, $release, $command)
+      -> call cfg_binding($bindtype, $modifiers, $key, $release, $whole_window, $command)
 
 ################################################################################
 # Mode configuration
@@ -333,8 +337,10 @@ state MODE_BINDING:
 state MODE_BINDCOMMAND:
   release = '--release'
       ->
+  whole_window = '--whole-window'
+      ->
   command = string
-      -> call cfg_mode_binding($bindtype, $modifiers, $key, $release, $command); MODE
+      -> call cfg_mode_binding($bindtype, $modifiers, $key, $release, $whole_window, $command); MODE
 
 ################################################################################
 # Bar configuration (i3bar)
index 70d274a74c28ac2af08ce26aa238719f75a83e30..8f9767e69943e26a6df3b9cb091cfd38e5f47bf6 100644 (file)
@@ -49,10 +49,11 @@ static struct Mode *mode_from_name(const char *name) {
  *
  */
 Binding *configure_binding(const char *bindtype, const char *modifiers, const char *input_code,
-                           const char *release, const char *command, const char *modename) {
+                           const char *release, const char *whole_window, const char *command, const char *modename) {
     Binding *new_binding = scalloc(sizeof(Binding));
     DLOG("bindtype %s, modifiers %s, input code %s, release %s\n", bindtype, modifiers, input_code, release);
     new_binding->release = (release != NULL ? B_UPON_KEYRELEASE : B_UPON_KEYPRESS);
+    new_binding->whole_window = (whole_window != NULL);
     if (strcmp(bindtype, "bindsym") == 0) {
         new_binding->input_type = (strncasecmp(input_code, "button", (sizeof("button") - 1)) == 0
                                        ? B_MOUSE
index 5c36aeb0e45193f4579bbc437ec7be6e9832ef83..86a63ea68ce4cce090bb45f636e52b94d0098a2f 100644 (file)
@@ -182,9 +182,9 @@ static int route_click(Con *con, xcb_button_press_event_t *event, const bool mod
     if (dest == CLICK_DECORATION || dest == CLICK_INSIDE) {
         Binding *bind = get_binding_from_xcb_event((xcb_generic_event_t *)event);
         /* clicks over a window decoration will always trigger the binding and
-         * clicks on the inside of the window will only trigger a binding if it
-         * has modifiers. */
-        if (bind && (dest == CLICK_DECORATION || (bind->mods && dest == CLICK_INSIDE))) {
+         * clicks on the inside of the window will only trigger a binding if
+         * the --whole-window flag was given for the binding. */
+        if (bind && (dest == CLICK_DECORATION || bind->whole_window)) {
             CommandResult *result = run_binding(bind, con);
 
             /* ASYNC_POINTER eats the event */
index 690e08bf007293a6fa6352b521d836f5b5390be9..e8fdfe77ec5a68b40bbb3e505c60aeae055377e3 100644 (file)
@@ -171,8 +171,8 @@ CFGFUN(font, const char *font) {
     font_pattern = sstrdup(font);
 }
 
-CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *command) {
-    configure_binding(bindtype, modifiers, key, release, command, DEFAULT_BINDING_MODE);
+CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *whole_window, const char *command) {
+    configure_binding(bindtype, modifiers, key, release, whole_window, command, DEFAULT_BINDING_MODE);
 }
 
 /*******************************************************************************
@@ -181,8 +181,8 @@ CFGFUN(binding, const char *bindtype, const char *modifiers, const char *key, co
 
 static char *current_mode;
 
-CFGFUN(mode_binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *command) {
-    configure_binding(bindtype, modifiers, key, release, command, current_mode);
+CFGFUN(mode_binding, const char *bindtype, const char *modifiers, const char *key, const char *release, const char *whole_window, const char *command) {
+    configure_binding(bindtype, modifiers, key, release, whole_window, command, current_mode);
 }
 
 CFGFUN(enter_mode, const char *modename) {
index 1153423b4bf77b4e41ee3388179a50c0cab5966e..86ef731f58d69013223db30b420b4d483c7c4e51 100644 (file)
@@ -50,9 +50,9 @@ EOT
 
 my $expected = <<'EOT';
 cfg_enter_mode(meh)
-cfg_mode_binding(bindsym, Mod1,Shift, x, (null), resize grow)
-cfg_mode_binding(bindcode, Mod1, 44, (null), resize shrink)
-cfg_mode_binding(bindsym, Mod1, x, --release, exec foo)
+cfg_mode_binding(bindsym, Mod1,Shift, x, (null), (null), resize grow)
+cfg_mode_binding(bindcode, Mod1, 44, (null), (null), resize shrink)
+cfg_mode_binding(bindsym, Mod1, x, --release, (null), exec foo)
 EOT
 
 is(parser_calls($config),
@@ -618,7 +618,7 @@ EOT
 
 $expected = <<'EOT';
 cfg_enter_mode(yo)
-cfg_mode_binding(bindsym, (null), x, (null), resize shrink left)
+cfg_mode_binding(bindsym, (null), x, (null), (null), resize shrink left)
 ERROR: CONFIG: Expected one of these tokens: <end>, '#', 'set', 'bindsym', 'bindcode', 'bind', '}'
 ERROR: CONFIG: (in file <stdin>)
 ERROR: CONFIG: Line   1: mode "yo" {