]> Dogcows Code - chaz/tint2/blobdiff - src/util/area.c
fixed issue 49 and some systray code (not yet)
[chaz/tint2] / src / util / area.c
index fe8c647555521975584fc365a529c45f01165911..4b45fbd97fc8e4e4acb09b2009bc8a4534a8cd68 100644 (file)
 
 #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;
+       }
 }
 
 
This page took 0.025544 seconds and 4 git commands to generate.