]> git.sur5r.net Git - i3/i3/blobdiff - src/handlers.c
Re-implement support for the urgency hint, extend t/13-urgent.t
[i3/i3] / src / handlers.c
index 7613110c7b3fba8c6e2547efe3cd57b4a8c19752..990f7dd2b4b621b8a42506a34c9cd9c3975b1b93 100644 (file)
@@ -810,6 +810,7 @@ int handle_normal_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_w
 
         return 1;
 }
+#endif
 
 /*
  * Handles the WM_HINTS property for extracting the urgency state of the window.
@@ -817,46 +818,49 @@ int handle_normal_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_w
  */
 int handle_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_window_t window,
                   xcb_atom_t name, xcb_get_property_reply_t *reply) {
-        Client *client = table_get(&by_child, window);
-        if (client == NULL) {
-                DLOG("Received WM_HINTS for unknown client\n");
-                return 1;
-        }
-        xcb_wm_hints_t hints;
+    Con *con = con_by_window_id(window);
+    if (con == NULL) {
+        DLOG("Received WM_HINTS for unknown client\n");
+        return 1;
+    }
 
-        if (reply != NULL) {
-                if (!xcb_get_wm_hints_from_reply(&hints, reply))
-                        return 1;
-        } else {
-                if (!xcb_get_wm_hints_reply(conn, xcb_get_wm_hints_unchecked(conn, client->child), &hints, NULL))
-                        return 1;
-        }
+    xcb_wm_hints_t hints;
 
-        Client *last_focused = SLIST_FIRST(&(c_ws->focus_stack));
-        if (!client->urgent && client == last_focused) {
-                DLOG("Ignoring urgency flag for current client\n");
-                return 1;
-        }
+    if (reply != NULL) {
+        if (!xcb_get_wm_hints_from_reply(&hints, reply))
+            return 1;
+    } else {
+        if (!xcb_get_wm_hints_reply(conn, xcb_get_wm_hints_unchecked(conn, con->window->id), &hints, NULL))
+            return 1;
+    }
 
-        /* Update the flag on the client directly */
-        client->urgent = (xcb_wm_hints_get_urgency(&hints) != 0);
-        CLIENT_LOG(client);
-        LOG("Urgency flag changed to %d\n", client->urgent);
+    if (!con->urgent && focused == con) {
+        DLOG("Ignoring urgency flag for current client\n");
+        return 1;
+    }
 
-        workspace_update_urgent_flag(client->workspace);
-        redecorate_window(conn, client);
+    /* Update the flag on the client directly */
+    con->urgent = (xcb_wm_hints_get_urgency(&hints) != 0);
+    //CLIENT_LOG(con);
+    LOG("Urgency flag changed to %d\n", con->urgent);
 
-        /* If the workspace this client is on is not visible, we need to redraw
-         * the workspace bar */
-        if (!workspace_is_visible(client->workspace)) {
-                Output *output = client->workspace->output;
-                render_workspace(conn, output, output->current_workspace);
-                xcb_flush(conn);
-        }
+    workspace_update_urgent_flag(con_get_workspace(con));
 
-        return 1;
+#if 0
+    /* If the workspace this client is on is not visible, we need to redraw
+     * the workspace bar */
+    if (!workspace_is_visible(client->workspace)) {
+            Output *output = client->workspace->output;
+            render_workspace(conn, output, output->current_workspace);
+            xcb_flush(conn);
+    }
+#endif
+
+    return 1;
 }
 
+#if 0
+
 /*
  * Handles the transient for hints set by a window, signalizing that this window is a popup window
  * for some other window.