Skip to content
This repository has been archived by the owner on Apr 18, 2023. It is now read-only.

Commit

Permalink
Merge pull request #4005 from orestisfl/route_click_clutter
Browse files Browse the repository at this point in the history
route_click readability improvements
  • Loading branch information
Airblader committed Apr 11, 2020
2 parents f4b1da7 + 58d383b commit 62279ab
Showing 1 changed file with 24 additions and 28 deletions.
52 changes: 24 additions & 28 deletions src/click.c
Expand Up @@ -160,26 +160,20 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
if (con->parent->type == CT_DOCKAREA)
goto done;

const bool is_left_or_right_click = (event->detail == XCB_BUTTON_CLICK_LEFT ||
event->detail == XCB_BUTTON_CLICK_RIGHT);

/* if the user has bound an action to this click, it should override the
* default behavior. */
if (dest == CLICK_DECORATION || dest == CLICK_INSIDE || dest == CLICK_BORDER) {
Binding *bind = get_binding_from_xcb_event((xcb_generic_event_t *)event);

if (bind != NULL && ((dest == CLICK_DECORATION && !bind->exclude_titlebar) ||
(dest == CLICK_INSIDE && bind->whole_window) ||
(dest == CLICK_BORDER && bind->border))) {
CommandResult *result = run_binding(bind, con);

/* ASYNC_POINTER eats the event */
xcb_allow_events(conn, XCB_ALLOW_ASYNC_POINTER, event->time);
xcb_flush(conn);
Binding *bind = get_binding_from_xcb_event((xcb_generic_event_t *)event);
if (bind && ((dest == CLICK_DECORATION && !bind->exclude_titlebar) ||
(dest == CLICK_INSIDE && bind->whole_window) ||
(dest == CLICK_BORDER && bind->border))) {
CommandResult *result = run_binding(bind, con);

/* ASYNC_POINTER eats the event */
xcb_allow_events(conn, XCB_ALLOW_ASYNC_POINTER, event->time);
xcb_flush(conn);

command_result_free(result);
return;
}
command_result_free(result);
return;
}

/* There is no default behavior for button release events so we are done. */
Expand Down Expand Up @@ -207,14 +201,16 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
const bool proportional = (event->state & XCB_KEY_BUT_MASK_SHIFT) == XCB_KEY_BUT_MASK_SHIFT;
const bool in_stacked = (con->parent->layout == L_STACKED || con->parent->layout == L_TABBED);
const bool was_focused = focused == con;
const bool is_left_click = (event->detail == XCB_BUTTON_CLICK_LEFT);
const bool is_right_click = (event->detail == XCB_BUTTON_CLICK_RIGHT);
const bool is_left_or_right_click = (is_left_click || is_right_click);
const bool is_scroll = (event->detail == XCB_BUTTON_SCROLL_UP ||
event->detail == XCB_BUTTON_SCROLL_DOWN ||
event->detail == XCB_BUTTON_SCROLL_LEFT ||
event->detail == XCB_BUTTON_SCROLL_RIGHT);

/* 1: see if the user scrolled on the decoration of a stacked/tabbed con */
if (in_stacked &&
dest == CLICK_DECORATION &&
(event->detail == XCB_BUTTON_SCROLL_UP ||
event->detail == XCB_BUTTON_SCROLL_DOWN ||
event->detail == XCB_BUTTON_SCROLL_LEFT ||
event->detail == XCB_BUTTON_SCROLL_RIGHT)) {
if (in_stacked && dest == CLICK_DECORATION && is_scroll) {
DLOG("Scrolling on a window decoration\n");
/* Use the focused child of the tabbed / stacked container, not the
* container the user scrolled on. */
Expand All @@ -235,15 +231,15 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
Con *fs = con_get_fullscreen_covering_ws(ws);
if (floatingcon != NULL && fs != con) {
/* 4: floating_modifier plus left mouse button drags */
if (mod_pressed && event->detail == XCB_BUTTON_CLICK_LEFT) {
if (mod_pressed && is_left_click) {
floating_drag_window(floatingcon, event, false);
return;
}

/* 5: resize (floating) if this was a (left or right) click on the
* left/right/bottom border, or a right click on the decoration.
* also try resizing (tiling) if possible */
if (mod_pressed && event->detail == XCB_BUTTON_CLICK_RIGHT) {
if (mod_pressed && is_right_click) {
DLOG("floating resize due to floatingmodifier\n");
floating_resize_window(floatingcon, proportional, event);
return;
Expand All @@ -257,7 +253,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
goto done;
}

if (dest == CLICK_DECORATION && event->detail == XCB_BUTTON_CLICK_RIGHT) {
if (dest == CLICK_DECORATION && is_right_click) {
DLOG("floating resize due to decoration right click\n");
floating_resize_window(floatingcon, proportional, event);
return;
Expand All @@ -271,7 +267,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo

/* 6: dragging, if this was a click on a decoration (which did not lead
* to a resize) */
if (dest == CLICK_DECORATION && event->detail == XCB_BUTTON_CLICK_LEFT) {
if (dest == CLICK_DECORATION && is_left_click) {
floating_drag_window(floatingcon, event, !was_focused);
return;
}
Expand All @@ -280,7 +276,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
}

/* 7: floating modifier pressed, initiate a resize */
if (dest == CLICK_INSIDE && mod_pressed && event->detail == XCB_BUTTON_CLICK_RIGHT) {
if (dest == CLICK_INSIDE && mod_pressed && is_right_click) {
floating_mod_on_tiled_client(con, event);
/* Avoid propagating events to clients, since the user expects
* $mod + click to be handled by i3. */
Expand Down

0 comments on commit 62279ab

Please sign in to comment.