]> Dogcows Code - chaz/tint2/blobdiff - src/taskbar/task.c
patch from Robert Escriva and fixed MULTI_MONITOR mode with task_on_all_desktop
[chaz/tint2] / src / taskbar / task.c
index 7b523916156681d3ba4b07e69a15f00f496d48d8..aaebcbf24f40ca32d9ad5f3693ff69b77a32841c 100644 (file)
 void add_task (Window win)
 {
    Task *new_tsk;
-   int desktop, monitor;
+   int desktop, monitor, all_desktop;
 
-   if (!win || window_is_hidden (win) || win == window.main_win) return;
+   if (!win) return;
+   if (window_is_hidden (win) || win == window.main_win) return;
 
+   desktop = window_get_desktop (win);
+   if (desktop == 0xFFFFFFFF) {
+      desktop = 0;
+      all_desktop = 1;
+   }
+   else
+      all_desktop = 0;
+
+   if (panel.mode == MULTI_MONITOR) monitor = window_get_monitor (win);
+   else monitor = 0;
+
+deb:
    new_tsk = malloc(sizeof(Task));
    new_tsk->win = win;
+   new_tsk->all_desktop = all_desktop;
    new_tsk->title = 0;
    new_tsk->icon_data = 0;
 
    get_icon(new_tsk);
    get_title(new_tsk);
    memcpy(&new_tsk->area, &g_task.area, sizeof(Area));
-   desktop = window_get_desktop (new_tsk->win);
-   monitor = window_get_monitor (new_tsk->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);
 
-   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;
-   }
-
-   //printf("add_task %d  %s\n", index(desktop, monitor), new_tsk->title);
-   Taskbar *tskbar;
-   tskbar = &panel.taskbar[index(desktop, monitor)];
+   Taskbar *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 (all_desktop) {
+      desktop++;
+      if (desktop < server.nb_desktop)
+         goto deb;
+   }
 }
 
 
 void remove_task (Task *tsk)
 {
    if (!tsk) return;
-
+   
+   Task *tsk2 = tsk;
    Taskbar *tskbar;
-   tskbar = (Taskbar*)tsk->area.parent;
-   tskbar->area.list = g_slist_remove(tskbar->area.list, tsk);
+   Window win = tsk->win;
+   int desktop = 0, all_desktop = tsk->all_desktop;
+   int monitor = ((Taskbar*)tsk->area.parent)->monitor;
+   
+deb:   
+   if (all_desktop) {
+      tskbar = &panel.taskbar[index(desktop, monitor)];
+      GSList *l0;
+      for (l0 = tskbar->area.list; l0 ; ) {
+         tsk2 = l0->data;
+         l0 = l0->next;
+         if (win == tsk2->win)
+            break;
+      }
+   }
+   else 
+      tskbar = (Taskbar*)tsk->area.parent;
+   
+   tskbar->area.list = g_slist_remove(tskbar->area.list, tsk2);
    resize_tasks (tskbar);
    set_redraw (&tskbar->area);
    //printf("remove_task %d  %s\n", index(tskbar->desktop, tskbar->monitor), tsk->title);
 
-   if (tsk->title) {
-      free (tsk->title);
-      tsk->title = 0;
-   }
-   if (tsk->icon_data) {
-      free (tsk->icon_data);
-      tsk->icon_data = 0;
+   if (tsk2 == panel.task_active) 
+       panel.task_active = 0;
+   if (tsk2 == panel.task_drag) 
+       panel.task_drag = 0;
+
+   if (tsk2->title) 
+      free (tsk2->title);
+   if (tsk2->icon_data) 
+      free (tsk2->icon_data);
+
+   XFreePixmap (server.dsp, tsk2->area.pix.pmap);
+   XFreePixmap (server.dsp, tsk2->area.pix_active.pmap);
+   free(tsk2);
+   
+   if (all_desktop) {
+      desktop++;
+      if (desktop < server.nb_desktop)
+         goto deb;
    }
-   XFreePixmap (server.dsp, tsk->area.pix.pmap);
-   XFreePixmap (server.dsp, tsk->area.pix_active.pmap);
-   free(tsk);
 }
 
 
@@ -162,12 +187,12 @@ void get_icon (Task *tsk)
       XFree (data);
    }
    else {
+      printf("get_icon vide\n");
       //XWMHints *hints;
       //hints = XGetWMHints(server.dsp, tkwin);
       //if (hints != NULL) {
       //   XFree(hints);
       //}
-      printf("get_icon vide\n");
       // XChangeProperty (display, windowH, XInternAtom (display, "_NET_WM_ICON", False), XA_CARDINAL, 32, PropModeReplace, (unsigned char*) data, dataSize);
       return;
    }
This page took 0.023427 seconds and 4 git commands to generate.