From c803db3d16c62949428b4e0e2fcd85b8889a7ff3 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Sun, 8 Aug 2010 19:23:54 +0000 Subject: [PATCH] fixed Issue 282 : second try --- src/panel.c | 2 +- src/server.c | 5 ++-- src/taskbar/task.c | 2 +- src/util/area.c | 62 ++++++++++++++++++++++++++++++---------------- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/panel.c b/src/panel.c index 5c5ab6a..ee53167 100644 --- a/src/panel.c +++ b/src/panel.c @@ -163,7 +163,7 @@ void init_panel() p->area.panel = p; p->area.on_screen = 1; p->area.resize = 1; - p->area.size_mode = SIZE_BY_CONTENT; + p->area.size_mode = SIZE_BY_LAYOUT; p->area._resize = resize_panel; p->g_taskbar.area.parent = p; p->g_taskbar.area.panel = p; diff --git a/src/server.c b/src/server.c index ee0006d..7f202bf 100644 --- a/src/server.c +++ b/src/server.c @@ -170,8 +170,9 @@ void *server_get_property (Window win, Atom at, Atom type, int *num_results) result = XGetWindowProperty(server.dsp, win, at, 0, 0x7fffffff, False, type, &type_ret, &format_ret, &nitems_ret, &bafter_ret, &prop_value); - /* Send back resultcount */ - if (num_results) *num_results = nitems_ret; + // Send back resultcount + // it look some version of gcc doesn't do the cast. so we force it. + if (num_results) *num_results = (int)nitems_ret; if (result == Success && prop_value) return prop_value; else return 0; diff --git a/src/taskbar/task.c b/src/taskbar/task.c index a096af3..921f067 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -221,7 +221,7 @@ void get_icon (Task *tsk) } data = server_get_property (tsk->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); - if (data && i) { + if (data) { // get ARGB icon int w, h; long *tmp_data; diff --git a/src/util/area.c b/src/util/area.c index 62adbf0..dd50c9e 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -31,25 +31,38 @@ #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 -*/ +/************************************************************ + * Layering & drawing loop of tint2 + * + * Areas in tint2 are similar to widgets in a GUI. + * Areas (task, clock, systray, taskbar,...) are nodes in a tree. + * The position of each Area is defined by parent's position and brothers on the left. + * + * !!! This design is experimental and not yet complete !!!!!!!!!!!!! + * + * 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 + * - parent's position is calculated before children's position + * 4) redraw needed objects + ************************************************************/ + +void size_by_content (Area *a); +void size_by_layout (Area *a); + void refresh (Area *a) { // don't draw and resize hide objects if (!a->on_screen) return; - size(a); - //size_by_content(a); + //size(a); + size_by_content(a); + size_by_layout(a); // don't draw transparent objects (without foreground and without background) if (a->redraw) { @@ -93,7 +106,7 @@ void size (Area *a) } } -// browse tree and resize SIZE_BY_CONTENT node + void size_by_content (Area *a) { // children node are resized before its parent @@ -106,27 +119,32 @@ 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); + ((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 - // 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); } -- 2.44.0