#include #include #include #include #include #include struct win { Window w_win; TAILQ_ENTRY(win) w_list; }; Display *display; Window win, rootwindow; int screen, width, height, numwins; TAILQ_HEAD(winhead, win); struct winhead winhead; void reorganize(void) { XWindowChanges changes; struct win *w; int i; i = 0; TAILQ_FOREACH(w, &winhead, w_list) { changes.x = width / numwins * i; changes.y = 0; changes.width = width / numwins; changes.height = height; XConfigureWindow(display, w->w_win, CWX | CWY | CWWidth | CWHeight, &changes); i++; } } int main(void) { XEvent ev; display = XOpenDisplay(":1"); if (!display) errx(1, "XOpenDisplay"); screen = DefaultScreen(display); width = XDisplayWidth(display, screen); height = XDisplayHeight(display, screen); rootwindow = RootWindow(display, screen); printf("Display with %dx%d\n", width, height); if (XSelectInput(display, rootwindow, EnterWindowMask | LeaveWindowMask | SubstructureNotifyMask) == BadWindow) errx(1, "XSelectInput"); numwins = 0; while (1) { struct win *win, *w, *tmp; XNextEvent(display, &ev); switch (ev.type) { case MapNotify: numwins++; win = malloc(sizeof(*win)); win->w_win = ev.xconfigure.window; TAILQ_INSERT_HEAD(&winhead, win, w_list); reorganize(); break; case UnmapNotify: numwins--; TAILQ_FOREACH_SAFE(w, &winhead, w_list, tmp) { if (w->w_win == ev.xconfigure.window) { TAILQ_REMOVE(&winhead, w, w_list); break; } } reorganize(); break; default: printf("got event %d!\n", ev.type); } } return (0); }