+ // don't draw and resize hide objects
+ if (!a->on_screen) return;
+
+ // don't draw transparent objects (without foreground and without background)
+ if (a->redraw) {
+ a->redraw = 0;
+ // force redraw of child
+ //GSList *l;
+ //for (l = a->list ; l ; l = l->next)
+ //((Area*)l->data)->redraw = 1;
+
+ //printf("draw area posx %d, width %d\n", a->posx, a->width);
+ draw(a);
+ }
+
+ // draw current Area
+ if (a->pix == 0) printf("empty area posx %d, width %d\n", a->posx, a->width);
+ XCopyArea (server.dsp, a->pix, ((Panel *)a->panel)->temp_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
+
+ // and then refresh child object
+ GSList *l;
+ for (l = a->list; l ; l = l->next)
+ refresh(l->data);
+}
+
+
+int resize_by_layout(void *obj, int maximum_size)
+{
+ Area *child, *a = (Area*)obj;
+ int size, nb_by_content=0, nb_by_layout=0;
+
+ if (panel_horizontal) {
+ // detect free size for SIZE_BY_LAYOUT's Area
+ size = a->width - (2 * (a->paddingxlr + a->bg->border.width));
+ GSList *l;
+ for (l = a->list ; l ; l = l->next) {
+ child = (Area*)l->data;
+ if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
+ size -= child->width;
+ nb_by_content++;
+ }
+ if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT)
+ nb_by_layout++;
+ }
+ //printf(" resize_by_layout Deb %d, %d\n", nb_by_content, nb_by_layout);
+ if (nb_by_content+nb_by_layout)
+ size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
+
+ int width=0, modulo=0, old_width;
+ if (nb_by_layout) {
+ width = size / nb_by_layout;
+ modulo = size % nb_by_layout;
+ if (width > maximum_size && maximum_size != 0) {
+ width = maximum_size;
+ modulo = 0;
+ }
+ }
+
+ // resize SIZE_BY_LAYOUT objects
+ for (l = a->list ; l ; l = l->next) {
+ child = (Area*)l->data;
+ if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT) {
+ old_width = child->width;
+ child->width = width;
+ if (modulo) {
+ child->width++;
+ modulo--;
+ }
+ if (child->width != old_width)
+ child->on_changed = 1;
+ }
+ }
+ }
+ else {
+ // detect free size for SIZE_BY_LAYOUT's Area
+ size = a->height - (2 * (a->paddingxlr + a->bg->border.width));
+ GSList *l;
+ for (l = a->list ; l ; l = l->next) {
+ child = (Area*)l->data;
+ if (child->on_screen && child->size_mode == SIZE_BY_CONTENT) {
+ size -= child->height;
+ nb_by_content++;
+ }
+ if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT)
+ nb_by_layout++;
+ }
+ if (nb_by_content+nb_by_layout)
+ size -= ((nb_by_content+nb_by_layout-1) * a->paddingx);
+
+ int height=0, modulo=0, old_height;
+ if (nb_by_layout) {
+ height = size / nb_by_layout;
+ modulo = size % nb_by_layout;
+ if (height > maximum_size && maximum_size != 0) {
+ height = maximum_size;
+ modulo = 0;
+ }
+ }
+
+ // resize SIZE_BY_LAYOUT objects
+ for (l = a->list ; l ; l = l->next) {
+ child = (Area*)l->data;
+ if (child->on_screen && child->size_mode == SIZE_BY_LAYOUT) {
+ old_height = child->height;
+ child->height = height;
+ if (modulo) {
+ child->height++;
+ modulo--;
+ }
+ if (child->height != old_height)
+ child->on_changed = 1;
+ }
+ }
+ }
+ return 0;
+}
+
+
+void set_redraw (Area *a)
+{
+ a->redraw = 1;
+
+ GSList *l;
+ for (l = a->list ; l ; l = l->next)
+ set_redraw(l->data);
+}
+
+void hide(Area *a)
+{
+ Area *parent = (Area*)a->parent;
+
+ a->on_screen = 0;
+ parent->resize = 1;
+ if (panel_horizontal)
+ a->width = 0;
+ else
+ a->height = 0;
+}
+
+void show(Area *a)
+{
+ Area *parent = (Area*)a->parent;
+
+ a->on_screen = 1;
+ parent->resize = 1;
+ a->resize = 1;
+}
+
+void draw (Area *a)
+{
+ if (a->pix) XFreePixmap (server.dsp, a->pix);
+ a->pix = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth);
+
+ // add layer of root pixmap (or clear pixmap if real_transparency==true)
+ if (server.real_transparency)
+ clear_pixmap(a->pix, 0 ,0, a->width, a->height);
+ XCopyArea (server.dsp, ((Panel *)a->panel)->temp_pmap, a->pix, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
+
+ cairo_surface_t *cs;
+ cairo_t *c;
+
+ cs = cairo_xlib_surface_create (server.dsp, a->pix, server.visual, a->width, a->height);
+ c = cairo_create (cs);
+
+ draw_background (a, c);
+
+ if (a->_draw_foreground)
+ a->_draw_foreground(a, c);
+
+ cairo_destroy (c);
+ cairo_surface_destroy (cs);
+}
+
+
+void draw_background (Area *a, cairo_t *c)
+{
+ if (a->bg->back.alpha > 0.0) {
+ //printf(" draw_background (%d %d) RGBA (%lf, %lf, %lf, %lf)\n", a->posx, a->posy, pix->back.color[0], pix->back.color[1], pix->back.color[2], pix->back.alpha);
+ draw_rect(c, a->bg->border.width, a->bg->border.width, a->width-(2.0 * a->bg->border.width), a->height-(2.0*a->bg->border.width), a->bg->border.rounded - a->bg->border.width/1.571);
+ cairo_set_source_rgba(c, a->bg->back.color[0], a->bg->back.color[1], a->bg->back.color[2], a->bg->back.alpha);
+ cairo_fill(c);
+ }
+
+ if (a->bg->border.width > 0 && a->bg->border.alpha > 0.0) {
+ cairo_set_line_width (c, a->bg->border.width);
+
+ // draw border inside (x, y, width, height)
+ draw_rect(c, a->bg->border.width/2.0, a->bg->border.width/2.0, a->width - a->bg->border.width, a->height - a->bg->border.width, a->bg->border.rounded);
+ /*
+ // convert : radian = degre * M_PI/180
+ // definir le degrade dans un carre de (0,0) (100,100)
+ // ensuite ce degrade est extrapoler selon le ratio width/height
+ // dans repere (0, 0) (100, 100)
+ double X0, Y0, X1, Y1, degre;
+ // x = X * (a->width / 100), y = Y * (a->height / 100)
+ double x0, y0, x1, y1;
+ X0 = 0;
+ Y0 = 100;
+ X1 = 100;
+ Y1 = 0;
+ degre = 45;
+ // et ensuite faire la changement d'unite du repere
+ // car ce qui doit reste inchangee est les traits et pas la direction
+
+ // il faut d'abord appliquer une rotation de 90 (et -180 si l'angle est superieur a 180)
+ // ceci peut etre applique une fois pour toute au depart
+ // ensuite calculer l'angle dans le nouveau repare
+ // puis faire une rotation de 90
+ x0 = X0 * ((double)a->width / 100);
+ x1 = X1 * ((double)a->width / 100);
+ y0 = Y0 * ((double)a->height / 100);
+ y1 = Y1 * ((double)a->height / 100);
+
+ x0 = X0 * ((double)a->height / 100);
+ x1 = X1 * ((double)a->height / 100);
+ y0 = Y0 * ((double)a->width / 100);
+ y1 = Y1 * ((double)a->width / 100);
+
+ cairo_pattern_t *linpat;
+ linpat = cairo_pattern_create_linear (x0, y0, x1, y1);
+ cairo_pattern_add_color_stop_rgba (linpat, 0, a->border.color[0], a->border.color[1], a->border.color[2], a->border.alpha);
+ cairo_pattern_add_color_stop_rgba (linpat, 1, a->border.color[0], a->border.color[1], a->border.color[2], 0);
+ cairo_set_source (c, linpat);
+ */
+ cairo_set_source_rgba (c, a->bg->border.color[0], a->bg->border.color[1], a->bg->border.color[2], a->bg->border.alpha);
+
+ cairo_stroke (c);
+ //cairo_pattern_destroy (linpat);
+ }