#include "area.h"
+void refresh (Area *a)
+{
+ if (a->redraw) {
+ if (a->draw)
+ a->draw(a);
+ else
+ draw(a);
+ }
+
+ XCopyArea (server.dsp, a->pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
+
+ GSList *l = a->list;
+ // refresh child object (after refreshing parent)
+ for (; l ; l = l->next)
+ refresh(l->data);
+
+ //printf("end refresh area\n");
+}
-void redraw (Area *a)
+
+void set_redraw (Area *a)
{
a->redraw = 1;
GSList *l;
for (l = a->list ; l ; l = l->next)
- redraw(l->data);
+ set_redraw(l->data);
}
-int draw (Area *a)
+void draw (Area *a)
{
- if (!a->redraw) return 0;
-
cairo_surface_t *cs;
cairo_t *c;
- int ret = 0;
-
+
+ //printf("begin draw area\n");
if (a->pmap) XFreePixmap (server.dsp, a->pmap);
a->pmap = server_create_pixmap (a->width, a->height);
c = cairo_create (cs);
draw_background (a, c);
-
- if (a->draw_foreground) {
- ret = a->draw_foreground(a, c);
- }
- else {
- // parcours de la liste des sous objets
- }
+
+ if (a->draw_foreground)
+ a->draw_foreground(a, c);
cairo_destroy (c);
cairo_surface_destroy (cs);
a->redraw = 0;
-
- return ret;
}
if (a->back.alpha > 0.0) {
//printf(" draw_background %d %d\n", a->width, a->height);
draw_rect(c, a->border.width, a->border.width, a->width-(2.0 * a->border.width), a->height-(2.0*a->border.width), a->border.rounded - a->border.width/1.571);
- /*
- double x0, y0, x1, y1;
- x0 = 0;
- y0 = 100;
- x1 = 100;
- y1 = 0;
-
- cairo_pattern_t *linpat;
- cairo_matrix_t matrix;
- linpat = cairo_pattern_create_linear (x0, y0, x1, y1);
-
- cairo_pattern_add_color_stop_rgba (linpat, 0, a->back.color[0], a->back.color[1], a->back.color[2], a->back.alpha);
- cairo_pattern_add_color_stop_rgba (linpat, 1, a->back.color[0], a->back.color[1], a->back.color[2], 0);
- //cairo_matrix_init_scale (&matrix, a->height, a->width);
- //cairo_pattern_set_matrix (linpat, &matrix);
- cairo_set_source (c, linpat);
- */
cairo_set_source_rgba(c, a->back.color[0], a->back.color[1], a->back.color[2], a->back.alpha);
cairo_fill(c);
- //cairo_pattern_destroy (linpat);
}
if (a->border.width > 0 && a->border.alpha > 0.0) {
}
-void refresh (Area *a)
-{
- XCopyArea (server.dsp, a->pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
-}
-
-
void remove_area (Area *a)
{
Area *parent;
parent = (Area*)a->parent;
parent->list = g_slist_remove(parent->list, a);
- redraw (parent);
+ set_redraw (parent);
}
parent = (Area*)a->parent;
parent->list = g_slist_remove(parent->list, a);
- redraw (parent);
+ set_redraw (parent);
+
+}
+
+void free_area (Area *a)
+{
+ GSList *l0;
+ for (l0 = a->list; l0 ; l0 = l0->next)
+ free_area (l0->data);
+
+ if (a->list) {
+ g_slist_free(a->list);
+ a->list = 0;
+ }
}