widgets: add destructors functions

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-06-14 22:55:17 +02:00
parent f169c4d8d9
commit f5314dbc9e
6 changed files with 107 additions and 14 deletions

View File

@ -71,7 +71,18 @@ struct graph_t
graph_t *next, *prev;
};
DO_SLIST(graph_t, graph, p_delete)
static void
graph_delete(graph_t **g)
{
p_delete(&(*g)->title);
p_delete(&(*g)->lines);
p_delete(&(*g)->values);
p_delete(&(*g)->pcolor_center);
p_delete(&(*g)->pcolor_end);
p_delete(g);
}
DO_SLIST(graph_t, graph, graph_delete)
typedef struct
{
@ -431,6 +442,17 @@ graph_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
graph_destructor(widget_t *widget)
{
graph_data_t *d = widget->data;
graph_list_wipe(&d->graphs);
p_delete(&d->draw_from);
p_delete(&d->draw_to);
p_delete(&d);
}
widget_t *
graph_new(alignment_t align)
{
@ -442,6 +464,7 @@ graph_new(alignment_t align)
w->draw = graph_draw;
w->tell = graph_tell;
w->destructor = graph_destructor;
w->align = align;
d = w->data = p_new(graph_data_t, 1);

View File

@ -26,7 +26,7 @@ typedef struct
{
draw_image_t *image;
bool resize;
} Data;
} iconbox_data_t;
static int
iconbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
@ -35,7 +35,7 @@ iconbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
int used __attribute__ ((unused)),
void *p __attribute__ ((unused)))
{
Data *d = w->widget->data;
iconbox_data_t *d = w->widget->data;
draw_image_t *image = d->image;
/* image not valid */
@ -68,7 +68,7 @@ iconbox_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
static widget_tell_status_t
iconbox_tell(widget_t *widget, const char *property, const char *new_value)
{
Data *d = widget->data;
iconbox_data_t *d = widget->data;
if(!new_value)
return WIDGET_ERROR_NOVALUE;
@ -86,18 +86,28 @@ iconbox_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
iconbox_destructor(widget_t *widget)
{
iconbox_data_t *d = widget->data;
draw_image_delete(&d->image);
p_delete(&d);
}
widget_t *
iconbox_new(alignment_t align)
{
widget_t *w;
Data *d;
iconbox_data_t *d;
w = p_new(widget_t, 1);
widget_common_new(w);
w->align = align;
w->draw = iconbox_draw;
w->tell = iconbox_tell;
w->data = d = p_new(Data, 1);
w->destructor = iconbox_destructor;
w->data = d = p_new(iconbox_data_t, 1);
d->resize = true;
return w;

View File

@ -55,7 +55,16 @@ struct bar_t
bar_t *next, *prev;
};
DO_SLIST(bar_t, bar, p_delete)
static void
bar_delete(bar_t **bar)
{
p_delete(&(*bar)->title);
p_delete(&(*bar)->pfg_center);
p_delete(&(*bar)->pfg_end);
p_delete(bar);
}
DO_SLIST(bar_t, bar, bar_delete)
typedef struct
{
@ -494,6 +503,15 @@ progressbar_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
progressbar_destructor(widget_t *widget)
{
progressbar_data_t *d = widget->data;
bar_list_wipe(&d->bars);
p_delete(&d);
}
widget_t *
progressbar_new(alignment_t align)
{
@ -505,6 +523,7 @@ progressbar_new(alignment_t align)
w->align = align;
w->draw = progressbar_draw;
w->tell = progressbar_tell;
w->destructor = progressbar_destructor;
d = w->data = p_new(progressbar_data_t, 1);
d->height = 0.80;

View File

@ -37,7 +37,14 @@ struct taglist_drawn_area_t
taglist_drawn_area_t *next, *prev;
};
DO_SLIST(taglist_drawn_area_t, taglist_drawn_area, p_delete);
static void
taglist_drawn_area_delete(taglist_drawn_area_t **a)
{
area_list_wipe(&(*a)->area);
p_delete(a);
}
DO_SLIST(taglist_drawn_area_t, taglist_drawn_area, taglist_drawn_area_delete);
typedef struct
{
@ -259,6 +266,18 @@ taglist_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
taglist_destructor(widget_t *widget)
{
taglist_data_t *d = widget->data;
p_delete(&d->text_normal);
p_delete(&d->text_focus);
p_delete(&d->text_urgent);
taglist_drawn_area_list_wipe(&d->drawn_area);
p_delete(&d);
}
widget_t *
taglist_new(alignment_t align)
{
@ -271,6 +290,7 @@ taglist_new(alignment_t align)
w->draw = taglist_draw;
w->button_press = taglist_button_press;
w->tell = taglist_tell;
w->destructor = taglist_destructor;
w->data = d = p_new(taglist_data_t, 1);
d->text_normal = a_strdup(" <text align=\"center\"/><title/> ");

View File

@ -43,7 +43,7 @@ typedef struct
showclient_t show;
bool show_icons;
char *text_normal, *text_urgent, *text_focus;
} Data;
} tasklist_data_t;
static inline bool
tasklist_isvisible(client_t *c, int screen, showclient_t show)
@ -69,7 +69,7 @@ tasklist_draw(draw_context_t *ctx, int screen,
int offset, int used, void *q __attribute__ ((unused)))
{
client_t *c;
Data *d = w->widget->data;
tasklist_data_t *d = w->widget->data;
area_t area;
char *text;
int n = 0, i = 0, box_width = 0, icon_width = 0, box_width_rest = 0, j = 0;
@ -205,7 +205,7 @@ tasklist_button_press(widget_node_t *w,
{
button_t *b;
client_t *c;
Data *d = w->widget->data;
tasklist_data_t *d = w->widget->data;
int n = 0, box_width = 0, i, ci = 0;
for(c = globalconf.clients; c; c = c->next)
@ -242,7 +242,7 @@ tasklist_button_press(widget_node_t *w,
static widget_tell_status_t
tasklist_tell(widget_t *widget, const char *property, const char *new_value)
{
Data *d = widget->data;
tasklist_data_t *d = widget->data;
if(!a_strcmp(property, "text_normal"))
{
@ -278,19 +278,31 @@ tasklist_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
tasklist_destructor(widget_t *widget)
{
tasklist_data_t *d = widget->data;
p_delete(&d->text_normal);
p_delete(&d->text_focus);
p_delete(&d->text_urgent);
p_delete(&d);
}
widget_t *
tasklist_new(alignment_t align __attribute__ ((unused)))
{
widget_t *w;
Data *d;
tasklist_data_t *d;
w = p_new(widget_t, 1);
widget_common_new(w);
w->draw = tasklist_draw;
w->button_press = tasklist_button_press;
w->align = AlignFlex;
w->data = d = p_new(Data, 1);
w->data = d = p_new(tasklist_data_t, 1);
w->tell = tasklist_tell;
w->destructor = tasklist_destructor;
d->text_normal = a_strdup(" <title/> ");
d->text_focus = a_strdup(" <title/> ");

View File

@ -83,6 +83,14 @@ textbox_tell(widget_t *widget, const char *property, const char *new_value)
return WIDGET_NOERROR;
}
static void
textbox_destructor(widget_t *w)
{
textbox_data_t *d = w->data;
p_delete(&d->text);
p_delete(&d);
}
widget_t *
textbox_new(alignment_t align)
{
@ -94,6 +102,7 @@ textbox_new(alignment_t align)
w->align = align;
w->draw = textbox_draw;
w->tell = textbox_tell;
w->destructor = textbox_destructor;
w->data = d = p_new(textbox_data_t, 1);
return w;