X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fx.c;h=7fe7044547b8d4d348ea73641c610f8bd4411658;hb=884214f14fdbd0a4a368d2a36d5e50324fa1d52a;hp=02fc338fb12826e655109633a00dd1b6530d1010;hpb=05f058581780de3b9c25d37ea4319122592dbec2;p=i3%2Fi3 diff --git a/src/x.c b/src/x.c index 02fc338f..7fe70445 100644 --- a/src/x.c +++ b/src/x.c @@ -4,7 +4,7 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * * x.c: Interface to X11, transfers our in-memory state to X11 (see also * render.c). Basically a big state machine. @@ -15,9 +15,9 @@ /* Stores the X11 window ID of the currently focused window */ xcb_window_t focused_id = XCB_NONE; -/* Because 'focused_id' might be reset to force input focus (after click to - * raise), we separately keep track of the X11 window ID to be able to always - * tell whether the focused window actually changed. */ +/* Because 'focused_id' might be reset to force input focus, we separately keep + * track of the X11 window ID to be able to always tell whether the focused + * window actually changed. */ static xcb_window_t last_focused = XCB_NONE; /* Stores coordinates to warp mouse pointer to if set */ @@ -77,8 +77,8 @@ TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head = static con_state *state_for_frame(xcb_window_t window) { con_state *state; CIRCLEQ_FOREACH(state, &state_head, state) - if (state->id == window) - return state; + if (state->id == window) + return state; /* TODO: better error handling? */ ELOG("No state found\n"); @@ -140,7 +140,7 @@ void x_con_init(Con *con, uint16_t depth) { values[2] = colormap; } - Rect dims = { -15, -15, 10, 10 }; + Rect dims = {-15, -15, 10, 10}; con->frame = create_window(conn, dims, depth, visual, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCURSOR_CURSOR_POINTER, false, mask, values); if (win_colormap != XCB_NONE) @@ -214,7 +214,7 @@ void x_move_win(Con *src, Con *dest) { state_dest->con = state_src->con; state_src->con = NULL; - Rect zero = { 0, 0, 0, 0 }; + Rect zero = {0, 0, 0, 0}; if (memcmp(&(state_dest->window_rect), &(zero), sizeof(Rect)) == 0) { memcpy(&(state_dest->window_rect), &(state_src->window_rect), sizeof(Rect)); DLOG("COPYING RECT\n"); @@ -296,7 +296,7 @@ void x_window_kill(xcb_window_t window, kill_window_t kill_window) { ev->data.data32[1] = XCB_CURRENT_TIME; LOG("Sending WM_DELETE to the client\n"); - xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)ev); + xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char *)ev); xcb_flush(conn); free(event); } @@ -352,8 +352,8 @@ void x_draw_decoration(Con *con) { Rect *r = &(con->rect); Rect *w = &(con->window_rect); - p->con_rect = (struct width_height){ r->width, r->height }; - p->con_window_rect = (struct width_height){ w->width, w->height }; + p->con_rect = (struct width_height){r->width, r->height}; + p->con_window_rect = (struct width_height){w->width, w->height}; p->con_deco_rect = con->deco_rect; p->background = config.client.background; p->con_is_leaf = con_is_leaf(con); @@ -363,6 +363,7 @@ void x_draw_decoration(Con *con) { (con->window == NULL || !con->window->name_x_changed) && !parent->pixmap_recreated && !con->pixmap_recreated && + !con->mark_changed && memcmp(p, con->deco_render_params, sizeof(struct deco_render_params)) == 0) { free(p); goto copy_pixmaps; @@ -381,19 +382,19 @@ void x_draw_decoration(Con *con) { parent->pixmap_recreated = false; con->pixmap_recreated = false; + con->mark_changed = false; /* 2: draw the client.background, but only for the parts around the client_rect */ if (con->window != NULL) { xcb_rectangle_t background[] = { /* top area */ - { 0, 0, r->width, w->y }, + {0, 0, r->width, w->y}, /* bottom area */ - { 0, (w->y + w->height), r->width, r->height - (w->y + w->height) }, + {0, (w->y + w->height), r->width, r->height - (w->y + w->height)}, /* left area */ - { 0, 0, w->x, r->height }, + {0, 0, w->x, r->height}, /* right area */ - { w->x + w->width, 0, r->width - (w->x + w->width), r->height } - }; + {w->x + w->width, 0, r->width - (w->x + w->width), r->height}}; #if 0 for (int i = 0; i < 4; i++) DLOG("rect is (%d, %d) with %d x %d\n", @@ -404,7 +405,7 @@ void x_draw_decoration(Con *con) { ); #endif - xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]) { config.client.background }); + xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){config.client.background}); xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, sizeof(background) / sizeof(xcb_rectangle_t), background); } @@ -425,22 +426,22 @@ void x_draw_decoration(Con *con) { * (left, bottom and right part). We don’t just fill the whole * rectangle because some childs are not freely resizable and we want * their background color to "shine through". */ - xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->background }); + xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->background}); if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) { - xcb_rectangle_t leftline = { 0, 0, br.x, r->height }; + xcb_rectangle_t leftline = {0, 0, br.x, r->height}; xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, &leftline); } if (!(borders_to_hide & ADJ_RIGHT_SCREEN_EDGE)) { - xcb_rectangle_t rightline = { r->width + br.width + br.x, 0, r->width, r->height }; + xcb_rectangle_t rightline = {r->width + (br.width + br.x), 0, -(br.width + br.x), r->height}; xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, &rightline); } if (!(borders_to_hide & ADJ_LOWER_SCREEN_EDGE)) { - xcb_rectangle_t bottomline = { 0, r->height + br.height + br.y, r->width, r->height }; + xcb_rectangle_t bottomline = {br.x, r->height + (br.height + br.y), r->width + br.width, -(br.height + br.y)}; xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, &bottomline); } /* 1pixel border needs an additional line at the top */ if (p->border_style == BS_PIXEL && !(borders_to_hide & ADJ_UPPER_SCREEN_EDGE)) { - xcb_rectangle_t topline = { br.x, 0, con->rect.width + br.width + br.x, br.y }; + xcb_rectangle_t topline = {br.x, 0, r->width + br.width, br.y}; xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, &topline); } @@ -451,15 +452,14 @@ void x_draw_decoration(Con *con) { if (TAILQ_NEXT(con, nodes) == NULL && TAILQ_PREV(con, nodes_head, nodes) == NULL && con->parent->type != CT_FLOATING_CON) { - xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->indicator }); + xcb_change_gc(conn, con->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->indicator}); if (p->parent_layout == L_SPLITH) xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, (xcb_rectangle_t[]){ - { r->width + br.width + br.x, br.y, r->width, r->height + br.height } }); + {r->width + (br.width + br.x), br.y, -(br.width + br.x), r->height + br.height}}); else if (p->parent_layout == L_SPLITV) xcb_poly_fill_rectangle(conn, con->pixmap, con->pm_gc, 1, (xcb_rectangle_t[]){ - { br.x, r->height + br.height + br.y, r->width - (2 * br.x), r->height } }); + {br.x, r->height + (br.height + br.y), r->width + br.width, -(br.height + br.y)}}); } - } /* if this is a borderless/1pixel window, we don’t need to render the @@ -468,28 +468,26 @@ void x_draw_decoration(Con *con) { goto copy_pixmaps; /* 4: paint the bar */ - xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->background }); - xcb_rectangle_t drect = { con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height }; + xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->background}); + xcb_rectangle_t drect = {con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height}; xcb_poly_fill_rectangle(conn, parent->pixmap, parent->pm_gc, 1, &drect); /* 5: draw two unconnected horizontal lines in border color */ - xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->border }); + xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->border}); Rect *dr = &(con->deco_rect); - int deco_diff_l = 2; - int deco_diff_r = 2; - if (parent->layout == L_TABBED) { - if (TAILQ_PREV(con, nodes_head, nodes) != NULL) - deco_diff_l = 0; - if (TAILQ_NEXT(con, nodes) != NULL) - deco_diff_r = 0; + adjacent_t borders_to_hide = con_adjacent_borders(con) & config.hide_edge_borders; + int deco_diff_l = borders_to_hide & ADJ_LEFT_SCREEN_EDGE ? 0 : con->current_border_width; + int deco_diff_r = borders_to_hide & ADJ_RIGHT_SCREEN_EDGE ? 0 : con->current_border_width; + if (parent->layout == L_TABBED || + (parent->layout == L_STACKED && TAILQ_NEXT(con, nodes) != NULL)) { + deco_diff_l = 0; + deco_diff_r = 0; } xcb_segment_t segments[] = { - { dr->x, dr->y, - dr->x + dr->width - 1, dr->y }, - - { dr->x + deco_diff_l, dr->y + dr->height - 1, - dr->x - deco_diff_r + dr->width - 1, dr->y + dr->height - 1 } - }; + {dr->x, dr->y, + dr->x + dr->width - 1, dr->y}, + {dr->x + deco_diff_l, dr->y + dr->height - 1, + dr->x - deco_diff_r + dr->width - 1, dr->y + dr->height - 1}}; xcb_poly_segment(conn, parent->pixmap, parent->pm_gc, 2, segments); /* 6: draw the title */ @@ -507,9 +505,9 @@ void x_draw_decoration(Con *con) { free(tree); draw_text_ascii(title, - parent->pixmap, parent->pm_gc, - con->deco_rect.x + 2, con->deco_rect.y + text_offset_y, - con->deco_rect.width - 2); + parent->pixmap, parent->pm_gc, + con->deco_rect.x + 2, con->deco_rect.y + text_offset_y, + con->deco_rect.width - 2); free(title); goto after_title; @@ -535,10 +533,25 @@ void x_draw_decoration(Con *con) { //DLOG("indent_level = %d, indent_mult = %d\n", indent_level, indent_mult); int indent_px = (indent_level * 5) * indent_mult; + int mark_width = 0; + if (config.show_marks && con->mark != NULL && (con->mark)[0] != '_') { + char *formatted_mark; + sasprintf(&formatted_mark, "[%s]", con->mark); + i3String *mark = i3string_from_utf8(formatted_mark); + FREE(formatted_mark); + mark_width = predict_text_width(mark); + + draw_text(mark, parent->pixmap, parent->pm_gc, + con->deco_rect.x + con->deco_rect.width - mark_width - logical_px(2), + con->deco_rect.y + text_offset_y, mark_width); + + I3STRING_FREE(mark); + } + draw_text(win->name, - parent->pixmap, parent->pm_gc, - con->deco_rect.x + 2 + indent_px, con->deco_rect.y + text_offset_y, - con->deco_rect.width - 2 - indent_px); + parent->pixmap, parent->pm_gc, + con->deco_rect.x + logical_px(2) + indent_px, con->deco_rect.y + text_offset_y, + con->deco_rect.width - logical_px(2) - indent_px - mark_width - logical_px(2)); after_title: /* Since we don’t clip the text at all, it might in some cases be painted @@ -549,21 +562,21 @@ after_title: /* Draw a 1px separator line before and after every tab, so that tabs can * be easily distinguished. */ if (parent->layout == L_TABBED) { - xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->border }); + xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->border}); } else { - xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->background }); + xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->background}); } xcb_poly_line(conn, XCB_COORD_MODE_ORIGIN, parent->pixmap, parent->pm_gc, 6, (xcb_point_t[]){ - { dr->x + dr->width, dr->y }, - { dr->x + dr->width, dr->y + dr->height }, - { dr->x + dr->width - 1, dr->y }, - { dr->x + dr->width - 1, dr->y + dr->height }, - { dr->x, dr->y + dr->height }, - { dr->x, dr->y }, + {dr->x + dr->width, dr->y}, + {dr->x + dr->width, dr->y + dr->height}, + {dr->x + dr->width - 1, dr->y}, + {dr->x + dr->width - 1, dr->y + dr->height}, + {dr->x, dr->y + dr->height}, + {dr->x, dr->y}, }); - xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){ p->color->border }); + xcb_change_gc(conn, parent->pm_gc, XCB_GC_FOREGROUND, (uint32_t[]){p->color->border}); xcb_poly_segment(conn, parent->pixmap, parent->pm_gc, 2, segments); copy_pixmaps: @@ -584,10 +597,10 @@ void x_deco_recurse(Con *con) { if (!leaf) { TAILQ_FOREACH(current, &(con->nodes_head), nodes) - x_deco_recurse(current); + x_deco_recurse(current); TAILQ_FOREACH(current, &(con->floating_head), floating_windows) - x_deco_recurse(current); + x_deco_recurse(current); if (state->mapped) xcb_copy_area(conn, con->pixmap, con->frame, con->pm_gc, 0, 0, 0, 0, con->rect.width, con->rect.height); @@ -644,7 +657,7 @@ void x_push_node(Con *con) { /* Temporarily set the event masks to XCB_NONE so that we won’t get * UnmapNotify events (otherwise the handler would close the container). * These events are generated automatically when reparenting. */ - uint32_t values[] = { XCB_NONE }; + uint32_t values[] = {XCB_NONE}; xcb_change_window_attributes(conn, state->old_frame, XCB_CW_EVENT_MASK, values); xcb_change_window_attributes(conn, con->window->id, XCB_CW_EVENT_MASK, values); @@ -660,13 +673,21 @@ void x_push_node(Con *con) { con->ignore_unmap++; DLOG("ignore_unmap for reparenting of con %p (win 0x%08x) is now %d\n", - con, con->window->id, con->ignore_unmap); + con, con->window->id, con->ignore_unmap); } + /* The pixmap of a borderless leaf container will not be used except + * for the titlebar in a stack or tabs (issue #1013). */ + bool is_pixmap_needed = (con->border_style != BS_NONE || + !con_is_leaf(con) || + con->parent->layout == L_STACKED || + con->parent->layout == L_TABBED); + bool fake_notify = false; - /* Set new position if rect changed (and if height > 0) */ - if (memcmp(&(state->rect), &rect, sizeof(Rect)) != 0 && - rect.height > 0) { + /* Set new position if rect changed (and if height > 0) or if the pixmap + * needs to be recreated */ + if ((is_pixmap_needed && con->pixmap == XCB_NONE) || (memcmp(&(state->rect), &rect, sizeof(Rect)) != 0 && + rect.height > 0)) { /* We first create the new pixmap, then render to it, set it as the * background and only afterwards change the window size. This reduces * flickering. */ @@ -677,13 +698,6 @@ void x_push_node(Con *con) { * (height == 0) or when it is not needed. */ bool has_rect_changed = (state->rect.width != rect.width || state->rect.height != rect.height); - /* The pixmap of a borderless leaf container will not be used except - * for the titlebar in a stack or tabs (issue #1013). */ - bool is_pixmap_needed = (con->border_style != BS_NONE || - !con_is_leaf(con) || - con->parent->layout == L_STACKED || - con->parent->layout == L_TABBED); - /* Check if the container has an unneeded pixmap left over from * previously having a border or titlebar. */ if (!is_pixmap_needed && con->pixmap != XCB_NONE) { @@ -691,7 +705,7 @@ void x_push_node(Con *con) { con->pixmap = XCB_NONE; } - if (has_rect_changed && is_pixmap_needed) { + if (is_pixmap_needed && (has_rect_changed || con->pixmap == XCB_NONE)) { if (con->pixmap == 0) { con->pixmap = xcb_generate_id(conn); con->pm_gc = xcb_generate_id(conn); @@ -711,7 +725,7 @@ void x_push_node(Con *con) { * properly due to parts of the source being unmapped or otherwise * unavailable. Since we always copy from pixmaps to windows, this * is not a concern for us. */ - uint32_t values[] = { 0 }; + uint32_t values[] = {0}; xcb_create_gc(conn, con->pm_gc, con->pixmap, XCB_GC_GRAPHICS_EXPOSURES, values); con->pixmap_recreated = true; @@ -746,7 +760,7 @@ void x_push_node(Con *con) { if (con->window != NULL && memcmp(&(state->window_rect), &(con->window_rect), sizeof(Rect)) != 0) { DLOG("setting window rect (%d, %d, %d, %d)\n", - con->window_rect.x, con->window_rect.y, con->window_rect.width, con->window_rect.height); + con->window_rect.x, con->window_rect.y, con->window_rect.width, con->window_rect.height); xcb_set_window_rect(conn, con->window->id, con->window_rect); memcpy(&(state->window_rect), &(con->window_rect), sizeof(Rect)); fake_notify = true; @@ -762,7 +776,7 @@ void x_push_node(Con *con) { if (con->window != NULL) { /* Set WM_STATE_NORMAL because GTK applications don’t want to * drag & drop if we don’t. Also, xprop(1) needs it. */ - long data[] = { XCB_ICCCM_WM_STATE_NORMAL, XCB_NONE }; + long data[] = {XCB_ICCCM_WM_STATE_NORMAL, XCB_NONE}; xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id, A_WM_STATE, A_WM_STATE, 32, 2, data); } @@ -804,7 +818,7 @@ void x_push_node(Con *con) { * in focus order to display the focused client in a stack first when * switching workspaces (reduces flickering). */ TAILQ_FOREACH(current, &(con->focus_head), focused) - x_push_node(current); + x_push_node(current); } /* @@ -830,7 +844,7 @@ static void x_push_node_unmaps(Con *con) { xcb_void_cookie_t cookie; if (con->window != NULL) { /* Set WM_STATE_WITHDRAWN, it seems like Java apps need it */ - long data[] = { XCB_ICCCM_WM_STATE_WITHDRAWN, XCB_NONE }; + long data[] = {XCB_ICCCM_WM_STATE_WITHDRAWN, XCB_NONE}; xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->window->id, A_WM_STATE, A_WM_STATE, 32, 2, data); } @@ -849,10 +863,10 @@ static void x_push_node_unmaps(Con *con) { /* handle all children and floating windows of this node */ TAILQ_FOREACH(current, &(con->nodes_head), nodes) - x_push_node_unmaps(current); + x_push_node_unmaps(current); TAILQ_FOREACH(current, &(con->floating_head), floating_windows) - x_push_node_unmaps(current); + x_push_node_unmaps(current); } /* @@ -895,7 +909,7 @@ void x_push_changes(Con *con) { DLOG("-- PUSHING WINDOW STACK --\n"); //DLOG("Disabling EnterNotify\n"); - uint32_t values[1] = { XCB_NONE }; + uint32_t values[1] = {XCB_NONE}; CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) { if (state->mapped) xcb_change_window_attributes(conn, state->id, XCB_CW_EVENT_MASK, values); @@ -908,8 +922,8 @@ void x_push_changes(Con *con) { * stack afterwards */ int cnt = 0; CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) - if (state->con && state->con->window) - cnt++; + if (con_has_managed_window(state->con)) + cnt++; /* The bottom-to-top window stack of all windows which are managed by i3. * Used for x_get_window_stack(). */ @@ -925,7 +939,7 @@ void x_push_changes(Con *con) { /* X11 correctly represents the stack if we push it from bottom to top */ CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) { - if (state->con && state->con->window) + if (con_has_managed_window(state->con)) memcpy(walk++, &(state->con->window->id), sizeof(xcb_window_t)); //DLOG("stack: 0x%08x\n", state->id); @@ -956,7 +970,7 @@ void x_push_changes(Con *con) { /* reorder by initial mapping */ TAILQ_FOREACH(state, &initial_mapping_head, initial_mapping_order) { - if (state->con && state->con->window) + if (con_has_managed_window(state->con)) *walk++ = state->con->window->id; } @@ -978,9 +992,9 @@ void x_push_changes(Con *con) { Output *target = get_output_containing(mid_x, mid_y); if (current != target) { /* Ignore MotionNotify events generated by warping */ - xcb_change_window_attributes(conn, root, XCB_CW_EVENT_MASK, (uint32_t[]){ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT }); + xcb_change_window_attributes(conn, root, XCB_CW_EVENT_MASK, (uint32_t[]){XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT}); xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0, mid_x, mid_y); - xcb_change_window_attributes(conn, root, XCB_CW_EVENT_MASK, (uint32_t[]){ ROOT_EVENT_MASK }); + xcb_change_window_attributes(conn, root, XCB_CW_EVENT_MASK, (uint32_t[]){ROOT_EVENT_MASK}); } } warp_to = NULL; @@ -1013,8 +1027,10 @@ void x_push_changes(Con *con) { to_focus, focused, focused->name); send_take_focus(to_focus, last_timestamp); + ewmh_update_active_window((con_has_managed_window(focused) ? focused->window->id : XCB_WINDOW_NONE)); + if (to_focus != last_focused && is_con_attached(focused)) - ipc_send_window_event("focus", focused); + ipc_send_window_event("focus", focused); } else { DLOG("Updating focus (focused: %p / %s) to X11 window 0x%08x\n", focused, focused->name, to_focus); /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get @@ -1030,10 +1046,10 @@ void x_push_changes(Con *con) { xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values); } - ewmh_update_active_window(to_focus); + ewmh_update_active_window((con_has_managed_window(focused) ? focused->window->id : XCB_WINDOW_NONE)); if (to_focus != XCB_NONE && to_focus != last_focused && focused->window != NULL && is_con_attached(focused)) - ipc_send_window_event("focus", focused); + ipc_send_window_event("focus", focused); } focused_id = last_focused = to_focus; @@ -1043,6 +1059,7 @@ void x_push_changes(Con *con) { if (focused_id == XCB_NONE) { DLOG("Still no window focused, better set focus to the root window\n"); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, root, XCB_CURRENT_TIME); + ewmh_update_active_window(XCB_WINDOW_NONE); focused_id = root; } @@ -1116,8 +1133,8 @@ void x_set_name(Con *con, const char *name) { */ void update_shmlog_atom() { xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, - A_I3_SHMLOG_PATH, A_UTF8_STRING, 8, - strlen(shmlogname), shmlogname); + A_I3_SHMLOG_PATH, A_UTF8_STRING, 8, + strlen(shmlogname), shmlogname); } /* @@ -1140,9 +1157,8 @@ void x_set_i3_atoms(void) { * x_push_changes(). * */ -void x_set_warp_to(Rect *rect) -{ - if (!config.disable_focus_follows_mouse) +void x_set_warp_to(Rect *rect) { + if (config.mouse_warping != POINTER_WARPING_NONE) warp_to = rect; } @@ -1153,7 +1169,7 @@ void x_set_warp_to(Rect *rect) * */ void x_mask_event_mask(uint32_t mask) { - uint32_t values[] = { FRAME_EVENT_MASK & mask }; + uint32_t values[] = {FRAME_EVENT_MASK & mask}; con_state *state; CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {