This fixes ticket #26.
*/
void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window);
+/**
+ * Generates a configure_notify_event with absolute coordinates (relative to the X root
+ * window, not to the client’s frame) for the given client.
+ *
+ */
+void fake_absolute_configure_notify(xcb_connection_t *conn, Client *client);
+
/**
* Finds out which modifier mask is the one for numlock, as the user may change this.
*
return 1;
}
- fake_configure_notify(conn, client->child_rect, client->child);
+ fake_absolute_configure_notify(conn, client);
return 1;
}
xcb_configure_window(conn, client->child, mask, &(rect->x));
- /* After configuring a child window we need to fake a configure_notify_event according
- to ICCCM 4.2.3. This seems rather broken, especially since X sends exactly the same
- configure_notify_event automatically according to xtrace. Anyone knows details? */
- fake_configure_notify(conn, *rect, client->child);
+ /* After configuring a child window we need to fake a configure_notify_event (see ICCCM 4.2.3).
+ * This is necessary to inform the client of its position relative to the root window,
+ * not relative to its frame (as done in the configure_notify_event by the x server). */
+ fake_absolute_configure_notify(conn, client);
}
/*
Rect child_rect = workspace->rect;
child_rect.x = child_rect.y = 0;
- fake_configure_notify(conn, child_rect, client->child);
+ fake_absolute_configure_notify(conn, client);
} else {
LOG("leaving fullscreen mode\n");
/* Because the coordinates of the window haven’t changed, it would not be
LOG("Told the client it is at %dx%d with %dx%d\n", r.x, r.y, r.width, r.height);
}
+/*
+ * Generates a configure_notify_event with absolute coordinates (relative to the X root
+ * window, not to the client’s frame) for the given client.
+ *
+ */
+void fake_absolute_configure_notify(xcb_connection_t *conn, Client *client) {
+ Rect absolute;
+
+ absolute.x = client->rect.x;
+ absolute.y = client->rect.y;
+ absolute.width = client->rect.width - client->child_rect.x;
+ absolute.height = client->rect.height - client->child_rect.y;
+
+ fake_configure_notify(conn, absolute, client->child);
+}
+
/*
* Finds out which modifier mask is the one for numlock, as the user may change this.
*