]> Dogcows Code - chaz/tint2/blobdiff - src/util/area.c
fixed
[chaz/tint2] / src / util / area.c
index bd6cf95f282f0fdde5ee4efa9bc758e94d463cc6..1e10947f6cf1b8f2ab8c7d6c5096b984da9d3d18 100644 (file)
 #include "server.h"
 #include "panel.h"
 
-
+// 1) resize child
+// 2) resize parent
+// 3) redraw parent
+// 4) redraw child
 void refresh (Area *a)
 {
+       // 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) {
-      //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;
        }
 
        // draw current Area
    Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap);
-   XCopyArea (server.dsp, *pmap, ((Panel *)a->panel)->root_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
+       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;
@@ -65,12 +92,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, ((Panel *)a->panel)->root_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;
@@ -80,8 +106,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);
@@ -134,7 +160,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);
@@ -180,6 +205,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;
+       }
 }
 
 
This page took 0.024143 seconds and 4 git commands to generate.