]> git.sur5r.net Git - i3/i3/commitdiff
Implement setting the WM_NAME of i3 container windows for debugging
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 15:41:46 +0000 (16:41 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 15:41:46 +0000 (16:41 +0100)
include/x.h
src/floating.c
src/manage.c
src/tree.c
src/workspace.c
src/x.c

index 1cd83fb825aac9698df36364e30beffa3b1255e5..43b0814b14d4e6384f4dccfbfad6133ecb8a33b4 100644 (file)
@@ -65,4 +65,12 @@ void x_push_changes(Con *con);
  */
 void x_raise_con(Con *con);
 
+/**
+ * Sets the WM_NAME property (so, no UTF8, but used only for debugging anyways)
+ * of the given name. Used for properly tagging the windows for easily spotting
+ * i3 windows in xwininfo -root -all.
+ *
+ */
+void x_set_name(Con *con, const char *name);
+
 #endif
index ea39f507ef7d51d95e2384c87235b41d0c555b49..756102b7afe67fef59660087ad4a7eb6c7462d00 100644 (file)
@@ -32,7 +32,16 @@ void floating_enable(Con *con, bool automatic) {
     /* 2: create a new container to render the decoration on, add
      * it as a floating window to the workspace */
     Con *nc = con_new(NULL);
+    /* we need to set the parent afterwards instead of passing it as an
+     * argument to con_new() because nc would be inserted into the tiling layer
+     * otherwise. */
     nc->parent = con_get_workspace(con);
+
+    char *name;
+    asprintf(&name, "[i3 con] floatingcon around %p", con);
+    x_set_name(nc, name);
+    free(name);
+
     nc->rect = con->rect;
     /* add pixels for the decoration */
     /* TODO: don’t add them when the user automatically puts new windows into
index 0307ea7a6501fcaac68b88bcf4e103cb37e19e68..344da4cc12805427b1a6e203368f291b8aa1fb82 100644 (file)
@@ -185,6 +185,10 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
     nc->window = cwindow;
     x_reinit(nc);
 
+    char *name;
+    asprintf(&name, "[i3 con] container around %p", cwindow);
+    x_set_name(nc, name);
+    free(name);
 
     /* set floating if necessary */
     bool want_floating = false;
index 3378857666bc10a1485c20c4bce5c83e8bdada52..696f77ccebf31b4f28ecf474f4fb06876626d9a8 100644 (file)
@@ -70,11 +70,21 @@ void tree_init() {
         oc->type = CT_OUTPUT;
         oc->rect = output->rect;
 
+        char *name;
+        asprintf(&name, "[i3 con] output %s", oc->name);
+        x_set_name(oc, name);
+        free(name);
+
         /* add a workspace to this output */
         ws = con_new(oc);
         ws->type = CT_WORKSPACE;
         asprintf(&(ws->name), "%d", c);
         c++;
+
+        asprintf(&name, "[i3 con] workspace %s", ws->name);
+        x_set_name(ws, name);
+        free(name);
+
         ws->fullscreen_mode = CF_OUTPUT;
         ws->orientation = HORIZ;
     }
index 06f742d7767e90cac0f0911c29b014897b6473f4..d98c7562aded0a80f8d0b6b6fae80d7f365d7b93 100644 (file)
@@ -39,6 +39,10 @@ Con *workspace_get(const char *num) {
         output = con_get_output(focused);
         LOG("got output %p\n", output);
         workspace = con_new(output);
+        char *name;
+        asprintf(&name, "[i3 con] workspace %s", num);
+        x_set_name(workspace, name);
+        free(name);
         workspace->type = CT_WORKSPACE;
         workspace->name = strdup(num);
         workspace->orientation = HORIZ;
diff --git a/src/x.c b/src/x.c
index 25e132f3114bf805d24b9dd78298f4c995386cf7..fe7ce8e0d85158ae2584962b21e369293e889df5 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -30,6 +30,8 @@ typedef struct con_state {
 
     bool initial;
 
+    char *name;
+
     CIRCLEQ_ENTRY(con_state) state;
     CIRCLEQ_ENTRY(con_state) old_state;
 } con_state;
@@ -374,6 +376,14 @@ static void x_push_node(Con *con) {
     LOG("Pushing changes for node %p / %s\n", con, con->name);
     state = state_for_frame(con->frame);
 
+    if (state->name != NULL) {
+        DLOG("pushing name %s\n", state->name);
+
+        xcb_change_property(conn, XCB_PROP_MODE_REPLACE, con->frame,
+                            WM_NAME, STRING, 8, strlen(state->name), state->name);
+        FREE(state->name);
+    }
+
     /* reparent the child window (when the window was moved due to a sticky
      * container) */
     if (state->need_reparent && con->window != NULL) {
@@ -543,3 +553,21 @@ void x_raise_con(Con *con) {
     CIRCLEQ_REMOVE(&state_head, state, state);
     CIRCLEQ_INSERT_HEAD(&state_head, state, state);
 }
+
+/*
+ * Sets the WM_NAME property (so, no UTF8, but used only for debugging anyways)
+ * of the given name. Used for properly tagging the windows for easily spotting
+ * i3 windows in xwininfo -root -all.
+ *
+ */
+void x_set_name(Con *con, const char *name) {
+    struct con_state *state;
+
+    if ((state = state_for_frame(con->frame)) == NULL) {
+        ELOG("window state not found\n");
+        return;
+    }
+
+    FREE(state->name);
+    state->name = sstrdup(name);
+}