From 945632ddcb978db34cb0db3b5900b707af3750c7 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 14 Nov 2010 16:41:46 +0100 Subject: [PATCH] Implement setting the WM_NAME of i3 container windows for debugging --- include/x.h | 8 ++++++++ src/floating.c | 9 +++++++++ src/manage.c | 4 ++++ src/tree.c | 10 ++++++++++ src/workspace.c | 4 ++++ src/x.c | 28 ++++++++++++++++++++++++++++ 6 files changed, 63 insertions(+) diff --git a/include/x.h b/include/x.h index 1cd83fb8..43b0814b 100644 --- a/include/x.h +++ b/include/x.h @@ -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 diff --git a/src/floating.c b/src/floating.c index ea39f507..756102b7 100644 --- a/src/floating.c +++ b/src/floating.c @@ -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 diff --git a/src/manage.c b/src/manage.c index 0307ea7a..344da4cc 100644 --- a/src/manage.c +++ b/src/manage.c @@ -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; diff --git a/src/tree.c b/src/tree.c index 33788576..696f77cc 100644 --- a/src/tree.c +++ b/src/tree.c @@ -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; } diff --git a/src/workspace.c b/src/workspace.c index 06f742d7..d98c7562 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -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 25e132f3..fe7ce8e0 100644 --- 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); +} -- 2.39.2