]> git.sur5r.net Git - i3/i3/commitdiff
Allow mouse bindings to run on the root window. 2108/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Sat, 12 Dec 2015 20:45:59 +0000 (15:45 -0500)
committerIngo Bürk <ingo.buerk@tngtech.com>
Mon, 14 Dec 2015 21:26:36 +0000 (16:26 -0500)
Previously, mouse bindings could only be run when a window was present,
by using --whole-window. Such bindings would not work on empty
workspaces. However, this is a valid usecase for bindings like

    bindsym $mod+button4 workspace prev
    bindsym $mod+button5 workspace next

Hence, we need to grab the root window as well and run bindings on it.

fixes #2097

src/bindings.c
src/click.c

index b9d994ea3ce566db2d96ed53bb35f79bb2b94254..16235a1e2bbe4a81449347a21044f198572a9999 100644 (file)
@@ -164,6 +164,10 @@ void regrab_all_buttons(xcb_connection_t *conn) {
         xcb_grab_buttons(conn, con->window->id, grab_scrollwheel);
     }
 
+    /* Also grab the root window to allow bindings to work on there as well. */
+    xcb_ungrab_button(conn, XCB_BUTTON_INDEX_ANY, root, XCB_BUTTON_MASK_ANY);
+    xcb_grab_buttons(conn, root, grab_scrollwheel);
+
     xcb_ungrab_server(conn);
 }
 
index c895666dd529fb798d271afb0fecbb1257d63db8..66a271c287f581c955f359d348ac95c277982fd7 100644 (file)
@@ -363,6 +363,21 @@ int handle_button_press(xcb_button_press_event_t *event) {
         return route_click(con, event, mod_pressed, CLICK_INSIDE);
 
     if (!(con = con_by_frame_id(event->event))) {
+        /* Run bindings on the root window as well, see #2097. We only run it
+         * if --whole-window was set as that's the equivalent for a normal
+         * window. */
+        if (event->event == root) {
+            Binding *bind = get_binding_from_xcb_event((xcb_generic_event_t *)event);
+            if (bind != NULL && bind->whole_window) {
+                CommandResult *result = run_binding(bind, NULL);
+                if (result->needs_tree_render) {
+                    tree_render();
+                }
+
+                command_result_free(result);
+            }
+        }
+
         /* 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 && event->response_type == XCB_BUTTON_PRESS) {