X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Farea.c;h=4b45fbd97fc8e4e4acb09b2009bc8a4534a8cd68;hb=346e19cf9cc32f56221ae0e9dc25070cefedb5be;hp=fe8c647555521975584fc365a529c45f01165911;hpb=280d1d6e2e2cf7eed76e1def50a4b9547094d185;p=chaz%2Ftint2 diff --git a/src/util/area.c b/src/util/area.c index fe8c647..4b45fbd 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -27,31 +27,54 @@ #include "area.h" #include "server.h" +#include "panel.h" - +// 1) resize child +// 2) resize parent +// 3) redraw parent +// 4) redraw child void refresh (Area *a) { + if (!a->visible) return; + + size(a); + if (a->redraw) { - //printf("draw pix\n"); + a->redraw = 0; + //printf("draw area posx %d, width %d\n", a->posx, a->width); draw(a, 0); if (a->use_active) draw(a, 1); - a->redraw = 0; - //printf("end draw pix\n"); } - Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); - // draw current Area - XCopyArea (server.dsp, *pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); + Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); + XCopyArea (server.dsp, *pmap, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); // and then refresh child object - GSList *l = a->list; - for (; l ; l = l->next) + GSList *l; + for (l = a->list; l ; l = l->next) refresh(l->data); } +void size (Area *a) +{ + GSList *l; + + if (a->resize) { + a->resize = 0; + for (l = a->list; l ; l = l->next) + size(l->data); + + // resize can generate a redraw + if (a->_resize) { + a->_resize(a); + } + } +} + + void set_redraw (Area *a) { a->redraw = 1; @@ -66,12 +89,11 @@ void draw (Area *a, int active) { Pixmap *pmap = (active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); - //printf("begin draw area\n"); if (*pmap) XFreePixmap (server.dsp, *pmap); *pmap = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth); // add layer of root pixmap - XCopyArea (server.dsp, server.pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); + XCopyArea (server.dsp, ((Panel *)a->panel)->temp_pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0); cairo_surface_t *cs; cairo_t *c; @@ -81,8 +103,8 @@ void draw (Area *a, int active) draw_background (a, c, active); - if (a->draw_foreground) - a->draw_foreground(a, c, active); + if (a->_draw_foreground) + a->_draw_foreground(a, c, active); cairo_destroy (c); cairo_surface_destroy (cs); @@ -135,7 +157,6 @@ void draw_background (Area *a, cairo_t *c, int active) x1 = X1 * ((double)a->height / 100); y0 = Y0 * ((double)a->width / 100); y1 = Y1 * ((double)a->width / 100); - printf("repère (%d, %d) points (%lf, %lf) (%lf, %lf)\n", a->width, a->height, x0, y0, x1, y1); cairo_pattern_t *linpat; linpat = cairo_pattern_create_linear (x0, y0, x1, y1); @@ -153,9 +174,8 @@ void draw_background (Area *a, cairo_t *c, int active) void remove_area (Area *a) { - Area *parent; + Area *parent = (Area*)a->parent; - parent = (Area*)a->parent; parent->list = g_slist_remove(parent->list, a); set_redraw (parent); @@ -164,9 +184,8 @@ void remove_area (Area *a) void add_area (Area *a) { - Area *parent; + Area *parent = (Area*)a->parent; - parent = (Area*)a->parent; parent->list = g_slist_remove(parent->list, a); set_redraw (parent); @@ -183,6 +202,14 @@ void free_area (Area *a) g_slist_free(a->list); a->list = 0; } + if (a->pix.pmap) { + XFreePixmap (server.dsp, a->pix.pmap); + a->pix.pmap = 0; + } + if (a->pix_active.pmap) { + XFreePixmap (server.dsp, a->pix_active.pmap); + a->pix_active.pmap = 0; + } }