X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fclick.c;h=74e5988547732b4af0c0f0f63a3b3bcd20f09e6e;hb=08f64f011d00da966b474d4f93f7f55b78387fb7;hp=31b925fab410ede5303c350b92bf4dc1c179ab76;hpb=1891a385ad0288f66384cab69f2f7ae4ef7e5eec;p=i3%2Fi3 diff --git a/src/click.c b/src/click.c index 31b925fa..74e59885 100644 --- a/src/click.c +++ b/src/click.c @@ -160,23 +160,35 @@ static int route_click(Con *con, xcb_button_press_event_t *event, bool mod_press /* get the floating con */ Con *floatingcon = con_inside_floating(con); const bool proportional = (event->state & BIND_SHIFT); + const bool in_stacked = (con->parent->layout == L_STACKED || con->parent->layout == L_TABBED); - /* 1: focus this con */ - con_focus(con); + /* 1: see if the user scrolled on the decoration of a stacked/tabbed con */ + if (in_stacked && + dest == CLICK_DECORATION && + (event->detail == XCB_BUTTON_INDEX_4 || + event->detail == XCB_BUTTON_INDEX_5)) { + DLOG("Scrolling on a window decoration\n"); + orientation_t orientation = (con->parent->layout == L_STACKED ? VERT : HORIZ); + if (event->detail == XCB_BUTTON_INDEX_4) + tree_next('p', orientation); + else tree_next('n', orientation); + goto done; + } - const bool in_stacked = (con->parent->layout == L_STACKED || con->parent->layout == L_TABBED); + /* 2: focus this con */ + con_focus(con); - /* 2: for floating containers, we also want to raise them on click */ + /* 3: for floating containers, we also want to raise them on click */ if (floatingcon != NULL) { floating_raise_con(floatingcon); - /* 3: floating_modifier plus left mouse button drags */ + /* 4: floating_modifier plus left mouse button drags */ if (mod_pressed && event->detail == 1) { floating_drag_window(floatingcon, event); return 1; } - /* 3: resize (floating) if this was a click on the left/right/bottom + /* 5: resize (floating) if this was a click on the left/right/bottom * border. also try resizing (tiling) if it was a click on the top * border, but continue if that does not work */ if (mod_pressed && event->detail == 3) { @@ -198,7 +210,7 @@ static int route_click(Con *con, xcb_button_press_event_t *event, bool mod_press return 1; } - /* 4: dragging, if this was a click on a decoration (which did not lead + /* 6: dragging, if this was a click on a decoration (which did not lead * to a resize) */ if (!in_stacked && dest == CLICK_DECORATION) { floating_drag_window(floatingcon, event); @@ -217,12 +229,12 @@ static int route_click(Con *con, xcb_button_press_event_t *event, bool mod_press goto done; } - /* 3: floating modifier pressed, initiate a resize */ + /* 7: floating modifier pressed, initiate a resize */ if (mod_pressed && event->detail == 3) { if (floating_mod_on_tiled_client(con, event)) return 1; } - /* 4: otherwise, check for border/decoration clicks and resize */ + /* 8: otherwise, check for border/decoration clicks and resize */ else if (dest == CLICK_BORDER || dest == CLICK_DECORATION) { DLOG("Should trry resizing (tiling)\n"); tiling_resize(con, event, dest); @@ -243,7 +255,7 @@ done: * Then, route_click is called on the appropriate con. * */ -int handle_button_press(void *ignored, xcb_connection_t *conn, xcb_button_press_event_t *event) { +int handle_button_press(xcb_button_press_event_t *event) { Con *con; DLOG("Button %d pressed on window 0x%08x\n", event->state, event->event);