#define _X_H
void x_con_init(Con *con);
+void x_reinit(Con *con);
void x_con_kill(Con *con);
void x_window_kill(xcb_window_t window);
void x_draw_decoration(Con *con);
goto out;
/* Check if the window is already managed */
- if (con_by_window_id(window) != NULL)
+ if (con_by_window_id(window) != NULL) {
+ LOG("already managed\n");
goto out;
+ }
/* Get the initial geometry (position, size, …) */
- if ((geom = xcb_get_geometry_reply(conn, geomc, 0)) == NULL)
+ if ((geom = xcb_get_geometry_reply(conn, geomc, 0)) == NULL) {
+ LOG("could not get geometry\n");
goto out;
+ }
LOG("reparenting!\n");
uint32_t mask = 0;
}
}
nc->window = cwindow;
+ x_reinit(nc);
xcb_void_cookie_t rcookie = xcb_reparent_window_checked(conn, window, nc->frame, 0, 0);
if (xcb_request_check(conn, rcookie) != NULL) {
LOG("adding new state for window id 0x%08x\n", state->id);
}
+/*
+ * Re-initializes the associated X window state for this container. You have
+ * to call this when you assign a client to an empty container to ensure that
+ * its state gets updated correctly.
+ *
+ */
+void x_reinit(Con *con) {
+ struct con_state *state;
+
+ if ((state = state_for_frame(con->frame)) == NULL) {
+ ELOG("window state not found\n");
+ return;
+ }
+
+ LOG("resetting state %p to initial\n", state);
+ state->initial = true;
+ memset(&(state->window_rect), 0, sizeof(Rect));
+}
+
void x_con_kill(Con *con) {
con_state *state;
LOG("Pushing changes for node %p / %s\n", con, con->name);
state = state_for_frame(con->frame);
- /* map/unmap if map state changed */
- if (state->mapped != con->mapped) {
+ /* map/unmap if map state changed, also ensure that the child window
+ * is changed if we are mapped *and* in initial state (meaning the
+ * container was empty before, but now got a child) */
+ if (state->mapped != con->mapped || (con->mapped && state->initial)) {
if (!con->mapped) {
LOG("unmapping container\n");
xcb_unmap_window(conn, con->frame);