Merge pull request #4005 from orestisfl/route_click_clutter

route_click readability improvements
This commit is contained in:
Ingo Bürk 2020-04-11 19:51:00 +02:00 committed by GitHub
commit 62279aba45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 27 deletions

View File

@ -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) if (con->parent->type == CT_DOCKAREA)
goto done; 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 /* if the user has bound an action to this click, it should override the
* default behavior. */ * default behavior. */
if (dest == CLICK_DECORATION || dest == CLICK_INSIDE || dest == CLICK_BORDER) { Binding *bind = get_binding_from_xcb_event((xcb_generic_event_t *)event);
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);
if (bind != NULL && ((dest == CLICK_DECORATION && !bind->exclude_titlebar) || /* ASYNC_POINTER eats the event */
(dest == CLICK_INSIDE && bind->whole_window) || xcb_allow_events(conn, XCB_ALLOW_ASYNC_POINTER, event->time);
(dest == CLICK_BORDER && bind->border))) { xcb_flush(conn);
CommandResult *result = run_binding(bind, con);
/* ASYNC_POINTER eats the event */ command_result_free(result);
xcb_allow_events(conn, XCB_ALLOW_ASYNC_POINTER, event->time); return;
xcb_flush(conn);
command_result_free(result);
return;
}
} }
/* There is no default behavior for button release events so we are done. */ /* There is no default behavior for button release events so we are done. */
@ -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 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 in_stacked = (con->parent->layout == L_STACKED || con->parent->layout == L_TABBED);
const bool was_focused = focused == con; 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 */ /* 1: see if the user scrolled on the decoration of a stacked/tabbed con */
if (in_stacked && if (in_stacked && dest == CLICK_DECORATION && is_scroll) {
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)) {
DLOG("Scrolling on a window decoration\n"); DLOG("Scrolling on a window decoration\n");
/* Use the focused child of the tabbed / stacked container, not the /* Use the focused child of the tabbed / stacked container, not the
* container the user scrolled on. */ * container the user scrolled on. */
@ -235,7 +231,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
Con *fs = con_get_fullscreen_covering_ws(ws); Con *fs = con_get_fullscreen_covering_ws(ws);
if (floatingcon != NULL && fs != con) { if (floatingcon != NULL && fs != con) {
/* 4: floating_modifier plus left mouse button drags */ /* 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); floating_drag_window(floatingcon, event, false);
return; return;
} }
@ -243,7 +239,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
/* 5: resize (floating) if this was a (left or right) click on the /* 5: resize (floating) if this was a (left or right) click on the
* left/right/bottom border, or a right click on the decoration. * left/right/bottom border, or a right click on the decoration.
* also try resizing (tiling) if possible */ * 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"); DLOG("floating resize due to floatingmodifier\n");
floating_resize_window(floatingcon, proportional, event); floating_resize_window(floatingcon, proportional, event);
return; return;
@ -257,7 +253,7 @@ static void route_click(Con *con, xcb_button_press_event_t *event, const bool mo
goto done; 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"); DLOG("floating resize due to decoration right click\n");
floating_resize_window(floatingcon, proportional, event); floating_resize_window(floatingcon, proportional, event);
return; return;
@ -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 /* 6: dragging, if this was a click on a decoration (which did not lead
* to a resize) */ * 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); floating_drag_window(floatingcon, event, !was_focused);
return; return;
} }
@ -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 */ /* 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); floating_mod_on_tiled_client(con, event);
/* Avoid propagating events to clients, since the user expects /* Avoid propagating events to clients, since the user expects
* $mod + click to be handled by i3. */ * $mod + click to be handled by i3. */