X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Farea.c;h=61919f9ae81e301f5500b932bdeb86a7a90b9f14;hb=4c09bc1adfd6e7d68250d6a61f27c6d1f6ede463;hp=4cb3b4160c0478b8ed5fdbb61bc2641ae3461128;hpb=da65866b2388391052e3ce95818c1d5ebd2b26b5;p=chaz%2Ftint2 diff --git a/src/util/area.c b/src/util/area.c index 4cb3b41..61919f9 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -29,38 +29,56 @@ #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; - if (a->resize) { - // resize can generate a redraw - if (a->_resize) { - //printf("resize area posx %d, width %d\n", a->posx, a->width); - a->_resize(a); - } - a->resize = 0; - } + // don't draw and resize hide objects + if (!a->on_screen) return; + + size(a); + + // don't draw transparent objects (without foreground and without background) if (a->redraw) { + 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; } // draw current Area Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); + if (*pmap == 0) printf("empty area posx %d, width %d\n", a->posx, a->width); 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;