]> Dogcows Code - chaz/tint2/commitdiff
new solution for omnipresent task
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 26 Sep 2009 11:04:02 +0000 (11:04 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 26 Sep 2009 11:04:02 +0000 (11:04 +0000)
src/panel.h
src/taskbar/task.c
src/taskbar/taskbar.c
src/tint.c
src/util/area.c

index 9fd52bc3574f34d0c1d563f6a27b25e853eb3ee4..5746a5574806706df596f378f9f90e9af7a67eba 100644 (file)
@@ -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;
index cbd1b0765495241c4d125ae95ce1802cbed73e81..c4c2b883e40b1e41d16672da03a73860e4eec0d0 100644 (file)
@@ -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;
index f20e89e0cff6597181e518734f9a2b7ae0b82f2f..1c029881fc4f6f730bfeb8bf585622c2d6cf4cba 100644 (file)
@@ -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--;
index 0518486bc39352a83c2f1916434288cea401a942..b4e4c879f0e71f74a5bea3bbd3ca5f2e3d0ede84 100644 (file)
@@ -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;
                                        }
                                }
                        }
index 0e151e28bcf663cbfb3bbf66f7efbaef7fc78014..8c40aa667a339ab8f7556566e9608b53f24fe5cb 100644 (file)
@@ -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)
This page took 0.029069 seconds and 4 git commands to generate.