+
+ /* Resize windows */
+ if (state == ST_SHOW) {
+ sys_move(win, win->x, win->y, win->w, win->h);
+ } else if (state == ST_MAX) {
+ sys_move(win, screen->x, screen->y, screen->w, screen->h);
+ } else if (state == ST_FULL) {
+ XWindowChanges wc = {
+ .x = screen->x - screen->sys->strut.left ,
+ .y = screen->y - screen->sys->strut.top ,
+ .width = screen->w + screen->sys->strut.left + screen->sys->strut.right,
+ .height = screen->h + screen->sys->strut.top + screen->sys->strut.bottom
+ };
+ win->x = wc.x; win->y = wc.y;
+ win->w = wc.width; win->h = wc.height;
+ XConfigureWindow(win->sys->dpy, win->sys->xid, CWX|CWY|CWWidth|CWHeight, &wc);
+ XMoveResizeWindow(win->sys->dpy, win->sys->xid, wc.x, wc.y, wc.width, wc.height);
+ } else if (state == ST_SHADE) {
+ XConfigureWindow(win->sys->dpy, win->sys->xid, CWHeight,
+ &(XWindowChanges) { .height = stack });
+ }
+
+ /* Raise window */
+ if (state == ST_FULL || state == ST_MAX)
+ XRaiseWindow(win->sys->dpy, win->sys->xid);
+
+ /* Close windows */
+ if (state == ST_CLOSE) {
+ 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);
+ }