]> Pileus Git - wmpus/commitdiff
Improve shutdown
authorAndy Spencer <andy753421@gmail.com>
Wed, 5 Oct 2011 04:46:45 +0000 (04:46 +0000)
committerAndy Spencer <andy753421@gmail.com>
Wed, 5 Oct 2011 04:46:45 +0000 (04:46 +0000)
- Make hidden windows visible
- Free all data

main.c
sys-x11.c
sys.h
wm-wmii.c
wm.h

diff --git a/main.c b/main.c
index 119005e346957bbac926d42fdb3fca157cddcf7e..1054b7c4a2be779c707b725cb5fd946b708a17cb 100644 (file)
--- a/main.c
+++ b/main.c
@@ -26,5 +26,7 @@ int main(int argc, char **argv)
        win_t *root = sys_init();
        wm_init(root);
        sys_run(root);
+       wm_free(root);
+       sys_free(root);
        return 0;
 }
index 7222b462141d7f5eb5a38b22ca62ef6585bdeaff..6c43780979ef3491dc96d380867453721ea959c7 100644 (file)
--- a/sys-x11.c
+++ b/sys-x11.c
@@ -13,6 +13,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  */
 
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
 #include <search.h>
@@ -242,13 +243,18 @@ static win_t *win_find(Display *dpy, Window xid, int create)
        return new;
 }
 
-static void win_remove(win_t *win)
+static void win_free(win_t *win)
 {
-       tdelete(win, &cache, win_cmp);
        free(win->sys);
        free(win);
 }
 
+static void win_remove(win_t *win)
+{
+       tdelete(win, &cache, win_cmp);
+       win_free(win);
+}
+
 static int win_viewable(win_t *win)
 {
        XWindowAttributes attr;
@@ -457,6 +463,7 @@ void sys_show(win_t *win, state_t state)
        case st_show:
                printf("sys_show: show\n");
                XMapWindow(win->sys->dpy, win->sys->xid);
+               XSync(win->sys->dpy, False);
                return;
        case st_full:
                printf("sys_show: full\n");
@@ -505,15 +512,11 @@ list_t *sys_info(win_t *win)
 {
        /* Use global copy of screens so we can add struts */
        if (screens == NULL) {
-               int n;
+               /* Add Xinerama screens */
+               int n = 0;
                XineramaScreenInfo *info = NULL;
                if (XineramaIsActive(win->sys->dpy))
                        info = XineramaQueryScreens(win->sys->dpy, &n);
-               if (!info) {
-                       win_t *screen = new0(win_t);
-                       *screen = *win;
-                       return list_insert(NULL, screen);
-               }
                for (int i = 0; i < n; i++) {
                        win_t *screen = new0(win_t);
                        screen->x = info[i].x_org;
@@ -523,6 +526,12 @@ list_t *sys_info(win_t *win)
                        screens = list_append(screens, screen);
                }
        }
+       if (screens == NULL) {
+               /* No xinerama support */
+               win_t *screen = new0(win_t);
+               *screen = *win;
+               screens = list_insert(NULL, screen);
+       }
        return screens;
 }
 
@@ -561,12 +570,14 @@ void sys_run(win_t *root)
        unsigned int nkids;
        Window par, xid, *kids = NULL;
        if (XQueryTree(root->sys->dpy, root->sys->xid,
-                               &par, &xid, &kids, &nkids))
+                               &par, &xid, &kids, &nkids)) {
                for(int i = 0; i < nkids; i++) {
                        win_t *win = win_find(root->sys->dpy, kids[i], 1);
                        if (win && win_viewable(win) && !strut_add(root,win))
                                wm_insert(win);
                }
+               XFree(kids);
+       }
        wm_update(); // For struts
 
        /* Main loop */
@@ -583,3 +594,11 @@ void sys_exit(void)
 {
        running = 0;
 }
+
+void sys_free(win_t *root)
+{
+       XCloseDisplay(root->sys->dpy);
+       while (screens)
+               screens = list_remove(screens, screens, 1);
+       tdestroy(cache, (void(*)(void*))win_free);
+}
diff --git a/sys.h b/sys.h
index c08b595d62956e9cef261531a8b5e9e70100a82f..e55b0a36e25e9b95222641135068a1b3a8db4032 100644 (file)
--- a/sys.h
+++ b/sys.h
@@ -122,3 +122,6 @@ void sys_run(win_t *root);
 
 /* Exit main loop */
 void sys_exit(void);
+
+/* Free all static data, for memory debugging */
+void sys_free(win_t *root);
index ea631242abfed36d5568910bce14734283f8ee1a..ac1333325dfb656ceedc864148f747594623212b 100644 (file)
--- a/wm-wmii.c
+++ b/wm-wmii.c
@@ -916,3 +916,25 @@ void wm_init(win_t *root)
        for (int i = 0; i < countof(keys_s); i++)
                sys_watch(root, keys_s[i], MOD(.MODKEY=1,.shift=1));
 }
+
+void wm_free(win_t *root)
+{
+       /* Re-show and free all windows */
+       while ( wm->tags) { tag_t *tag =  wm->tags->data;
+       while (tag->dpys) { dpy_t *dpy = tag->dpys->data;
+       while (dpy->cols) { col_t *col = dpy->cols->data;
+       while (col->rows) { row_t *row = col->rows->data;
+               sys_show(row->win, st_show);
+               free(row->win->wm);
+       col->rows = list_remove(col->rows, col->rows, 1); }
+       dpy->cols = list_remove(dpy->cols, dpy->cols, 1); }
+       while (dpy->flts) { flt_t *flt = dpy->flts->data;
+               sys_show(flt->win, st_show);
+               free(flt->win->wm);
+       dpy->flts = list_remove(dpy->flts, dpy->flts, 1); }
+       tag->dpys = list_remove(tag->dpys, tag->dpys, 1); }
+        wm->tags = list_remove( wm->tags,  wm->tags, 1); }
+
+       /* Free remaining data */
+       free(wm);
+}
diff --git a/wm.h b/wm.h
index f1fdb2e40555954682893751db40c4daf43f5071..852b62f8cba467aa5a8b6be957f0291054c3bd2a 100644 (file)
--- a/wm.h
+++ b/wm.h
@@ -41,3 +41,6 @@ void wm_remove(win_t *win);
 
 /* First call, sets up key bindings, etc */
 void wm_init(win_t *root);
+
+/* First call, sets up key bindings, etc */
+void wm_free(win_t *root);