From da65866b2388391052e3ce95818c1d5ebd2b26b5 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Fri, 13 Feb 2009 21:54:42 +0000 Subject: [PATCH] tint2 looks good for me. if you see bugs, report it. --- ChangeLog | 4 + src/clock/clock.c | 20 ++++- src/config.c | 11 +-- src/panel.c | 166 +++++++++++++++++++++++---------------- src/panel.h | 11 ++- src/systray/systraybar.c | 2 +- src/taskbar/task.c | 9 +-- src/taskbar/taskbar.c | 79 +++++++------------ src/taskbar/taskbar.h | 3 - src/tint.c | 32 ++++++-- src/tint2 | Bin 55664 -> 55656 bytes src/util/area.c | 33 ++++---- src/util/area.h | 3 +- 13 files changed, 204 insertions(+), 169 deletions(-) diff --git a/ChangeLog b/ChangeLog index 097d718..55a5ac9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2009-02-13 +- improved object oriented layout +- tint2 looks good for me. if you see bugs, report it. + 2009-02-12 - fixed issue 14 : no icons diff --git a/src/clock/clock.c b/src/clock/clock.c index e7bb32f..35fb595 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -52,6 +52,9 @@ void init_clock(Clock *clock, Area *parent) clock->area._resize = resize_clock; if (!time1_format) return; + // add clock to the panel + panel->area.list = g_slist_append(panel->area.list, clock); + if (strchr(time1_format, 'S') == NULL) time_precision = 60; else time_precision = 1; @@ -119,12 +122,13 @@ void draw_foreground_clock (void *obj, cairo_t *c, int active) void resize_clock (void *obj) { - Area *parent = ((Area*)obj)->parent; Clock *clock = obj; PangoLayout *layout; int time_width, date_width, new_width; time_width = date_width = 0; + clock->area.redraw = 1; + strftime(buf_time, sizeof(buf_time), time1_format, localtime(&time_clock.tv_sec)); if (time2_format) strftime(buf_date, sizeof(buf_date), time2_format, localtime(&time_clock.tv_sec)); @@ -156,11 +160,19 @@ void resize_clock (void *obj) new_width += (2*clock->area.paddingxlr) + (2*clock->area.pix.border.width); if (new_width > clock->area.width || new_width < (clock->area.width-3)) { - // resize clock + int i; + Panel *panel = ((Area*)obj)->panel; + //printf("clock_width %d, new_width %d\n", clock->area.width, new_width); + // resize clock clock->area.width = new_width; - clock->area.posx = parent->width - clock->area.width - parent->paddingxlr - parent->pix.border.width; - set_resize(parent); + clock->area.posx = panel->area.width - clock->area.width - panel->area.paddingxlr - panel->area.pix.border.width; + + // resize other objects on panel + for (i=0 ; i < nb_panel ; i++) { + panel1[i].area.resize = 1; + } + panel_refresh = 1; } g_object_unref (layout); diff --git a/src/config.c b/src/config.c index f423654..f93faf5 100644 --- a/src/config.c +++ b/src/config.c @@ -570,16 +570,17 @@ void config_finish () } init_panel(); + // force the resize + for (i=0 ; i < nb_panel ; i++) { + panel1[i].area.resize = 1; + resize_clock(&panel1[i].clock); + } + init_taskbar(); visible_object(); cleanup_config(); - // force the resize (using visible_object() order) - for (i=0 ; i < nb_panel ; i++) { - //init_systray(&panel1[i].trayer, &panel1[i].area); - set_resize(&panel1[i]); - } task_refresh_tasklist(); } diff --git a/src/panel.c b/src/panel.c index 881fdaf..b12f58a 100644 --- a/src/panel.c +++ b/src/panel.c @@ -58,8 +58,10 @@ void init_panel() for (i=0 ; i < nb_panel ; i++) { p = &panel1[i]; - p->area.parent = 0; + p->area.parent = p; p->area.panel = p; + p->area.visible = 1; + p->area._resize = resize_panel; p->g_taskbar.parent = p; p->g_taskbar.panel = p; p->g_task.area.panel = p; @@ -73,6 +75,7 @@ void init_panel() else p->area.height = p->initial_height; + // full width mode if (!p->area.width) p->area.width = server.monitor[p->monitor].width; @@ -125,52 +128,113 @@ void cleanup_panel() cleanup_taskbar(); + // font allocated once + if (panel1[0].g_task.font_desc) { + pango_font_description_free(panel1[0].g_task.font_desc); + panel1[0].g_task.font_desc = 0; + } + int i; Panel *p; for (i=0 ; i < nb_panel ; i++) { p = &panel1[i]; - // no free_area(&p->area) because it's the list of visible objects - if (p->area.list) { - g_slist_free(p->area.list); - p->area.list = 0; + // freed list of visible objects + if (p->list_visible) { + g_slist_free(p->list_visible); + p->list_visible = 0; } + free_area(&p->area); free_area(&p->g_task.area); free_area(&p->g_taskbar); - free_area(&p->clock.area); - if (p->area.pix.pmap) XFreePixmap(server.dsp, p->area.pix.pmap); - if (p->area.pix_active.pmap) XFreePixmap(server.dsp, p->area.pix_active.pmap); - if (p->root_pmap) XFreePixmap(server.dsp, p->root_pmap); - if (p->main_win) XDestroyWindow(server.dsp, p->main_win); - } - // font allocated once - if (panel1[0].g_task.font_desc) pango_font_description_free(panel1[0].g_task.font_desc); + if (p->temp_pmap) { + XFreePixmap(server.dsp, p->temp_pmap); + p->temp_pmap = 0; + } + if (p->main_win) { + XDestroyWindow(server.dsp, p->main_win); + p->main_win = 0; + } + } if (panel1) free(panel1); panel1 = 0; } -void visual_refresh (Panel *p) +void resize_panel(void *obj) { - if (p->root_pmap) XFreePixmap(server.dsp, p->root_pmap); - p->root_pmap = XCreatePixmap(server.dsp, server.root_win, p->area.width, p->area.height, server.depth); + Panel *panel = (Panel*)obj; + int taskbar_width, modulo_width, taskbar_on_screen; + +//printf("resize_panel : : posx et width des barres de taches\n"); + + if (panel_mode == MULTI_DESKTOP) taskbar_on_screen = panel->nb_desktop; + else taskbar_on_screen = 1; + + taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width); + if (time1_format) + taskbar_width -= (panel->clock.area.width + panel->area.paddingx); + //taskbar_width -= (panel->trayer.area.width + panel->area.paddingx); + + taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel->area.paddingx)) / taskbar_on_screen; + + if (taskbar_on_screen > 1) + modulo_width = (taskbar_width - ((taskbar_on_screen-1) * panel->area.paddingx)) % taskbar_on_screen; + else + modulo_width = 0; + + // change posx and width for all taskbar + int i, modulo=0, posx=0; + for (i=0 ; i < panel->nb_desktop ; i++) { + if ((i % taskbar_on_screen) == 0) { + posx = panel->area.pix.border.width + panel->area.paddingxlr; + modulo = modulo_width; + } + else posx += taskbar_width + panel->area.paddingx; + + panel->taskbar[i].area.posx = posx; + panel->taskbar[i].area.width = taskbar_width; + panel->taskbar[i].area.resize = 1; + if (modulo) { + panel->taskbar[i].area.width++; + modulo--; + } + } +} - XCopyArea (server.dsp, p->area.pix.pmap, p->root_pmap, server.gc, 0, 0, p->area.width, p->area.height, 0, 0); - // draw child object - GSList *l = p->area.list; - for (; l ; l = l->next) { - refresh (l->data); - } +void visible_object() +{ + Panel *panel; + int i, j; + + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; - XCopyArea(server.dsp, p->root_pmap, p->main_win, server.gc, 0, 0, p->area.width, p->area.height, 0, 0); + // clock before taskbar because resize(clock) can resize others object + if (time1_format) + panel->clock.area.visible = 1; + else + panel->clock.area.visible = 0; + + //panel->area.list = g_slist_append(panel->area.list, &panel->trayer); - // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right. - // this feature is disabled ! - //XCopyArea (server.dsp, server.pmap, p->main_win, server.gc, p->area.paddingxlr, 0, p->area.width-(2*p->area.paddingxlr), p->area.height, 0, 0); + Taskbar *taskbar; + for (j=0 ; j < panel->nb_desktop ; j++) { + taskbar = &panel->taskbar[j]; + if (panel_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) { + // (SINGLE_DESKTOP or SINGLE_MONITOR) and not current desktop + taskbar->area.visible = 0; + } + else { + taskbar->area.visible = 1; + } + } + } + panel_refresh = 1; } @@ -235,42 +299,6 @@ void set_panel_properties(Panel *p) } -void visible_object() -{ - Panel *panel; - int i, j; - - for (i=0 ; i < nb_panel ; i++) { - panel = &panel1[i]; - - if (panel->area.list) { - g_slist_free(panel->area.list); - panel->area.list = 0; - } - - // list of visible objects - // start with clock because draw(clock) can resize others object - if (time1_format) - panel->area.list = g_slist_append(panel->area.list, &panel->clock); - - //panel->area.list = g_slist_append(panel->area.list, &panel->trayer); - - Taskbar *taskbar; - for (j=0 ; j < panel->nb_desktop ; j++) { - taskbar = &panel->taskbar[j]; - if (panel_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) { - // (SINGLE_DESKTOP or SINGLE_MONITOR) and not current desktop - continue; - } - - panel->area.list = g_slist_append(panel->area.list, taskbar); - } - set_redraw(&panel->area); - } - panel_refresh = 1; -} - - void set_panel_background(Panel *p) { get_root_pixmap(); @@ -278,7 +306,7 @@ void set_panel_background(Panel *p) if (p->area.pix.pmap) XFreePixmap (server.dsp, p->area.pix.pmap); p->area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, p->area.width, p->area.height, server.depth); - // copy background (server.root_pmap) in panel + // copy background (server.root_pmap) in panel.area.pix.pmap Window dummy; int x, y; XTranslateCoordinates(server.dsp, p->main_win, server.root_win, 0, 0, &x, &y, &dummy); @@ -296,11 +324,13 @@ void set_panel_background(Panel *p) cairo_destroy (c); cairo_surface_destroy (cs); - // redraw panel - set_redraw (&p->area); - - // copy background panel on desktop window - //XCopyArea (server.dsp, p->area.pix.pmap, server.root_win, server.gc_root, 0, 0, p->area.width, p->area.height, p->posx, p->posy); + // redraw panel's object + GSList *l0; + Area *a; + for (l0 = p->area.list; l0 ; l0 = l0->next) { + a = l0->data; + set_redraw(a); + } } diff --git a/src/panel.h b/src/panel.h index 3a4b6dd..64ffcdb 100644 --- a/src/panel.h +++ b/src/panel.h @@ -46,12 +46,17 @@ extern Task *task_drag; typedef struct { // always start with area + // area.list own all objects of the panel according to config file Area area; + // list of visible objects + GSList *list_visible; + // -------------------------------------------------- // panel Window main_win; - Pixmap root_pmap; + Pixmap temp_pmap; + // position relative to root window int posx, posy; int marginx, marginy; @@ -90,13 +95,15 @@ extern int nb_panel; void init_panel(); void cleanup_panel(); -void visual_refresh(Panel *p); +void resize_panel(void *obj); + void set_panel_properties(Panel *p); void visible_object(); // draw background panel void set_panel_background(Panel *p); +// detect witch panel Panel *get_panel(Window win); #endif diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 0c515e9..2406145 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -54,7 +54,7 @@ void init_systray(Systraybar *sysbar, Area *parent) sysbar->area.redraw = 1; -printf("init_systray"); +//printf("init_systray"); net_init(); } diff --git a/src/taskbar/task.c b/src/taskbar/task.c index 2c039ab..50a64d4 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -77,11 +77,8 @@ void add_task (Window win) new_tsk2->icon_width = new_tsk.icon_width; new_tsk2->icon_height = new_tsk.icon_height; tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2); - + tskbar->area.resize = 1; //printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title); - // set_resize (&tskbar->area); - if (resize_tasks (tskbar)) - set_redraw (&tskbar->area); } } } @@ -97,7 +94,6 @@ void remove_task (Task *tsk) // free title and icon just for the first task // even with task_on_all_desktop and with task_on_all_panel //printf("remove_task %s %d\n", tsk->title, tsk->desktop); - //printf("remove_task %s \n", tsk->title); if (tsk->title) free (tsk->title); if (tsk->icon_data) @@ -117,8 +113,7 @@ void remove_task (Task *tsk) l0 = l0->next; if (win == tsk2->win) { tskbar->area.list = g_slist_remove(tskbar->area.list, tsk2); - set_resize (&tskbar->area); - set_redraw (&tskbar->area); + tskbar->area.resize = 1; if (tsk2 == task_active) task_active = 0; diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index 45d3b3d..70af337 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -42,11 +42,17 @@ void init_taskbar() for (i=0 ; i < nb_panel ; i++) { panel = &panel1[i]; + if (panel->taskbar) { + free(panel->taskbar); + panel->taskbar = 0; + } + // taskbar panel->g_taskbar._resize = resize_taskbar; panel->g_taskbar.posy = panel->area.pix.border.width + panel->area.paddingy; panel->g_taskbar.height = panel->area.height - (2 * panel->g_taskbar.posy); panel->g_taskbar.redraw = 1; + panel->g_taskbar.visible = 1; // task panel->g_task.area._draw_foreground = draw_foreground_task; @@ -54,6 +60,7 @@ void init_taskbar() panel->g_task.area.height = panel->area.height - (2 * panel->g_task.area.posy); panel->g_task.area.use_active = 1; panel->g_task.area.redraw = 1; + panel->g_task.area.visible = 1; if (panel->g_task.area.pix.border.rounded > panel->g_task.area.height/2) { panel->g_task.area.pix.border.rounded = panel->g_task.area.height/2; @@ -84,6 +91,9 @@ void init_taskbar() tskbar = &panel->taskbar[j]; memcpy(&tskbar->area, &panel->g_taskbar, sizeof(Area)); tskbar->desktop = j; + + // add taskbar to the panel + panel->area.list = g_slist_append(panel->area.list, tskbar); } } } @@ -92,6 +102,7 @@ void init_taskbar() void cleanup_taskbar() { Panel *panel; + Taskbar *tskbar; int i, j; GSList *l0; Task *tsk; @@ -100,14 +111,18 @@ void cleanup_taskbar() panel = &panel1[i]; for (j=0 ; j < panel->nb_desktop ; j++) { - l0 = panel->taskbar[j].area.list; + tskbar = &panel->taskbar[j]; + l0 = tskbar->area.list; while (l0) { tsk = l0->data; l0 = l0->next; // careful : remove_task change l0->next remove_task (tsk); } - free_area (&panel->taskbar[j].area); + free_area (&tskbar->area); + + // remove taskbar from the panel + panel->area.list = g_slist_remove(panel->area.list, tskbar); } } @@ -188,17 +203,21 @@ void task_refresh_tasklist () } -int resize_tasks (Taskbar *taskbar) +void resize_taskbar(void *obj) { - int ret, task_count, pixel_width, modulo_width=0; - int x, taskbar_width; - Task *tsk; + Taskbar *taskbar = (Taskbar*)obj; Panel *panel = (Panel*)taskbar->area.panel; + int task_count, pixel_width, modulo_width=0; + int x, taskbar_width; + Task *tsk; GSList *l; +//printf("resize_taskbar : posx et width des taches\n"); + + taskbar->area.redraw = 1; + // new task width for 'desktop' task_count = g_slist_length(taskbar->area.list); - if (!task_count) pixel_width = panel->g_task.maximum_width; else { taskbar_width = taskbar->area.width - (2 * panel->g_taskbar.pix.border.width) - (2 * panel->g_taskbar.paddingxlr); @@ -210,13 +229,10 @@ int resize_tasks (Taskbar *taskbar) else modulo_width = taskbar_width % task_count; } - //printf("monitor %d, resize_tasks %d %d\n", panel->monitor, task_count, pixel_width); if ((taskbar->task_width == pixel_width) && (taskbar->task_modulo == modulo_width)) { - ret = 0; } else { - ret = 1; taskbar->task_width = pixel_width; taskbar->task_modulo = modulo_width; taskbar->text_width = pixel_width - panel->g_task.text_posx - panel->g_task.area.pix.border.width - panel->g_task.area.paddingx; @@ -228,6 +244,7 @@ int resize_tasks (Taskbar *taskbar) tsk = l->data; tsk->area.posx = x; tsk->area.width = pixel_width; + tsk->area.redraw = 1; if (modulo_width) { tsk->area.width++; modulo_width--; @@ -235,49 +252,7 @@ int resize_tasks (Taskbar *taskbar) x += tsk->area.width + panel->g_taskbar.paddingx; } - return ret; } -// initialise taskbar posx and width -void resize_taskbar(void *obj) -{ - Panel *panel = ((Area*)obj)->panel; - int taskbar_width, modulo_width, taskbar_on_screen; - - if (panel_mode == MULTI_DESKTOP) taskbar_on_screen = panel->nb_desktop; - else taskbar_on_screen = 1; - - taskbar_width = panel->area.width - (2 * panel->area.paddingxlr) - (2 * panel->area.pix.border.width); - if (time1_format) - taskbar_width -= (panel->clock.area.width + panel->area.paddingx); - //taskbar_width -= (panel->trayer.area.width + panel->area.paddingx); - - taskbar_width = (taskbar_width - ((taskbar_on_screen-1) * panel->area.paddingx)) / taskbar_on_screen; - - if (taskbar_on_screen > 1) - modulo_width = (taskbar_width - ((taskbar_on_screen-1) * panel->area.paddingx)) % taskbar_on_screen; - else - modulo_width = 0; - - int i, modulo=0, posx=0; - for (i=0 ; i < panel->nb_desktop ; i++) { - if ((i % taskbar_on_screen) == 0) { - posx = panel->area.pix.border.width + panel->area.paddingxlr; - modulo = modulo_width; - } - else posx += taskbar_width + panel->area.paddingx; - - panel->taskbar[i].area.posx = posx; - panel->taskbar[i].area.width = taskbar_width; - if (modulo) { - panel->taskbar[i].area.width++; - modulo--; - } - - set_redraw (&panel->taskbar[i].area); - resize_tasks(&panel->taskbar[i]); - } -} - diff --git a/src/taskbar/taskbar.h b/src/taskbar/taskbar.h index 807e285..2a08c27 100644 --- a/src/taskbar/taskbar.h +++ b/src/taskbar/taskbar.h @@ -31,9 +31,6 @@ void cleanup_taskbar(); Task *task_get_task (Window win); void task_refresh_tasklist (); -// return 1 if task_width changed -int resize_tasks (Taskbar *tskbar); - void resize_taskbar(void *obj); diff --git a/src/tint.c b/src/tint.c index b84ee18..20038c1 100644 --- a/src/tint.c +++ b/src/tint.c @@ -138,6 +138,7 @@ void event_button_press (XEvent *e) int y = e->xbutton.y; for (l0 = panel->area.list; l0 ; l0 = l0->next) { tskbar = l0->data; + if (!tskbar->area.visible) continue; if (x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) break; } @@ -187,6 +188,7 @@ void event_button_release (XEvent *e) GSList *l0; for (l0 = panel->area.list; l0 ; l0 = l0->next) { tskbar = l0->data; + if (!tskbar->area.visible) continue; if (x >= tskbar->area.posx && x <= (tskbar->area.posx + tskbar->area.width)) goto suite; } @@ -250,7 +252,7 @@ void event_property_notify (Window win, Atom at) init_taskbar(); visible_object(); for (i=0 ; i < nb_panel ; i++) { - set_resize(&panel1[i]); + panel1[i].area.resize = 1; } task_refresh_tasklist(); panel_refresh = 1; @@ -400,6 +402,11 @@ void event_configure_notify (Window win) // task on another monitor remove_task (tsk); add_task (win); + if (win == window_get_active ()) { + Task *tsk = task_get_task (win); + tsk->area.is_active = 1; + task_active = tsk; + } panel_refresh = 1; } } @@ -421,7 +428,6 @@ void event_timer() int i; for (i=0 ; i < nb_panel ; i++) { - panel1[i].clock.area.redraw = 1; panel1[i].clock.area.resize = 1; } panel_refresh = 1; @@ -483,9 +489,7 @@ load_config: case Expose: panel = get_panel(e.xany.window); if (!panel) break; - //XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); - //XCopyArea (server.dsp, server.pmap, panel.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); - XCopyArea (server.dsp, panel->root_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); + XCopyArea (server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); break; case PropertyNotify: @@ -532,14 +536,26 @@ load_config: } if (panel_refresh) { + panel_refresh = 0; + for (i=0 ; i < nb_panel ; i++) { - visual_refresh(&panel1[i]); - } + panel = &panel1[i]; + if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap); + panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); + + refresh(panel); + XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); + } XFlush (server.dsp); - panel_refresh = 0; } } } +// **************************************************** +// main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right. +// this feature is disabled ! +//XCopyArea (server.dsp, server.pmap, p->main_win, server.gc, p->area.paddingxlr, 0, p->area.width-(2*p->area.paddingxlr), p->area.height, 0, 0); +//XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy); +//XCopyArea (server.dsp, server.pmap, panel.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0); diff --git a/src/tint2 b/src/tint2 index c3248d4e9dc73f112f431bee8d150dca8356a84e..42b93978427e2480b91fa3d7d7b1c006630614b3 100755 GIT binary patch delta 21775 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 diff --git a/src/util/area.c b/src/util/area.c index 7606679..4cb3b41 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -32,15 +32,18 @@ void refresh (Area *a) { + if (!a->visible) return; if (a->resize) { // resize can generate a redraw - if (a->_resize) + if (a->_resize) { + //printf("resize area posx %d, width %d\n", a->posx, a->width); a->_resize(a); + } a->resize = 0; } if (a->redraw) { - //printf("draw pix\n"); + //printf("draw area posx %d, width %d\n", a->posx, a->width); draw(a, 0); if (a->use_active) draw(a, 1); @@ -49,7 +52,7 @@ void refresh (Area *a) // draw current Area Pixmap *pmap = (a->is_active == 0) ? (&a->pix.pmap) : (&a->pix_active.pmap); - XCopyArea (server.dsp, *pmap, ((Panel *)a->panel)->root_pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy); + 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; @@ -68,26 +71,15 @@ void set_redraw (Area *a) } -void set_resize (Area *a) -{ - a->resize = 1; - - GSList *l; - for (l = a->list ; l ; l = l->next) - set_resize(l->data); -} - - 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, ((Panel *)a->panel)->root_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; @@ -151,7 +143,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); @@ -197,8 +188,14 @@ void free_area (Area *a) g_slist_free(a->list); a->list = 0; } - if (a->pix.pmap) XFreePixmap (server.dsp, a->pix.pmap); - if (a->pix_active.pmap) XFreePixmap (server.dsp, a->pix_active.pmap); + 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; + } } diff --git a/src/util/area.h b/src/util/area.h index acea08f..da32592 100644 --- a/src/util/area.h +++ b/src/util/area.h @@ -7,7 +7,7 @@ * Area manage the background and border drawing, size and padding. * Each Area have 2 Pixmap (pix and pix_active). * -* Area also manage the tree of visible objects. Parent object drawn before child object. +* Area manage the tree of all objects. Parent object drawn before child object. * panel -> taskbars -> tasks * -> systray -> icons * -> clock @@ -59,6 +59,7 @@ typedef struct { // list of child : Area object GSList *list; + int visible; // need compute position and width int resize; // need redraw Pixmap -- 2.44.0