From 9f16bbd6cc603cbbb6e6cbd55299ce48641fa5bb Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Sat, 26 Sep 2009 11:04:02 +0000 Subject: [PATCH] new solution for omnipresent task --- src/panel.h | 2 +- src/taskbar/task.c | 10 ++++----- src/taskbar/taskbar.c | 2 -- src/tint.c | 52 +++++++++++++++++++++++-------------------- src/util/area.c | 5 +++++ 5 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/panel.h b/src/panel.h index 9fd52bc..5746a55 100644 --- a/src/panel.h +++ b/src/panel.h @@ -83,7 +83,7 @@ typedef struct { // -------------------------------------------------- // taskbar point to the first taskbar in panel.area.list. - // number of tasbar == nb_desktop + // number of tasbar == nb_desktop. taskbar[i] is for desktop(i). // taskbar[i] is used to loop over taskbar, // while panel->area.list is used to loop over all panel's objects Taskbar *taskbar; diff --git a/src/taskbar/task.c b/src/taskbar/task.c index cbd1b07..c4c2b88 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -61,12 +61,6 @@ Task *add_task (Window win) Taskbar *tskbar; Task *new_tsk2=0; int i, j; -// for (i = 0; i < nb_panel; i++) { -// if (nb_panel > 1 && panel1[i].monitor != monitor) continue; -// for (j = 0; j < panel1[i].nb_desktop; j++) { -// if ((new_tsk.desktop != ALLDESKTOP && new_tsk.desktop != j) -// || (panel_mode == MULTI_DESKTOP && new_tsk.desktop == ALLDESKTOP && server.desktop != j)) -// continue; for (i=0 ; i < nb_panel ; i++) { for (j=0 ; j < panel1[i].nb_desktop ; j++) { if (new_tsk.desktop != ALLDESKTOP && new_tsk.desktop != j) continue; @@ -78,6 +72,10 @@ Task *add_task (Window win) new_tsk2->area.parent = tskbar; new_tsk2->win = new_tsk.win; new_tsk2->desktop = new_tsk.desktop; + if (new_tsk2->desktop == ALLDESKTOP && server.desktop != j) { + // hide ALLDESKTOP task on non-current desktop + new_tsk2->area.on_screen = 0; + } new_tsk2->title = new_tsk.title; new_tsk2->icon = new_tsk.icon; new_tsk2->icon_active = new_tsk.icon_active; diff --git a/src/taskbar/taskbar.c b/src/taskbar/taskbar.c index f20e89e..1c02988 100644 --- a/src/taskbar/taskbar.c +++ b/src/taskbar/taskbar.c @@ -261,7 +261,6 @@ void resize_taskbar(void *obj) if (!tsk->area.on_screen) continue; tsk->area.posx = x; tsk->area.width = pixel_width; - tsk->area.redraw = 1; if (modulo_width) { tsk->area.width++; modulo_width--; @@ -303,7 +302,6 @@ void resize_taskbar(void *obj) if (!tsk->area.on_screen) continue; tsk->area.posy = y; tsk->area.height = pixel_height; - tsk->area.redraw = 1; if (modulo_height) { tsk->area.height++; modulo_height--; diff --git a/src/tint.c b/src/tint.c index 0518486..b4e4c87 100644 --- a/src/tint.c +++ b/src/tint.c @@ -169,7 +169,7 @@ Task *click_task (Panel *panel, int x, int y) Task *tsk; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { tsk = l0->data; - if (x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { + if (tsk->area.on_screen && x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) { return tsk; } } @@ -178,7 +178,7 @@ Task *click_task (Panel *panel, int x, int y) Task *tsk; for (l0 = tskbar->area.list; l0 ; l0 = l0->next) { tsk = l0->data; - if (y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { + if (tsk->area.on_screen && y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) { return tsk; } } @@ -393,33 +393,37 @@ void event_property_notify (XEvent *e) } // Change desktop else if (at == server.atom._NET_CURRENT_DESKTOP) { + int old_desktop = server.desktop; server.desktop = server_get_current_desktop (); for (i=0 ; i < nb_panel ; i++) { Panel *panel = &panel1[i]; if (panel_mode == MULTI_DESKTOP && panel->g_taskbar.use_active) { - // redraw taskbar + // redraw both taskbar + panel->taskbar[old_desktop].area.is_active = 0; + panel->taskbar[old_desktop].area.redraw = 1; + panel->taskbar[server.desktop].area.is_active = 1; + panel->taskbar[server.desktop].area.redraw = 1; panel_refresh = 1; - Taskbar *tskbar; - Task *tsk; - GSList *l; - for (j=0 ; j < panel->nb_desktop ; j++) { - tskbar = &panel->taskbar[j]; - if (tskbar->area.is_active) { - tskbar->area.is_active = 0; - tskbar->area.redraw = 1; - for (l = tskbar->area.list; l ; l = l->next) { - tsk = l->data; - tsk->area.redraw = 1; - } - } - if (j == server.desktop) { - tskbar->area.is_active = 1; - tskbar->area.redraw = 1; - for (l = tskbar->area.list; l ; l = l->next) { - tsk = l->data; - tsk->area.redraw = 1; - } - } + } + // check ALLDESKTOP task => resize taskbar + Taskbar *tskbar; + Task *tsk; + GSList *l; + tskbar = &panel->taskbar[old_desktop]; + for (l = tskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (tsk->desktop == ALLDESKTOP) { + tsk->area.on_screen = 0; + tskbar->area.resize = 1; + panel_refresh = 1; + } + } + tskbar = &panel->taskbar[server.desktop]; + for (l = tskbar->area.list; l ; l = l->next) { + tsk = l->data; + if (tsk->desktop == ALLDESKTOP) { + tsk->area.on_screen = 1; + tskbar->area.resize = 1; } } } diff --git a/src/util/area.c b/src/util/area.c index 0e151e2..8c40aa6 100644 --- a/src/util/area.c +++ b/src/util/area.c @@ -43,6 +43,11 @@ void refresh (Area *a) // 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) + set_redraw(l->data); + //printf("draw area posx %d, width %d\n", a->posx, a->width); draw(a, 0); if (a->use_active) -- 2.44.0