]> git.sur5r.net Git - i3/i3/blobdiff - src/x.c
Merge branch 'master' into next
[i3/i3] / src / x.c
diff --git a/src/x.c b/src/x.c
index 070fae91b1e74097e9caf910099ad7c4302aec41..01e340ee8b8d080f70b035a067c004a44bdb7351 100644 (file)
--- 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);
+    }
+}