wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 939677d2f0a9ad558c55cc8440fa7732ffcc4a68
parent 87b1782a0440cfed13d896b255c1301be897b1f4
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Mon,  1 May 2006 20:53:30 +0200

fixed the mem leak (hopefully) noticed by Icarus, adding an exit(1) to destroy_area, if its frame.size > 0 (should never happen, but we'll see)


Diffstat:
cmd/wm/area.c | 6++++--
cmd/wm/bar.c | 107++++++++++++++++++++++++++++++++++++++++---------------------------------------
cmd/wm/wm.h | 2+-
3 files changed, 59 insertions(+), 56 deletions(-)

diff --git a/cmd/wm/area.c b/cmd/wm/area.c @@ -64,8 +64,10 @@ destroy_area(Area *a) { unsigned int i; View *v = a->view; - if(a->frame.size) - return; + if(a->frame.size) { + fprintf(stderr, "%s", "wmiiwm: fatal, destroying non-empty area\n"); + exit(1); + } if(a->frame.data) free(a->frame.data); if(v->revert == idx_of_area(a)) diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c @@ -9,55 +9,56 @@ #include "wm.h" static int -comp_bar_intern(const void *l1, const void *l2) +comp_bar_intern(const void *b1, const void *b2) { - Bar *ll1 = *(Bar **)l1; - Bar *ll2 = *(Bar **)l2; - if(ll1->intern && !ll2->intern) + Bar *bb1 = *(Bar **)b1; + Bar *bb2 = *(Bar **)b2; + if(bb1->intern && !bb2->intern) return -1; - if(!ll1->intern && ll2->intern) + if(!bb1->intern && bb2->intern) return 1; return 0; } static int -comp_bar_name(const void *l1, const void *l2) +comp_bar_name(const void *b1, const void *b2) { - Bar *ll1 = *(Bar **)l1; - Bar *ll2 = *(Bar **)l2; - return strcmp(ll1->name, ll2->name); + Bar *bb1 = *(Bar **)b1; + Bar *bb2 = *(Bar **)b2; + return strcmp(bb1->name, bb2->name); } static Vector * -vector_of_bars(BarVector *lv) +vector_of_bars(BarVector *bv) { - return (Vector *) lv; + return (Vector *) bv; } Bar * create_bar(char *name, Bool intern) { static unsigned int id = 1; - Bar *l = bar_of_name(name); - - if(l) - return l; - l = cext_emallocz(sizeof(Bar)); - l->id = id++; - l->intern = intern; - cext_strlcpy(l->name, name, sizeof(l->name)); - cext_strlcpy(l->colstr, def.selcolor, sizeof(l->colstr)); - l->color = def.sel; - cext_vattach(vector_of_bars(&bar), l); + Bar *b = bar_of_name(name); + + if(b) + return b; + b = cext_emallocz(sizeof(Bar)); + b->id = id++; + b->intern = intern; + cext_strlcpy(b->name, name, sizeof(b->name)); + cext_strlcpy(b->colstr, def.selcolor, sizeof(b->colstr)); + b->color = def.sel; + cext_vattach(vector_of_bars(&bar), b); qsort(bar.data, bar.size, sizeof(Bar *), comp_bar_name); qsort(bar.data, bar.size, sizeof(Bar *), comp_bar_intern); - return l; + return b; } void -destroy_bar(Bar *l) +destroy_bar(Bar *b) { - cext_vdetach(vector_of_bars(&bar), l); + cext_vdetach(vector_of_bars(&bar), b); + free(b); } unsigned int @@ -100,7 +101,7 @@ draw_bar() unsigned int i = 0, w = 0; int exp = -1; BlitzDraw d = { 0 }; - Bar *l = nil; + Bar *b = nil; d.gc = bargc; d.drawable = barpmap; @@ -116,28 +117,28 @@ draw_bar() return; for(i = 0; (i < bar.size) && (w < brect.width); i++) { - l = bar.data[i]; - if(l->intern) { - if(view.size && !strncmp(l->name, view.data[sel]->name, sizeof(l->name))) - l->color = def.sel; + b = bar.data[i]; + if(b->intern) { + if(view.size && !strncmp(b->name, view.data[sel]->name, sizeof(b->name))) + b->color = def.sel; else - l->color = def.norm; + b->color = def.norm; } - l->rect.x = 0; - l->rect.y = 0; - l->rect.width = brect.height; - if(strlen(l->data)) - l->rect.width += blitz_textwidth(dpy, &blitzfont, l->data); - l->rect.height = brect.height; - w += l->rect.width; + b->rect.x = 0; + b->rect.y = 0; + b->rect.width = brect.height; + if(strlen(b->data)) + b->rect.width += blitz_textwidth(dpy, &blitzfont, b->data); + b->rect.height = brect.height; + w += b->rect.width; } if(i != bar.size) { /* give all bars same width */ w = brect.width / bar.size; for(i = 0; i < bar.size; i++) { - l = bar.data[i]; - l->rect.x = i * w; - l->rect.width = w; + b = bar.data[i]; + b->rect.x = i * w; + b->rect.width = w; } } else { /* expand bar properly */ @@ -151,10 +152,10 @@ draw_bar() } for(i = 0; i < bar.size; i++) { - l = bar.data[i]; - d.color = l->color; - d.rect = l->rect; - d.data = l->data; + b = bar.data[i]; + d.color = b->color; + d.rect = b->rect; + d.data = b->data; if(i == exp) d.align = EAST; else @@ -167,11 +168,11 @@ draw_bar() } int -idx_of_bar(Bar *l) +idx_of_bar(Bar *b) { int i; for(i = 0; i < bar.size; i++) - if(bar.data[i] == l) + if(bar.data[i] == b) return i; return -1; } @@ -203,18 +204,18 @@ void update_view_bars() { unsigned int i; - Bar *l = nil; + Bar *b = nil; for(i = 0; (i < bar.size) && bar.data[i]->intern; i++) { - l = bar.data[i]; - if(!view_of_name(l->name)) { - destroy_bar(l); + b = bar.data[i]; + if(!view_of_name(b->name)) { + destroy_bar(b); i--; } } for(i = 0; i < view.size; i++) { - l = create_bar(view.data[i]->name, True); - cext_strlcpy(l->data, view.data[i]->name, sizeof(l->data)); + b = create_bar(view.data[i]->name, True); + cext_strlcpy(b->data, view.data[i]->name, sizeof(b->data)); } draw_bar(); diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -207,7 +207,7 @@ int idx_of_bar_id(unsigned short id); void resize_bar(); unsigned int height_of_bar(); Bar *bar_of_name(const char *name); -int idx_of_bar(Bar *l); +int idx_of_bar(Bar *b); void update_view_bars(); /* client.c */