struct {
int left, right, top, bottom;
} strut;
- state_t state;
};
typedef struct {
}
else if (type == UnmapNotify) {
if ((win = win_find(dpy,xe->xunmap.window,0)) &&
- win->sys->state != ST_HIDE) {
+ win->state != ST_HIDE) {
if (!strut_del(root, win))
wm_remove(win);
else
wm_update();
- win->sys->state = ST_HIDE;
+ win->state = ST_HIDE;
}
}
else if (type == DestroyNotify) {
printf("configure_req: %d - %x, (0x%lx) %dx%d @ %d,%d\n",
type, (int)cre->window, cre->value_mask,
cre->height, cre->width, cre->x, cre->y);
- if ((win = win_find(dpy,xe->xmaprequest.window,1))) {
+ if ((win = win_find(dpy,xe->xconfigurerequest.window,1))) {
XSendEvent(dpy, cre->window, False, StructureNotifyMask, &(XEvent){
.xconfigure.type = ConfigureNotify,
.xconfigure.display = win->sys->dpy,
}
else if (type == MapRequest) {
printf("map_req: %d\n", type);
- if ((win = win_find(dpy,xe->xmaprequest.window,1))) {
+ if ((win = win_find(dpy,xe->xmaprequest.window,1)) &&
+ win->state == ST_HIDE) {
XSelectInput(win->sys->dpy, win->sys->xid, PropertyChangeMask);
if (!strut_add(root, win))
wm_insert(win);
else
wm_update();
}
- XMapWindow(dpy, xe->xmaprequest.window);
+ sys_show(win, ST_SHOW);
}
else if (type == ClientMessage) {
XClientMessageEvent *cme = &xe->xclient;
cme->data.l[2] == atoms[NET_FULL])) {
if (cme->data.l[0] == 1 || /* _NET_WM_STATE_ADD */
(cme->data.l[0] == 2 && /* _NET_WM_STATE_TOGGLE */
- win->sys->state != ST_FULL))
+ win->state != ST_FULL))
sys_show(win, ST_FULL);
else
sys_show(win, ST_SHOW);
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\n");
- if (win->sys->state == ST_FULL)
+ 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_FULL:
- printf("sys_show: full\n");
+ printf("sys_show: full %p\n", win);
win_t *screen = NULL;
for (list_t *cur = screens; cur; cur = cur->next) {
screen = cur->data;
XRaiseWindow(win->sys->dpy, win->sys->xid);
break;
case ST_SHADE:
- printf("sys_show: shade\n");
+ printf("sys_show: shade %p\n", win);
XMapWindow(win->sys->dpy, win->sys->xid);
break;
case ST_ICON:
- printf("sys_show: icon\n");
- break;
- case ST_HIDE:
- printf("sys_show: hide\n");
- XUnmapWindow(win->sys->dpy, win->sys->xid);
+ printf("sys_show: icon %p\n", win);
break;
case ST_CLOSE:
- printf("sys_show: close\n");
+ printf("sys_show: close %p\n", win);
if (!win_msg(win, WM_DELETE)) {
XGrabServer(win->sys->dpy);
XSetErrorHandler(xnoerror);
XDestroyWindow(win->sys->dpy, win->sys->xid);
break;
}
- win->sys->state = state;
+ win->state = state;
}
void sys_watch(win_t *win, event_t ev, mod_t mod)