diff --git a/src/click.c b/src/click.c index 811f74d50..12e391b53 100644 --- a/src/click.c +++ b/src/click.c @@ -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. */ @@ -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. */ @@ -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); 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; } @@ -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 * 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; @@ -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; @@ -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; } @@ -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. */ diff --git a/src/commands.c b/src/commands.c index ebcc27e32..69bb426d5 100644 --- a/src/commands.c +++ b/src/commands.c @@ -766,7 +766,7 @@ void cmd_border(I3_CMD, const char *border_style_str, long border_width) { */ void cmd_nop(I3_CMD, const char *comment) { LOG("-------------------------------------------------\n"); - LOG(" NOP: %s\n", comment); + LOG(" NOP: %.4000s\n", comment); LOG("-------------------------------------------------\n"); ysuccess(true); } @@ -1526,7 +1526,7 @@ void cmd_move_direction(I3_CMD, const char *direction_str, long move_px) { break; } - floating_reposition(current->con->parent, newrect); + cmd_output->needs_tree_render = floating_reposition(current->con->parent, newrect); } else { tree_move(current->con, direction); cmd_output->needs_tree_render = true; diff --git a/src/commands_parser.c b/src/commands_parser.c index f734a7aa3..2fd763095 100644 --- a/src/commands_parser.c +++ b/src/commands_parser.c @@ -263,7 +263,7 @@ char *parse_string(const char **walk, bool as_word) { * Free the returned CommandResult with command_result_free(). */ CommandResult *parse_command(const char *input, yajl_gen gen, ipc_client *client) { - DLOG("COMMAND: *%s*\n", input); + DLOG("COMMAND: *%.4000s*\n", input); state = INITIAL; CommandResult *result = scalloc(1, sizeof(CommandResult)); diff --git a/src/floating.c b/src/floating.c index 6e1c6b83a..fd313a521 100644 --- a/src/floating.c +++ b/src/floating.c @@ -514,9 +514,15 @@ bool floating_maybe_reassign_ws(Con *con) { Con *content = output_get_content(output->con); Con *ws = TAILQ_FIRST(&(content->focus_head)); DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name); + Con *needs_focus = con_descend_focused(con); + if (!con_inside_focused(needs_focus)) { + needs_focus = NULL; + } con_move_to_workspace(con, ws, false, true, false); - workspace_show(ws); - con_activate(con_descend_focused(con)); + if (needs_focus) { + workspace_show(ws); + con_activate(needs_focus); + } return true; } @@ -745,16 +751,13 @@ bool floating_reposition(Con *con, Rect newrect) { con->rect = newrect; - bool reassigned = floating_maybe_reassign_ws(con); + floating_maybe_reassign_ws(con); /* If this is a scratchpad window, don't auto center it from now on. */ if (con->scratchpad_state == SCRATCHPAD_FRESH) con->scratchpad_state = SCRATCHPAD_CHANGED; - /* Workspace change will already result in a tree_render. */ - if (!reassigned) { - tree_render(); - } + tree_render(); return true; } diff --git a/src/ipc.c b/src/ipc.c index 79e463931..e2b972559 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -217,15 +217,14 @@ void ipc_shutdown(shutdown_reason_t reason, int exempt_fd) { } /* - * Executes the command and returns whether it could be successfully parsed - * or not (at the moment, always returns true). + * Executes the given command. * */ IPC_HANDLER(run_command) { /* To get a properly terminated buffer, we copy * message_size bytes out of the buffer */ char *command = sstrndup((const char *)message, message_size); - LOG("IPC: received: *%s*\n", command); + LOG("IPC: received: *%.4000s*\n", command); yajl_gen gen = yajl_gen_alloc(NULL); CommandResult *result = parse_command(command, gen, client); diff --git a/src/window.c b/src/window.c index 369aaa96b..d84f8869a 100644 --- a/src/window.c +++ b/src/window.c @@ -288,7 +288,7 @@ bool window_update_normal_hints(i3Window *win, xcb_get_property_reply_t *reply, ASSIGN_IF_CHANGED(win->max_width, max_width); ASSIGN_IF_CHANGED(win->max_height, max_height); } else { - DLOG("Clearing maximum size \n"); + DLOG("Clearing maximum size\n"); ASSIGN_IF_CHANGED(win->max_width, 0); ASSIGN_IF_CHANGED(win->max_height, 0);