- /* Set actual focus */
- XSetInputFocus(win->sys->dpy, win->sys->xid,
- RevertToPointerRoot, CurrentTime);
- XSendEvent(win->sys->dpy, win->sys->xid, False, NoEventMask, &(XEvent){
- .type = ClientMessage,
- .xclient.window = win->sys->xid,
- .xclient.message_type = atoms[wm_proto],
- .xclient.format = 32,
- .xclient.data.l[0] = atoms[wm_focus],
- .xclient.data.l[1] = CurrentTime,
- });
+void sys_show(win_t *win, state_t state)
+{
+ switch (state) {
+ case ST_HIDE:
+ printf("sys_show: hide %p\n", win);
+ XUnmapWindow(win->sys->dpy, win->sys->xid);
+ break;
+ case ST_SHOW:
+ printf("sys_show: show %p\n", win);
+ if (win->state == ST_FULL)
+ sys_move(win, win->x, win->y, win->w, win->h);
+ XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, border);
+ XMapWindow(win->sys->dpy, win->sys->xid);
+ XSync(win->sys->dpy, False);
+ break;
+ case ST_MAX:
+ printf("sys_show: max %p\n", win);
+ XMapWindow(win->sys->dpy, win->sys->xid);
+ break;
+ case ST_FULL:
+ printf("sys_show: full %p\n", win);
+ win_t *screen = NULL;
+ 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;
+ }
+ XSetWindowBorderWidth(win->sys->dpy, win->sys->xid, 0);
+ XMapWindow(win->sys->dpy, win->sys->xid);
+ XMoveResizeWindow(win->sys->dpy, win->sys->xid,
+ screen->x - screen->sys->strut.left,
+ screen->y - screen->sys->strut.top,
+ screen->w + screen->sys->strut.left + screen->sys->strut.right,
+ screen->h + screen->sys->strut.top + screen->sys->strut.bottom);
+ XRaiseWindow(win->sys->dpy, win->sys->xid);
+ break;
+ case ST_SHADE:
+ printf("sys_show: shade %p\n", win);
+ XConfigureWindow(win->sys->dpy, win->sys->xid, CWHeight,
+ &(XWindowChanges){ .height = stack });
+ XMapWindow(win->sys->dpy, win->sys->xid);
+ break;
+ case ST_ICON:
+ printf("sys_show: icon %p\n", win);
+ break;
+ case ST_CLOSE:
+ printf("sys_show: close %p\n", win);
+ 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);
+ }
+ XDestroyWindow(win->sys->dpy, win->sys->xid);
+ break;
+ }
+ win->state = state;