// an X screen. may have multiple monitors, xinerama, etc void setup_screen() { int i; Window w; supporting = XCreateSimpleWindow(display, root, 0, 0, 1, 1, 0, 0, 0); unsigned long pid = getpid(); // EWMH XChangeProperty(display, root, netatoms[_NET_SUPPORTED], XA_ATOM, 32, PropModeReplace, (unsigned char *) netatoms, NETATOMS); // ewmh supporting wm XChangeProperty(display, root, netatoms[_NET_SUPPORTING_WM_CHECK], XA_WINDOW, 32, PropModeReplace, (unsigned char *) &supporting, 1); XChangeProperty(display, supporting, netatoms[_NET_SUPPORTING_WM_CHECK], XA_WINDOW, 32, PropModeReplace, (unsigned char *) &supporting, 1); XChangeProperty(display, supporting, netatoms[_NET_WM_NAME], XA_STRING, 8, PropModeReplace, (const unsigned char *) "GoomwWM", 6); XChangeProperty(display, supporting, netatoms[_NET_WM_PID], XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &pid, 1); // become the window manager here XSelectInput(display, root, StructureNotifyMask | SubstructureRedirectMask | SubstructureNotifyMask); // setup any existing windows winlist *l = window_children(); winlist_ascend(l, i, w) { wincache *cache = allocate_clear(sizeof(wincache)); winlist_append(windows, w, cache); client *c = client_create(w); if (c && c->manage && (c->visible || client_get_wm_state(c) == IconicState)) { window_select(c->window); winlist_append(c-> visible ? windows_activated : windows_shaded, c->window, NULL); client_full_review(c); } }
// XGetWindowAttributes with caching XWindowAttributes* window_get_attributes(Window w) { int idx = winlist_find(cache_xattr, w); if (idx < 0) { XWindowAttributes *cattr = allocate(sizeof(XWindowAttributes)); if (XGetWindowAttributes(display, w, cattr)) { winlist_append(cache_xattr, w, cattr); return cattr; } free(cattr); return NULL; } return cache_xattr->data[idx]; }
// top-level windows, visible or not. DOES include non-managable docks/panels winlist* window_children() { winlist *l = winlist_new(); unsigned int nwins; int i; Window w1, w2, *wins; if (XQueryTree(display, root, &w1, &w2, &wins, &nwins) && wins) { for (i = 0; i < nwins; i++) { XWindowAttributes *attr = window_get_attributes(wins[i]); if (attr && attr->override_redirect == False && (attr->map_state == IsUnmapped || attr->map_state == IsViewable)) winlist_append(l, wins[i], NULL); } } if (wins) XFree(wins); return l; }
// top-level, visible windows. DOES include non-managable docks/panels winlist* windows_in_play() { if (cache_inplay->len) return cache_inplay; unsigned int nwins; int i; Window w1, w2, *wins; if (XQueryTree(display, root, &w1, &w2, &wins, &nwins) && wins) { for (i = 0; i < nwins; i++) { XWindowAttributes *attr = window_get_attributes(wins[i]); if (attr && attr->override_redirect == False && attr->map_state == IsViewable) winlist_append(cache_inplay, wins[i], NULL); } } if (wins) XFree(wins); return cache_inplay; }