* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2012 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.
/* 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);
- }
-
+ bool set_focus = true;
if (focused->window != NULL &&
focused->window->needs_take_focus) {
+ DLOG("Updating focus by sending WM_TAKE_FOCUS to window 0x%08x (focused: %p / %s)\n",
+ to_focus, focused, focused->name);
send_take_focus(to_focus);
+ set_focus = !focused->window->doesnt_accept_focus;
+ DLOG("set_focus = %d\n", set_focus);
+ }
+
+ if (set_focus) {
+ 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;
}
}
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);
}
/*
{
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);
+ }
+}