]> Pileus Git - wmpus/commitdiff
Get rid of sys->state and fix double mapping
authorAndy Spencer <andy753421@gmail.com>
Wed, 13 Jun 2012 08:22:32 +0000 (08:22 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 13 Jun 2012 08:22:32 +0000 (08:22 +0000)
Yes. I'm looking at you Emacs.

sys-x11.c
sys.h

index 1da24dd9e17ab204ce5579cb4b0992eb9cd3f559..483844f17e151ce26d0636b16fc367510650233f 100644 (file)
--- a/sys-x11.c
+++ b/sys-x11.c
@@ -40,7 +40,6 @@ struct win_sys {
        struct {
                int left, right, top, bottom;
        } strut;
-       state_t  state;
 };
 
 typedef struct {
@@ -400,12 +399,12 @@ static void process_event(int type, XEvent *xe, win_t *root)
        }
        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) {
@@ -418,7 +417,7 @@ static void process_event(int type, XEvent *xe, win_t *root)
                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,
@@ -435,14 +434,15 @@ static void process_event(int type, XEvent *xe, win_t *root)
        }
        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;
@@ -456,7 +456,7 @@ static void process_event(int type, XEvent *xe, win_t *root)
                     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);
@@ -543,16 +543,20 @@ void sys_focus(win_t *win)
 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;
@@ -570,18 +574,14 @@ void sys_show(win_t *win, state_t state)
                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);
@@ -594,7 +594,7 @@ void sys_show(win_t *win, state_t state)
                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)
diff --git a/sys.h b/sys.h
index cb045cee09bf51c615955b999e1fab19b7be751c..e3c024553d27be9aa75e09fada4dc3dcc0f7ba90 100644 (file)
--- a/sys.h
+++ b/sys.h
 
 /* Window states */
 typedef enum {
+       ST_HIDE,  // completely hidden
        ST_SHOW,  // show as regular window
        ST_FULL,  // fullscreen/maximized
        ST_SHADE, // show titlebar only
        ST_ICON,  // iconified/minimized
-       ST_HIDE,  // completely hidden
        ST_CLOSE, // close the window
 } state_t;