X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Futil%2Farea.c;h=0460d57c72ca571803846983b885fa88c31dfae9;hb=39e76e43d441ad2d066339ba47e07e77bda249bc;hp=62adbf0c82d63086b33ed3dadef4dfc2cb94d563;hpb=4e5af01dacd2a13dcf01b1a3e239591b59241afa;p=chaz%2Ftint2 diff --git a/src/util/area.c b/src/util/area.c index 62adbf0..0460d57 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -31,26 +31,56 @@ #include "panel.h" -/* -// TODO : layering & drawing loop -1) browse tree and resize SIZE_BY_CONTENT node - - children node are resized before its parent - - if 'size' changed then 'resize = 1' on the parent -2) browse tree and resize SIZE_BY_LAYOUT node - - parent node is resized before its children - - if 'size' changed then 'resize = 1' on childs with SIZE_BY_LAYOUT -3) calculate posx of all objects -4) redraw needed objects -*/ +/************************************************************ + * !!! This design is experimental and not yet fully implemented !!!!!!!!!!!!! + * + * AREA : + * Areas in tint2 are similar to widgets in a GUI. + * Graphical objects (panel, taskbar, task, systray, clock, ...) in tint2 'inherit' an Area class. + * Area is an abstract class of objects. It's at the begining of each object (&object == &area). + * Area manage the background and border drawing, size and padding. + * + * DATA ORGANISATION : + * tint2 define one panel per monitor. And each panel have a tree of Area (nodes). + * The root of the tree is Panel.Area. And task, clock, systray, taskbar,... are nodes. + * + * 'panel_items' parameter (in config) define the list and the order of nodes in tree's panel. + * 'panel_items = SC' define a panel with just Systray and Clock. + * So the root Panel.Area will have 2 childs (Systray and Clock). + * + * The tree allow to browse panel's objects from background to foreground and from left to right. + * The position of each node/Area depend on parent's position and brothers on the left. + * + * DRAWING EVENT : + * In the end, redrawing an object (like the clock) could come from an external event (date change) + * or from a layering event (size or position change). + * + * DRAWING LOOP : + * 1) browse tree and resize SIZE_BY_CONTENT node + * - children node are resized before its parent + * - if 'size' changed then 'redraw = 1' and 'resize = 1' on the parent + * 2) browse tree and resize SIZE_BY_LAYOUT node + * - parent node is resized before its children + * - if 'size' changed then 'redraw = 1' and 'resize = 1' on childs with SIZE_BY_LAYOUT + * 3) calculate posx of objects + * - parent's position is calculated before children's position + * - if 'position' changed then 'redraw = 1' + * 4) redraw needed objects + * - parent node is drawn before its children + * + * perhaps 2) and 3) can be merged... + * répartition entre niveau global et niveau local ?? + * size_by_content peut-il modifier redraw=1 en cas de changement ? ou est ce géré par chaque composant ? + * size_by_layout peut-il modifier redraw ? + * + ************************************************************/ + void refresh (Area *a) { // don't draw and resize hide objects if (!a->on_screen) return; - size(a); - //size_by_content(a); - // don't draw transparent objects (without foreground and without background) if (a->redraw) { a->redraw = 0; @@ -74,28 +104,11 @@ void refresh (Area *a) } -void size (Area *a) -{ - GSList *l; - - if (a->resize) { - a->resize = 0; - // force the resize of childs - for (l = a->list; l ; l = l->next) { - Area *area = (Area*)l->data; - area->resize = 1; - size(area); - } - - // resize can generate a redraw - if (a->_resize) - a->_resize(a); - } -} - -// browse tree and resize SIZE_BY_CONTENT node void size_by_content (Area *a) { + // don't draw and resize hide objects + if (!a->on_screen) return; + // children node are resized before its parent GSList *l; for (l = a->list; l ; l = l->next) @@ -106,27 +119,36 @@ void size_by_content (Area *a) a->resize = 0; // if 'size' changed then 'resize = 1' on the parent - a->_resize(a); - ((Area*)a->parent)->resize = 1; + if (a->_resize) { + a->_resize(a); + a->redraw = 1; + ((Area*)a->parent)->resize = 1; + } } } -// browse tree and resize SIZE_BY_LAYOUT node void size_by_layout (Area *a) { - // parent node is resized before its children + // don't draw and resize hide objects + if (!a->on_screen) return; + // parent node is resized before its children // calculate current area's size + GSList *l; if (a->resize && a->size_mode == SIZE_BY_LAYOUT) { a->resize = 0; - // if 'size' changed then 'resize = 1' on the parent - //if (a->_resize(a)) - //a->parent->resize = 1; + // if 'size' changed then 'resize = 1' on childs with SIZE_BY_LAYOUT + if (a->_resize) { + a->_resize(a); + for (l = a->list; l ; l = l->next) { + if (((Area*)l->data)->size_mode == SIZE_BY_LAYOUT) + ((Area*)l->data)->resize = 1; + } + } } - GSList *l; for (l = a->list; l ; l = l->next) size_by_layout(l->data); }