X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=src%2Fx.c;h=01e340ee8b8d080f70b035a067c004a44bdb7351;hp=070fae91b1e74097e9caf910099ad7c4302aec41;hb=f32cc6f4ae3f92c63d2f738b69d84269be8549ab;hpb=0f9fbcbd259a26969c3503ac1e31b2cf2df351f5 diff --git a/src/x.c b/src/x.c index 070fae91..01e340ee 100644 --- a/src/x.c +++ b/src/x.c @@ -824,26 +824,29 @@ void x_push_changes(Con *con) { /* Invalidate focused_id to correctly focus new windows with the same ID */ focused_id = XCB_NONE; } else { - DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name); - /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get - * no focus change events for our own focus changes. We only want - * these generated by the clients. */ - if (focused->window != NULL) { - values[0] = CHILD_EVENT_MASK & ~(XCB_EVENT_MASK_FOCUS_CHANGE); - xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values); - } - xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME); - if (focused->window != NULL) { - values[0] = CHILD_EVENT_MASK; - xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values); - } - if (focused->window != NULL && focused->window->needs_take_focus) { + DLOG("Updating focus by sending WM_TAKE_FOCUS to window 0x%08x only (focused: %p / %s)\n", + to_focus, focused, focused->name); send_take_focus(to_focus); + } else { + DLOG("Updating focus (focused: %p / %s)\n", focused, focused->name); + /* We remove XCB_EVENT_MASK_FOCUS_CHANGE from the event mask to get + * no focus change events for our own focus changes. We only want + * these generated by the clients. */ + if (focused->window != NULL) { + values[0] = CHILD_EVENT_MASK & ~(XCB_EVENT_MASK_FOCUS_CHANGE); + xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values); + } + xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, to_focus, XCB_CURRENT_TIME); + if (focused->window != NULL) { + values[0] = CHILD_EVENT_MASK; + xcb_change_window_attributes(conn, focused->window->id, XCB_CW_EVENT_MASK, values); + } + + ewmh_update_active_window(to_focus); } - ewmh_update_active_window(to_focus); focused_id = to_focus; } } @@ -928,6 +931,8 @@ void x_set_i3_atoms() { current_socketpath); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_CONFIG_PATH, A_UTF8_STRING, 8, strlen(current_configpath), current_configpath); + xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_SHMLOG_PATH, A_UTF8_STRING, 8, + strlen(shmlogname), shmlogname); } /* @@ -939,3 +944,19 @@ void x_set_warp_to(Rect *rect) { warp_to = rect; } + +/* + * Applies the given mask to the event mask of every i3 window decoration X11 + * window. This is useful to disable EnterNotify while resizing so that focus + * is untouched. + * + */ +void x_mask_event_mask(uint32_t mask) { + uint32_t values[] = { FRAME_EVENT_MASK & mask }; + + con_state *state; + CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) { + if (state->mapped) + xcb_change_window_attributes(conn, state->id, XCB_CW_EVENT_MASK, values); + } +}