]> Dogcows Code - chaz/tint2/commitdiff
fixed bug with "task on all desktop" (issue 39), fixed memory corruption
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 18 Jan 2009 22:12:41 +0000 (22:12 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sun, 18 Jan 2009 22:12:41 +0000 (22:12 +0000)
15 files changed:
ChangeLog
src/clock/clock.c
src/clock/clock.h
src/panel.c
src/server.c
src/server.h
src/taskbar/task.c
src/taskbar/task.h
src/taskbar/taskbar.c
src/tint.c
src/tint2
src/util/area.c
src/util/area.h
src/util/window.c
src/util/window.h

index c60fa676fab54ee246a391cc16727b0c240e36f9..e48dba36d0250ef6fadedee21d31e3042278a0eb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
 
+2009-01-18
+- update documentation for new config format
+- fixed memory corruption
+- fixed bug with "task on all desktop" (issue 39)
+
 2009-01-17
 - fixed drawing of active task (with new layout)
 
index 2ec86a45c656024dcafacfc9171c16523de7a553..5fb6cb152ab4382d17efabb5f0c5d5ff504a5348 100644 (file)
@@ -64,7 +64,7 @@ void init_clock(Clock *clock, int panel_height)
 }
 
 
-void draw_foreground_clock (void *obj, cairo_t *c)
+void draw_foreground_clock (void *obj, cairo_t *c, int active)
 {
    Clock *clock = obj;
    PangoLayout *layout;
index 742a2246c505c86fc74c8c667e5a5478b2c1bcee..b886d4a39882f550e4c47639a5370c9a7f06a938 100644 (file)
@@ -32,7 +32,7 @@ typedef struct Clock {
 // initialize clock : y position, precision, ...
 void init_clock(Clock *clock, int panel_height);
 
-void draw_foreground_clock (void *obj, cairo_t *c);
+void draw_foreground_clock (void *obj, cairo_t *c, int active);
 
 
 #endif
index 6e0b45c4b3ca01c8b9ab9636edfdd1ab806655b4..71802e6db76699890d1d570f75df2ce3e992527c 100644 (file)
@@ -35,7 +35,8 @@ void visual_refresh ()
       set_panel_background();
 
    if (server.pmap) XFreePixmap (server.dsp, server.pmap);
-   server.pmap = server_create_pixmap (panel.area.width, panel.area.height);
+   server.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth);
+
    XCopyArea (server.dsp, panel.area.pix.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
 
    // draw child object
@@ -176,7 +177,8 @@ void set_panel_background()
 {
    Pixmap wall = get_root_pixmap();
 
-   panel.area.pix.pmap = server_create_pixmap (panel.area.width, panel.area.height);
+   if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap);
+   panel.area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth);
 
    // add layer of root pixmap
    XCopyArea (server.dsp, wall, panel.area.pix.pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0);
index aaa18638a4b3e32578edc97326dd8b8bc0070678..6767f9dc5ac2697afcee47d7602b8191841a140e 100644 (file)
@@ -135,12 +135,6 @@ void *server_get_property (Window win, Atom at, Atom type, int *num_results)
 }
 
 
-Pixmap server_create_pixmap (int width, int height)
-{
-   return XCreatePixmap (server.dsp, server.root_win, width, height, server.depth);
-}
-
-
 Pixmap get_root_pixmap ()
 {
    Pixmap ret;
index 435aefdc3bb76d4fc684ff6f994ac21f30179bcc..d042f7054f05b78954673c926ee5f870c6fad7ee 100644 (file)
@@ -97,7 +97,6 @@ void server_refresh_root_pixmap ();
 void server_refresh_main_pixmap ();
 void server_catch_error (Display *d, XErrorEvent *ev);
 void server_init_atoms ();
-Pixmap server_create_pixmap (int width, int height);
 void get_monitors();
 Pixmap get_root_pixmap();
 
index 2a7119ad7c2a51ade4c3560f12b915db6a5927ae..9bfc7036a8363fead4637015616427107e5fe563 100644 (file)
@@ -39,7 +39,8 @@ void add_task (Window win)
    Task *new_tsk;
    int desktop, monitor;
 
-   if (!win || window_is_hidden (win) || win == window.main_win) return;
+   if (!win) return;
+   if (window_is_hidden (win) || win == window.main_win) return;
 
    new_tsk = malloc(sizeof(Task));
    new_tsk->win = win;
@@ -55,31 +56,46 @@ void add_task (Window win)
    //if (panel.mode == MULTI_MONITOR) monitor = window_get_monitor (new_tsk->win);
    //else monitor = 0;
    //printf("task %s : desktop %d, monitor %d\n", new_tsk->title, desktop, monitor);
-
    XSelectInput (server.dsp, new_tsk->win, PropertyChangeMask|StructureNotifyMask);
 
+   Taskbar *tskbar;
    if (desktop == 0xFFFFFFFF) {
-      if (new_tsk->title) {
-         free (new_tsk->title);
-         new_tsk->title = 0;
-      }
-      if (new_tsk->icon_data) {
-         free (new_tsk->icon_data);
-         new_tsk->icon_data = 0;
-      }
-      free(new_tsk);
-      fprintf(stderr, "task on all desktop : ignored\n");
-      return;
+      tskbar = &panel.taskbar[index(0, monitor)];
+      new_tsk->all_desktop = 1;
+   }
+   else {
+      tskbar = &panel.taskbar[index(desktop, monitor)];
+      new_tsk->all_desktop = 0;
    }
 
    //printf("add_task %d  %s\n", index(desktop, monitor), new_tsk->title);
-   Taskbar *tskbar;
-   tskbar = &panel.taskbar[index(desktop, monitor)];
    new_tsk->area.parent = tskbar;
    tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk);
 
    if (resize_tasks (tskbar))
       set_redraw (&tskbar->area);
+
+   if (desktop == 0xFFFFFFFF) {
+      // task on all desktop
+      int i;
+      Task *new_tsk2;
+      for (i = 1 ; i < server.nb_desktop ; i++) {
+         new_tsk2 = malloc(sizeof(Task));
+         memcpy(new_tsk2, new_tsk, sizeof(Task));
+         
+         new_tsk2->title = 0;
+         new_tsk2->icon_data = 0;
+         get_icon(new_tsk2);
+         get_title(new_tsk2);
+
+         tskbar = &panel.taskbar[index(i, monitor)];
+         new_tsk2->area.parent = tskbar;
+         tskbar->area.list = g_slist_append(tskbar->area.list, new_tsk2);
+
+         if (resize_tasks (tskbar))
+            set_redraw (&tskbar->area);
+      }
+   }
 }
 
 
@@ -94,6 +110,11 @@ void remove_task (Task *tsk)
    set_redraw (&tskbar->area);
    //printf("remove_task %d  %s\n", index(tskbar->desktop, tskbar->monitor), tsk->title);
 
+   if (tsk == panel.task_active) 
+       panel.task_active = 0;
+   if (tsk == panel.task_drag) 
+       panel.task_drag = 0;
+
    if (tsk->title) {
       free (tsk->title);
       tsk->title = 0;
@@ -102,6 +123,7 @@ void remove_task (Task *tsk)
       free (tsk->icon_data);
       tsk->icon_data = 0;
    }
+
    XFreePixmap (server.dsp, tsk->area.pix.pmap);
    XFreePixmap (server.dsp, tsk->area.pix_active.pmap);
    free(tsk);
index ec1544d09e5b9ce23cb23045beffda466380a42b..2948906372b584a646402b2b397a001badebedcc 100644 (file)
@@ -46,6 +46,7 @@ typedef struct {
    int icon_width;
    int icon_height;
    char *title;
+   int  all_desktop;
 } Task;
 
 
index 7118182611f562012f7da718764e87a220cd8802..fe2383c19086bfeeb7579758073296524113e0e5 100644 (file)
@@ -43,7 +43,8 @@ Task *task_get_task (Window win)
    for (i=0 ; i < nb ; i++) {
       for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
          tsk = l0->data;
-         if (win == tsk->win) return tsk;
+         if (win == tsk->win) 
+            return tsk;
       }
    }
    return 0;
index badfa7f80146d4443d508e0066f375106819b4bb..a85771dd8875170b01548167700b3762a9a63865 100644 (file)
@@ -190,10 +190,12 @@ suite:
    // drag and drop task
    if (panel.task_drag) {
       if (tskbar != panel.task_drag->area.parent && action == TOGGLE_ICONIFY) {
-         windows_set_desktop(panel.task_drag->win, tskbar->desktop);
-         if (tskbar->desktop == server.desktop)
-            set_active(panel.task_drag->win);
-         panel.task_drag = 0;
+         if (!panel.task_drag->all_desktop && panel.mode == MULTI_DESKTOP) {
+            windows_set_desktop(panel.task_drag->win, tskbar->desktop);
+            if (tskbar->desktop == server.desktop)
+               set_active(panel.task_drag->win);
+            panel.task_drag = 0;
+         }
          return;
       }
       else panel.task_drag = 0;
@@ -249,7 +251,20 @@ void event_property_notify (Window win, Atom at)
       /* Change active */
       else if (at == server.atom._NET_ACTIVE_WINDOW) {
        if (panel.task_active) {
-               panel.task_active->area.is_active = 0;
+               if (panel.task_active->all_desktop) {
+               Task *tsk;
+               GSList *l0;
+               int i, nb;
+               nb = server.nb_desktop * server.nb_monitor;
+               for (i=0 ; i < nb ; i++) {
+                  for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+                     tsk = l0->data;
+                          tsk->area.is_active = 0;
+                  }
+               }
+            }
+            else
+                       panel.task_active->area.is_active = 0;
                panel.task_active = 0;
                        }
          Window w1 = window_get_active ();
@@ -260,7 +275,21 @@ void event_property_notify (Window win, Atom at)
                if (w2) t = task_get_task(w2);
          }
          if (t) {
-               t->area.is_active = 1;
+               if (t->all_desktop) {
+               Task *tsk;
+               GSList *l0;
+               int i, nb;
+               nb = server.nb_desktop * server.nb_monitor;
+               for (i=0 ; i < nb ; i++) {
+                  for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+                     tsk = l0->data;
+                     if (tsk->win == t->win)
+                               tsk->area.is_active = 1;
+                  }
+               }
+            }
+            else
+               t->area.is_active = 1;
                panel.task_active = t;
                        }
          panel.refresh = 1;
@@ -280,17 +309,49 @@ void event_property_notify (Window win, Atom at)
 
       /* Window title changed */
       if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) {
-         get_title(tsk);
-         tsk->area.redraw = 1;
+         if (tsk->all_desktop) {
+            Task *tsk2;
+            GSList *l0;
+            int i, nb;
+            nb = server.nb_desktop * server.nb_monitor;
+            for (i=0 ; i < nb ; i++) {
+               for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+                  tsk2 = l0->data;
+                  if (tsk->win == tsk2->win) {
+                     get_title(tsk2);
+                     tsk2->area.redraw = 1;
+                  }
+               }
+            }
+         }
+         else {
+            get_title(tsk);
+            tsk->area.redraw = 1;
+         }
          panel.refresh = 1;
       }
       /* Iconic state */
       else if (at == server.atom.WM_STATE) {
          if (window_is_iconified (win))
-            if (panel.task_active == tsk) {
-               tsk->area.is_active = 0;
-               panel.task_active = 0;
-                               }
+            if (panel.task_active) {
+               if (panel.task_active->win == tsk->win) {
+                  if (tsk->all_desktop) {
+                     Task *tsk2;
+                     GSList *l0;
+                     int i, nb;
+                     nb = server.nb_desktop * server.nb_monitor;
+                     for (i=0 ; i < nb ; i++) {
+                        for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
+                           tsk2 = l0->data;
+                           tsk2->area.is_active = 0;
+                        }
+                     }
+                  }
+                  else
+                     panel.task_active->area.is_active = 0;
+                  panel.task_active = 0;
+               }
+            }
       }
       /* Window icon changed */
       else if (at == server.atom._NET_WM_ICON) {
@@ -303,8 +364,24 @@ void event_property_notify (Window win, Atom at)
       }
       /* Window desktop changed */
       else if (at == server.atom._NET_WM_DESKTOP) {
-         add_task (tsk->win);
-         remove_task (tsk);
+         Window win2 = tsk->win;
+         if (tsk->all_desktop) {
+            Task *tsk2;
+            GSList *l0;
+            int i, nb;
+            nb = server.nb_desktop * server.nb_monitor;
+            for (i=0 ; i < nb ; i++) {
+               for (l0 = panel.taskbar[i].area.list; l0 ; ) {
+                  tsk2 = l0->data;
+                  l0 = l0->next;
+                  if (win2 == tsk2->win)
+                     remove_task (tsk2);
+               }
+            }
+         }
+         else
+            remove_task (tsk);
+         add_task (win);
          panel.refresh = 1;
       }
 
index 6bdf2d3e1c6d292f836a86f1c9969cd12e0e6b91..771467014466afe70644b38ad8686bcf2e9f92a6 100755 (executable)
Binary files a/src/tint2 and b/src/tint2 differ
index 91a6a763ed17c61d98e004853aec84cfa795e53b..fe8c647555521975584fc365a529c45f01165911 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <glib.h>
+#include <pango/pangocairo.h>
 
-#include "window.h"
-#include "server.h"
 #include "area.h"
+#include "server.h"
 
 
 void refresh (Area *a)
@@ -69,7 +68,7 @@ void draw (Area *a, int active)
 
    //printf("begin draw area\n");
    if (*pmap) XFreePixmap (server.dsp, *pmap);
-   *pmap = server_create_pixmap (a->width, a->height);
+   *pmap = XCreatePixmap (server.dsp, server.root_win, a->width, a->height, server.depth);
 
    // add layer of root pixmap
    XCopyArea (server.dsp, server.pmap, *pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
@@ -186,3 +185,24 @@ void free_area (Area *a)
    }
 }
 
+
+void draw_rect(cairo_t *c, double x, double y, double w, double h, double r)
+{
+   if (r > 0.0) {
+      double c1 = 0.55228475 * r;
+
+      cairo_move_to(c, x+r, y);
+      cairo_rel_line_to(c, w-2*r, 0);
+      cairo_rel_curve_to(c, c1, 0.0, r, c1, r, r);
+      cairo_rel_line_to(c, 0, h-2*r);
+      cairo_rel_curve_to(c, 0.0, c1, c1-r, r, -r, r);
+      cairo_rel_line_to (c, -w +2*r, 0);
+      cairo_rel_curve_to (c, -c1, 0, -r, -c1, -r, -r);
+      cairo_rel_line_to (c, 0, -h + 2 * r);
+      cairo_rel_curve_to (c, 0, -c1, r - c1, -r, r, -r);
+   }
+   else
+      cairo_rectangle(c, x, y, w, h);
+}
+
+
index 9a29ebd2ac07aeb446d1278affec11cd8cb8bd48..0294353e2571c640cbf3ef4e6bf05327a1874a15 100644 (file)
 #ifndef AREA_H
 #define AREA_H
 
+#include <glib.h>
 #include <X11/Xlib.h>
-#include <pango/pangocairo.h>
-
-#include "common.h"
+#include <cairo.h>
+#include <cairo-xlib.h>
 
 
 typedef struct
@@ -101,5 +101,8 @@ void remove_area (Area *a);
 void add_area (Area *a);
 void free_area (Area *a);
 
+// draw rounded rectangle
+void draw_rect(cairo_t *c, double x, double y, double w, double h, double r);
+
 #endif
 
index b265d6fcf08f6a90ba6d3f3016bdfa46ab514b9f..e60dc2c3bbf4637238a68caf863b81312b3bca0e 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+
 #include <Imlib2.h>
+#include <cairo.h>
+#include <cairo-xlib.h>
 
 #include "common.h"
 #include "window.h"
@@ -217,31 +220,12 @@ long *get_best_icon (long *data, int icon_count, int num, int *iw, int *ih, int
 }
 
 
-void draw_rect(cairo_t *c, double x, double y, double w, double h, double r)
-{
-   if (r > 0.0) {
-      double c1 = 0.55228475 * r;
-
-      cairo_move_to(c, x+r, y);
-      cairo_rel_line_to(c, w-2*r, 0);
-      cairo_rel_curve_to(c, c1, 0.0, r, c1, r, r);
-      cairo_rel_line_to(c, 0, h-2*r);
-      cairo_rel_curve_to(c, 0.0, c1, c1-r, r, -r, r);
-      cairo_rel_line_to (c, -w +2*r, 0);
-      cairo_rel_curve_to (c, -c1, 0, -r, -c1, -r, -r);
-      cairo_rel_line_to (c, 0, -h + 2 * r);
-      cairo_rel_curve_to (c, 0, -c1, r - c1, -r, r, -r);
-   }
-   else
-      cairo_rectangle(c, x, y, w, h);
-}
-
-
 void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len)
 {
    PangoRectangle rect_ink, rect;
 
-   Pixmap pmap = server_create_pixmap (panel_height, panel_height);
+   Pixmap pmap = XCreatePixmap (server.dsp, server.root_win, panel_height, panel_height, server.depth);
+
    cairo_surface_t *cs = cairo_xlib_surface_create (server.dsp, pmap, server.visual, panel_height, panel_height);
    cairo_t *c = cairo_create (cs);
    
index fd596c06e795bed023f84cede9202474ff5b76b4..8f3bba3b2e5cd210bc988f3560e799837cb089f2 100644 (file)
@@ -9,8 +9,6 @@
 #ifndef WINDOW_H
 #define WINDOW_H
 
-#include <cairo.h>
-#include <cairo-xlib.h>
 #include <pango/pangocairo.h>
 
 
@@ -37,9 +35,6 @@ void windows_set_desktop (Window win, int desktop);
 int window_get_monitor (Window win);
 Window window_get_active ();
 
-// draw rounded rectangle
-void draw_rect(cairo_t *c, double x, double y, double w, double h, double r);
-
 void get_text_size(PangoFontDescription *font, int *height_ink, int *height, int panel_height, char *text, int len);
 
 
This page took 0.035747 seconds and 4 git commands to generate.