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)

This commit is contained in:
Anselm R. Garbe 2006-05-01 20:53:30 +02:00
parent 87b1782a04
commit 939677d2f0
3 changed files with 58 additions and 55 deletions

View File

@ -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))

View File

@ -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);
Bar *b = 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);
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();

View File

@ -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 */