]> git.sur5r.net Git - i3/i3/commitdiff
Handle button release events 1451/head
authorTony Crisci <tony@dubstepdish.com>
Tue, 10 Feb 2015 22:46:02 +0000 (17:46 -0500)
committerTony Crisci <tony@dubstepdish.com>
Tue, 10 Feb 2015 22:46:02 +0000 (17:46 -0500)
This enables the --release switch on mouse button bindings.

docs/userguide
src/click.c
src/handlers.c

index d6afa334957b23898b6b208068b8de2a57ad3447..4b4dacc858a1c76ce62b024ee756804be9b3ce08 100644 (file)
@@ -404,17 +404,18 @@ can configure mouse bindings in a similar way to key bindings.
 
 *Syntax*:
 ----------------------------------
-bindsym [--whole-window] [Modifiers+]button[n] command
+bindsym [--release] [--whole-window] [Modifiers+]button[n] command
 ----------------------------------
 
 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.
+window is clicked. If the +--release+ flag is given, it will run when the mouse
+button is released.
 
 *Examples*:
 --------------------------------
 # The middle button over a titlebar kills the window
-bindsym button2 kill
+bindsym --release button2 kill
 
 # The middle button and a modifer over any part of the window kills the window
 bindsym --whole-window $mod+button2 kill
index 86a63ea68ce4cce090bb45f636e52b94d0098a2f..51ffcf3ab3c4361452897713bf399bdf70c87302 100644 (file)
@@ -200,6 +200,11 @@ static int route_click(Con *con, xcb_button_press_event_t *event, const bool mod
         }
     }
 
+    /* There is no default behavior for button release events so we are done. */
+    if (event->response_type == XCB_BUTTON_RELEASE) {
+        goto done;
+    }
+
     /* Any click in a workspace should focus that workspace. If the
      * workspace is on another output we need to do a workspace_show in
      * order for i3bar (and others) to notice the change in workspace. */
@@ -336,9 +341,10 @@ done:
  */
 int handle_button_press(xcb_button_press_event_t *event) {
     Con *con;
-    DLOG("Button %d pressed on window 0x%08x (child 0x%08x) at (%d, %d) (root %d, %d)\n",
-         event->state, event->event, event->child, event->event_x, event->event_y,
-         event->root_x, event->root_y);
+    DLOG("Button %d %s on window 0x%08x (child 0x%08x) at (%d, %d) (root %d, %d)\n",
+         event->state, (event->response_type == XCB_BUTTON_PRESS ? "press" : "release"),
+         event->event, event->child, event->event_x, event->event_y, event->root_x,
+         event->root_y);
 
     last_timestamp = event->time;
 
@@ -351,7 +357,7 @@ int handle_button_press(xcb_button_press_event_t *event) {
     if (!(con = con_by_frame_id(event->event))) {
         /* If the root window is clicked, find the relevant output from the
          * click coordinates and focus the output's active workspace. */
-        if (event->event == root) {
+        if (event->event == root && event->response_type == XCB_BUTTON_PRESS) {
             Con *output, *ws;
             TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
                 if (con_is_internal(output) ||
index 569a8ec3deb1b36a0875f255a5062ca9c5c7cc00..7ebb2ccbf22e961875965d1d5760f6203be066ff 100644 (file)
@@ -1257,6 +1257,7 @@ void handle_event(int type, xcb_generic_event_t *event) {
             break;
 
         case XCB_BUTTON_PRESS:
+        case XCB_BUTTON_RELEASE:
             handle_button_press((xcb_button_press_event_t *)event);
             break;