From e8d8bf70d3cdd39721f9ac872d4f6bcfb9874cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 29 Dec 2018 12:51:31 +0100 Subject: [PATCH] exposable: add a "common" constructor and default destructor --- particle.c | 24 ++++++++++++++++++++++++ particle.h | 7 +++++++ particles/empty.c | 10 +--------- particles/list.c | 25 +++++++++++++++---------- particles/progress_bar.c | 5 ++--- particles/string.c | 21 ++++++++++----------- 6 files changed, 59 insertions(+), 33 deletions(-) diff --git a/particle.c b/particle.c index ead9142..996de4c 100644 --- a/particle.c +++ b/particle.c @@ -1,5 +1,7 @@ #include "particle.h" + #include +#include void particle_default_destroy(struct particle *particle) @@ -18,3 +20,25 @@ particle_common_new(int left_margin, int right_margin) p->deco = NULL; return p; } + +struct exposable * +exposable_common_new(const struct particle *particle, const char *on_click) +{ + struct exposable *exposable = malloc(sizeof(*exposable)); + exposable->particle = particle; + exposable->private = NULL; + exposable->width = 0; + exposable->on_click = on_click != NULL ? strdup(on_click) : NULL; + exposable->destroy = &exposable_default_destroy; + exposable->on_mouse = &exposable_default_on_mouse; + exposable->begin_expose = NULL; + exposable->expose = NULL; + return exposable; +} + +void +exposable_default_destroy(struct exposable *exposable) +{ + free(exposable->on_click); + free(exposable); +} diff --git a/particle.h b/particle.h index 0616db6..232fef7 100644 --- a/particle.h +++ b/particle.h @@ -35,3 +35,10 @@ struct exposable { struct particle *particle_common_new(int left_margin, int right_margin); void particle_default_destroy(struct particle *particle); + +struct exposable *exposable_common_new( + const struct particle *particle, const char *on_click); +void exposable_default_destroy(struct exposable *exposable); +void exposable_default_on_mouse( + struct exposable *exposable, struct bar *bar, + enum mouse_event event, int x, int y); diff --git a/particles/empty.c b/particles/empty.c index 92b55b9..93d254e 100644 --- a/particles/empty.c +++ b/particles/empty.c @@ -2,12 +2,6 @@ #include -static void -exposable_destroy(struct exposable *exposable) -{ - free(exposable); -} - static int begin_expose(struct exposable *exposable, cairo_t *cr) { @@ -27,9 +21,7 @@ expose(const struct exposable *exposable, cairo_t *cr, int x, int y, int height) static struct exposable * instantiate(const struct particle *particle, const struct tag_set *tags) { - struct exposable *exposable = malloc(sizeof(*exposable)); - exposable->particle = particle; - exposable->destroy = &exposable_destroy; + struct exposable *exposable = exposable_common_new(particle, NULL); exposable->begin_expose = &begin_expose; exposable->expose = &expose; return exposable; diff --git a/particles/list.c b/particles/list.c index 2a179d6..d273845 100644 --- a/particles/list.c +++ b/particles/list.c @@ -14,6 +14,20 @@ struct exposable_private { int left_spacing, right_spacing; }; + +static void +exposable_destroy(struct exposable *exposable) +{ + struct exposable_private *e = exposable->private; + for (size_t i = 0; i < e->count; i++) + e->exposables[i]->destroy(e->exposables[i]); + + free(e->exposables); + free(e->widths); + free(e); + exposable_default_destroy(exposable); +} + static int begin_expose(struct exposable *exposable, cairo_t *cr) { @@ -55,16 +69,8 @@ expose(const struct exposable *exposable, cairo_t *cr, int x, int y, int height) } static void -exposable_destroy(struct exposable *exposable) { - struct exposable_private *e = exposable->private; - for (size_t i = 0; i < e->count; i++) - e->exposables[i]->destroy(e->exposables[i]); - free(e->exposables); - free(e->widths); - free(e); - free(exposable); } static struct exposable * @@ -84,9 +90,8 @@ instantiate(const struct particle *particle, const struct tag_set *tags) e->exposables[i] = pp->instantiate(pp, tags); } - struct exposable *exposable = malloc(sizeof(*exposable)); + struct exposable *exposable = exposable_common_new(particle, NULL); exposable->private = e; - exposable->particle = particle; exposable->destroy = &exposable_destroy; exposable->begin_expose = &begin_expose; exposable->expose = &expose; diff --git a/particles/progress_bar.c b/particles/progress_bar.c index 8dfc77f..ca02d77 100644 --- a/particles/progress_bar.c +++ b/particles/progress_bar.c @@ -48,7 +48,7 @@ exposable_destroy(struct exposable *exposable) e->exposables[i]->destroy(e->exposables[i]); free(e->exposables); free(e); - free(exposable); + exposable_default_destroy(exposable); } static int @@ -120,8 +120,7 @@ instantiate(const struct particle *particle, const struct tag_set *tags) assert(idx == epriv->count); - struct exposable *exposable = malloc(sizeof(*exposable)); - exposable->particle = particle; + struct exposable *exposable = exposable_common_new(particle, NULL); exposable->private = epriv; exposable->destroy = &exposable_destroy; exposable->begin_expose = &begin_expose; diff --git a/particles/string.c b/particles/string.c index 4be4aa0..c609e9c 100644 --- a/particles/string.c +++ b/particles/string.c @@ -11,6 +11,15 @@ struct private { struct rgba foreground; }; +static void +exposable_destroy(struct exposable *exposable) +{ + struct private *e = exposable->private; + free(e->text); + free(e); + exposable_default_destroy(exposable); +} + static int begin_expose(struct exposable *exposable, cairo_t *cr) { @@ -68,15 +77,6 @@ expose(const struct exposable *exposable, cairo_t *cr, int x, int y, int height) } -static void -exposable_destroy(struct exposable *exposable) -{ - struct private *e = exposable->private; - free(e->text); - free(e); - free(exposable); -} - struct sbuf { char *s; size_t size; @@ -164,8 +164,7 @@ instantiate(const struct particle *particle, const struct tag_set *tags) e->font = p->font; e->foreground = p->foreground; - struct exposable *exposable = malloc(sizeof(*exposable)); - exposable->particle = particle; + struct exposable *exposable = exposable_common_new(particle, NULL); exposable->private = e; exposable->destroy = &exposable_destroy; exposable->begin_expose = &begin_expose;