From 79245152446fc0b9e3523135beabbd6783d2026a Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Wed, 5 Oct 2011 04:46:45 +0000 Subject: [PATCH] Improve shutdown - Make hidden windows visible - Free all data --- main.c | 2 ++ sys-x11.c | 37 ++++++++++++++++++++++++++++--------- sys.h | 3 +++ wm-wmii.c | 22 ++++++++++++++++++++++ wm.h | 3 +++ 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/main.c b/main.c index 119005e..1054b7c 100644 --- 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; } diff --git a/sys-x11.c b/sys-x11.c index 7222b46..6c43780 100644 --- 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 #include #include @@ -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 c08b595..e55b0a3 100644 --- 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); diff --git a/wm-wmii.c b/wm-wmii.c index ea63124..ac13333 100644 --- 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 f1fdb2e..852b62f 100644 --- 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); -- 2.43.2