+ printf("sys_show: %p - %s -> %s\n", win,
+ state_map[win->state], state_map[state]);
+ xcb_window_t xcb = win ? win->sys->xcb : root;
+
+ /* Find screen */
+ win_t *screen = NULL;
+ if (state == ST_FULL || state == ST_MAX) {
+ for (list_t *cur = screens; cur; cur = cur->next) {
+ screen = cur->data;
+ if (win->x >= screen->x && win->x <= screen->x+screen->w &&
+ win->y >= screen->y && win->y <= screen->y+screen->h)
+ break;
+ }
+ }
+
+ /* Change window state */
+ switch (state) {
+ case ST_HIDE:
+ xcb_unmap_window(conn, xcb);
+ break;
+
+ case ST_SHOW:
+ xcb_map_window(conn, xcb);
+ do_configure_window(xcb, win->x, win->y,
+ MAX(win->w - 2*border, 1),
+ MAX(win->h - 2*border, 1),
+ border, -1, -1);
+ break;
+
+ case ST_FULL:
+ xcb_map_window(conn, xcb);
+ do_configure_window(xcb, screen->x, screen->y, screen->w, screen->h,
+ 0, -1, XCB_STACK_MODE_ABOVE);
+ xcb_circulate_window(conn, XCB_CIRCULATE_RAISE_LOWEST, xcb);
+ break;
+
+ case ST_MAX:
+ xcb_map_window(conn, xcb);
+ do_configure_window(xcb, screen->x, screen->y,
+ MAX(screen->w - 2*border, 1),
+ MAX(screen->h - 2*border, 1),
+ border, -1, XCB_STACK_MODE_ABOVE);
+ break;
+
+ case ST_SHADE:
+ xcb_map_window(conn, xcb);
+ do_configure_window(xcb, -1, -1, -1, stack,
+ border, -1, -1);
+ break;
+
+ case ST_ICON:
+ xcb_map_window(conn, xcb);
+ do_configure_window(xcb, -1, -1, 100, 100,
+ border, -1, -1);
+ break;
+
+ case ST_CLOSE:
+ // TODO
+ // if (!win_msg(win, WM_DELETE)) {
+ // XGrabServer(win->sys->dpy);
+ // XSetErrorHandler(xnoerror);
+ // XSetCloseDownMode(win->sys->dpy, DestroyAll);
+ // XKillClient(win->sys->dpy, win->sys->xid);
+ // XSync(win->sys->dpy, False);
+ // XSetErrorHandler(xerror);
+ // XUngrabServer(win->sys->dpy);
+ // }
+ break;
+ }
+
+ /* Update state */
+ win->state = state;