]> Dogcows Code - chaz/tint2/commitdiff
fixed bugs with new design (first step)
authorThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 8 Nov 2008 20:23:42 +0000 (20:23 +0000)
committerThierry Lorthiois <lorthiois@bbsoft.fr>
Sat, 8 Nov 2008 20:23:42 +0000 (20:23 +0000)
15 files changed:
ChangeLog
src/clock/clock.c
src/clock/clock.h
src/config.c
src/panel.c
src/panel.h
src/server.c
src/taskbar/task.c
src/taskbar/task.h
src/taskbar/taskbar.c
src/taskbar/taskbar.h
src/tint.c
src/tint2
src/util/area.c
src/util/area.h

index 4004d8082ca94964a3c7c6102e175d6eb6468310..2a19b34faf11ba62fee91095a8c7f9a807004d9d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,13 @@
 
+
+
+2008-11-02
+- fixed bugs with new design
+- panel.area manage the tree of visible objects
+
 2008-10-28
 - fixed issue : "untitled task", "task button did not update", "window don't shade",
-  "error if I don't do 'make install", "Makefile error"
+  "error if I don't do 'make install'", "Makefile error"
 
 2008-09-24
 - change tintrc format
index f91e969192d0a145b41e04ac29c01a9cf07d3495..fb5969b6c48e5837e5358e1f578f910ee5ae763e 100644 (file)
@@ -27,6 +27,7 @@
 #include "server.h"
 #include "area.h"
 #include "clock.h"
+#include "panel.h"
 
 
 void init_clock(Clock *clock, int panel_height)
@@ -40,6 +41,10 @@ void init_clock(Clock *clock, int panel_height)
    if (strchr(clock->time1_format, 'S') == NULL) clock->time_precision = 60;
    else clock->time_precision = 1;
    
+   clock->area.posy = panel.area.border.width + panel.area.paddingy;
+   clock->area.height = panel.area.height - (2 * clock->area.posy);
+   clock->area.redraw = 1;      
+
    gettimeofday(&clock->clock, 0);
    clock->clock.tv_sec -= clock->clock.tv_sec % clock->time_precision;
    
@@ -72,6 +77,8 @@ int draw_foreground_clock (void *obj, cairo_t *c)
    if (clock->time2_format)
       strftime(buf_date, sizeof(buf_date), clock->time2_format, localtime(&clock->clock.tv_sec));
 
+   //printf("  draw_foreground_clock : %s\n", buf_time);
+redraw:
    layout = pango_cairo_create_layout (c);
 
    // check width
@@ -90,11 +97,14 @@ int draw_foreground_clock (void *obj, cairo_t *c)
    new_width += (2*clock->area.paddingx) + (2*clock->area.border.width);
    
    if (new_width > clock->area.width || (new_width != clock->area.width && date_width > time_width)) {
-      printf("clock_width %d, new_width %d\n", clock->area.width, new_width);
+      //printf("clock_width %d, new_width %d\n", clock->area.width, new_width);
+      // resize clock
       clock->area.width = new_width;
+      panel.clock.area.posx = panel.area.width - panel.clock.area.width - panel.area.paddingx - panel.area.border.width;
       
       g_object_unref (layout);
-      return 1;
+      resize_taskbar();
+      goto redraw;
    }
 
    // draw layout
index 0d3e9e1309caf14429b2156c58a47a08f44032cf..53c4969492c580ff3bbdf86da02fb68a774b80b5 100644 (file)
@@ -13,7 +13,6 @@
 
 
 typedef struct Clock {
-   // --------------------------------------------------
    // always start with area
    Area area;
 
index c38cfec074ab9979c6d29983499ce86eebb96e5b..850fbc9e99cbb7ee20d7abb81ec89b4918eca8e3 100644 (file)
 
 
 void cleanup_taskbar() 
-{
-   Task *tsk;
-   Taskbar *tskbar;
-   GSList *l0;
-   for (l0 = panel.area.list; l0 ; l0 = l0->next) {
-      tskbar = l0->data;
-      GSList *l1;
-      for (l1 = tskbar->area.list; l1 ; l1 = l1->next) {
-         tsk = l1->data;
+{   
+   free_area(&panel.area);
+
+   int i, nb;
+   Task *tsk, *next;
+
+   nb = panel.nb_desktop * panel.nb_monitor;
+   for (i=0 ; i < nb ; i++) {
+/* TODO: voir ce code !!
+      for (tsk = panel.taskbar[i].tasklist; tsk ; tsk = next) {
+         next = tsk->next;
          remove_task (tsk);
       }
-      g_slist_free(tskbar->area.list);
+*/
    }
-   g_slist_free(panel.area.list);
-   panel.area.list = 0;
+
+   free(panel.taskbar);
+   panel.taskbar = 0;
 }
 
 
@@ -69,7 +72,7 @@ void cleanup ()
    if (g_task.font_desc) pango_font_description_free(g_task.font_desc);
    if (panel.clock.time1_font_desc) pango_font_description_free(panel.clock.time1_font_desc);
    if (panel.clock.time2_font_desc) pango_font_description_free(panel.clock.time2_font_desc);
-   cleanup_taskbar();
+   if (panel.taskbar) cleanup_taskbar();
    if (panel.clock.time1_format) g_free(panel.clock.time1_format);
    if (panel.clock.time2_format) g_free(panel.clock.time2_format);
    if (server.monitor) free(server.monitor);
@@ -473,37 +476,31 @@ void config_taskbar()
       fprintf(stderr, "tint2 warning : cannot found number of desktop.\n");
    }
 
-   cleanup_taskbar();
+   if (panel.taskbar) cleanup_taskbar();
    
    panel.nb_desktop = server.nb_desktop;
    if (panel.mode == MULTI_MONITOR) panel.nb_monitor = server.nb_monitor;
    else panel.nb_monitor = 1;
-   // TODO: mémoriser le pointeur sur la première
-   // malgré l'apparant désordre, les taskbars sont ordonnées
-   Taskbar *new_tskbar;
+   panel.taskbar = calloc(panel.nb_desktop * panel.nb_monitor, sizeof(Taskbar));
+   g_slist_free(panel.area.list);
+   panel.area.list = 0;
+
+   Taskbar *tskbar;
    for (i=0 ; i < panel.nb_desktop ; i++) {
       for (j=0 ; j < panel.nb_monitor ; j++) {
-         new_tskbar = calloc(1, sizeof(Taskbar));
-         memcpy(&new_tskbar->area, &g_taskbar, sizeof(Area));
-         new_tskbar->desktop = i;
-         new_tskbar->monitor = j;
+         tskbar = &panel.taskbar[index(i,j)];
+         memcpy(&tskbar->area, &g_taskbar, sizeof(Area));
+         tskbar->desktop = i;
+         tskbar->monitor = j;
          
-         panel.area.list = g_slist_append(panel.area.list, new_tskbar);
+         // TODO: redefinir panel.area.list en fonction des objets visibles
+         panel.area.list = g_slist_append(panel.area.list, tskbar);
       }
    }
-   /*
-   comment faire pour parcourir les barres de taches ? on ne peut pas se baser sur l'ordre des éléments !!
-   a t'on besoin de parcourir les barres de taches ?? OUI !! bof ??
-   => resize_taskbar() dans panel.c => 
-   => task_refresh_tasklist () dans taskbar.c
-   => Task *task_get_task (Window win) dans taskbar.c
-   => event_button_press (int x, int y) dans tint.c => area->event_button_press() est conseillé !!
-   cela enlève aussi l'organisation des barres de taches en tableau à 2 dimensions
-   il est possible de mémoriser un pointeur sur la première barre de taches
-*/
+   if (panel.clock.time1_format)
+      panel.area.list = g_slist_append(panel.area.list, &panel.clock);
    
-   //printf("tasbar (desktop x monitor) : (%d x %d)\n", panel.nb_desktop, panel.nb_monitor);
+   //printf("taskbar (desktop x monitor) : (%d x %d)\n", panel.nb_desktop, panel.nb_monitor);
    resize_taskbar();
    task_refresh_tasklist ();
    panel.refresh = 1;
@@ -529,7 +526,7 @@ void config_finish ()
       if (!server.monitor[panel.monitor].width || !server.monitor[panel.monitor].height) 
          fprintf(stderr, "tint2 error : invalid monitor size.\n");
    }
-      
+
    if (!panel.area.width) panel.area.width = server.monitor[panel.monitor].width;
    
    // taskbar
@@ -551,9 +548,6 @@ void config_finish ()
       panel.area.border.rounded = panel.area.height/2;
 
    // clock
-   panel.clock.area.posy = panel.area.border.width + panel.area.paddingy;
-   panel.clock.area.height = panel.area.height - (2 * panel.clock.area.posy);
-   panel.clock.area.redraw = 1;      
    init_clock(&panel.clock, panel.area.height);
 
    // compute vertical position : text and icon
@@ -569,7 +563,8 @@ void config_finish ()
    }
    
    config_taskbar();
-   
+   visible_object();
+
    // cleanup background list
    GSList *l0;
    for (l0 = list_back; l0 ; l0 = l0->next) {
index 208922ce999ca284682fcc436297e82b4e8dfd0a..f3bd2beaf5176330452c0f34b67315362a8fb25a 100644 (file)
 
 void visual_refresh ()
 {
-   server_refresh_root_pixmap ();
-   
-   draw (&panel.area);
-   refresh (&panel.area);
+   if (!server.root_pmap) {
+      Pixmap wall = get_root_pixmap();
+
+      server.root_pmap = server_create_pixmap (panel.area.width, panel.area.height);
+
+      XCopyArea (server.dsp, wall, server.root_pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0);
    
-   if (panel.clock.time1_format) {
-      if (panel.clock.area.redraw)
-         panel.refresh = 1;
-      if (draw (&panel.clock.area)) {
-         panel.clock.area.redraw = 1;
-         draw (&panel.clock.area);
-         resize_clock();
-         resize_taskbar();
-         redraw(&panel.area);
-      }
-      refresh (&panel.clock.area);
+      redraw (&panel.area);
    }
+   
+   if (server.pmap) XFreePixmap (server.dsp, server.pmap);
+   server.pmap = server_create_pixmap (panel.area.width, panel.area.height);
 
-   // TODO: ne pas afficher les taskbar invisibles
-   //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue;
-   Task *tsk;
-   Taskbar *tskbar;
-   GSList *l0;
-   for (l0 = panel.area.list; l0 ; l0 = l0->next) {
-      tskbar = l0->data;
-      draw (&tskbar->area);
-      refresh (&tskbar->area);
-      
-      GSList *l1;
-      for (l1 = tskbar->area.list; l1 ; l1 = l1->next) {
-         tsk = l1->data;
-         draw(&tsk->area);
+   XCopyArea (server.dsp, server.root_pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
          
-         if (tsk == panel.task_active) refresh (&tsk->area_active);
-         else refresh (&tsk->area);
-      }
-   }
+   draw (&panel.area);
 
    XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
    XFlush(server.dsp);
@@ -103,9 +82,9 @@ void set_panel_properties (Window win)
       struts[10] = server.posx;
       struts[11] = server.posx + panel.area.width;
    }
-   XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
-   // Old specification
+   // Old specification : fluxbox need _NET_WM_STRUT.
    XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4);
+   XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
    
    // Sticky and below other window
    val = 0xFFFFFFFF;
@@ -163,50 +142,29 @@ void window_draw_panel ()
 }
 
 
-void resize_clock()
+void visible_object()
 {
-   panel.clock.area.posx = panel.area.width - panel.clock.area.width - panel.area.paddingx - panel.area.border.width;
-}
-
-
-// initialise taskbar posx and width
-void resize_taskbar()
-{
-   int taskbar_width, modulo_width, taskbar_on_screen;
+   if (panel.area.list) {
+      g_slist_free(panel.area.list);
+      panel.area.list = 0;   
+   }
 
-   if (panel.mode == MULTI_DESKTOP) taskbar_on_screen = panel.nb_desktop;
-   else taskbar_on_screen = panel.nb_monitor;
-   
-   taskbar_width = panel.area.width - (2 * panel.area.paddingx) - (2 * panel.area.border.width);
-   if (panel.clock.time1_format) 
-      taskbar_width -= (panel.clock.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 posx, modulo, i;
-   Taskbar *tskbar;
-   GSList *l0;
-   for (i = 0, l0 = panel.area.list; l0 ; i++, l0 = l0->next) {
-      if ((i % taskbar_on_screen) == 0) {
-         posx = panel.area.border.width + panel.area.paddingx;
-         modulo = modulo_width;
-      }
-      else posx += taskbar_width + panel.area.paddingx;
-
-      tskbar = l0->data;      
-      tskbar->area.posx = posx;
-      tskbar->area.width = taskbar_width;
-      if (modulo) {
-         tskbar->area.width++;
-         modulo--;
+   // list of visible objects
+   // start with clock because draw(clock) can resize others object
+   if (panel.clock.time1_format)
+      panel.area.list = g_slist_append(panel.area.list, &panel.clock);
+
+   int i, j;
+   Taskbar *taskbar;
+   for (i=0 ; i < panel.nb_desktop ; i++) {
+      for (j=0 ; j < panel.nb_monitor ; j++) {
+         taskbar = &panel.taskbar[index(i,j)];
+         if (panel.mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) continue;
+         
+         panel.area.list = g_slist_append(panel.area.list, taskbar);
       }
-
-      resize_tasks(tskbar);
    }
+   panel.refresh = 1;
 }
 
 
index 1acd611521069ded3d619ab34e3e9d76aea2bd8e..54a74e9792c356c820d20684d869bbbe446112c9 100644 (file)
@@ -26,7 +26,6 @@ enum { LEFT=0x01, RIGHT=0x02, CENTER=0X04, TOP=0X08, BOTTOM=0x10 };
 
 
 typedef struct {
-   // --------------------------------------------------
    // always start with area
    Area area;
 
@@ -49,7 +48,7 @@ typedef struct {
 
    // --------------------------------------------------
    // taskbar point to the first taskbar in panel.area.list. number of tasbar == nb_desktop x nb_monitor.
-   //Taskbar *taskbar;
+   Taskbar *taskbar;
    int mode;
    int nb_desktop;
    int nb_monitor;
@@ -78,8 +77,7 @@ Panel panel;
 void visual_refresh ();
 void set_panel_properties (Window win);
 void window_draw_panel ();
-void resize_clock();
-void resize_taskbar();
+void visible_object();
 
 
 #endif
index 3f75f21c817decb8eb6acbeef83aa78c2cecc358..2c34415d5660cc6223889f3f888cd45b9ddca56b 100644 (file)
@@ -191,24 +191,6 @@ Pixmap get_root_pixmap ()
 }  
 */
 
-void server_refresh_root_pixmap ()
-{
-   if (!server.root_pmap) {
-      Pixmap wall = get_root_pixmap();
-
-      server.root_pmap = server_create_pixmap (panel.area.width, panel.area.height);
-
-      XCopyArea (server.dsp, wall, server.root_pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0);
-   
-      panel.area.redraw = 1;
-   }
-   
-   if (server.pmap) XFreePixmap (server.dsp, server.pmap);
-   server.pmap = server_create_pixmap (panel.area.width, panel.area.height);
-
-   XCopyArea (server.dsp, server.root_pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
-}
-
 
 void get_monitors()
 {
index f0b9924caff8e1f440505439f1ff9a48368dc99b..3c4e6ed3d11d13e82dc607b097f6e2094d9e8047 100644 (file)
@@ -68,11 +68,11 @@ void add_task (Window win)
    }
    
    Taskbar *tskbar;
-   tskbar = g_slist_nth_data(panel.area.list, index(desktop, monitor));      
+   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)) 
+   if (resize_tasks (tskbar))
       redraw (&tskbar->area);
 }
 
@@ -263,7 +263,8 @@ int draw_foreground_task (void *obj, cairo_t *c)
    Task *tsk = obj;
    cairo_surface_t *cs;
    cairo_t *ca;
-   
+   //printf("  draw_foreground_task\n");
+
    draw_task_title (c, tsk, 0);
 
    // draw active pmap
index bab6c74e7217fbeb155ba976c83f7221b17c1fea..b0c445ac0349f550a9aec5af466d85b33244c450 100644 (file)
@@ -17,6 +17,7 @@
 typedef struct {
    Area area;
    Area area_active;
+   Area area_inactive;
    
    int text;
    int icon;
@@ -38,10 +39,10 @@ typedef struct {
 // --------------------------------------------------
 // task parameter
 typedef struct {
-   // --------------------------------------------------
    // always start with area
    Area area;
    Area area_active;
+   Area area_inactive;
 
    // TODO: group task with list of windows here
    Window win;
index 05ba366a152a94888f9fa1bfd3f690cb9f35810c..db08f6da2cfdae821058445326fbe847a3729f5c 100644 (file)
 
 Task *task_get_task (Window win)
 {
-   Taskbar *tskbar;
    Task *tsk;
    GSList *l0;
+   int i, nb;
    
-   for (l0 = panel.area.list; l0 ; l0 = l0->next) {
-      tskbar = l0->data;
-      GSList *l1;
-      for (l1 = tskbar->area.list; l1 ; l1 = l1->next) {
-         tsk = l1->data;
+   nb = panel.nb_desktop * panel.nb_monitor;
+   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;
       }
    }
-   
-   //   nb = panel.nb_desktop * panel.nb_monitor;
-   //printf("task_get_task return 0\n");
    return 0;
 }
 
@@ -57,24 +53,22 @@ Task *task_get_task (Window win)
 void task_refresh_tasklist ()
 {
    Window *win, active_win;
-   int num_results, i, j;
+   int num_results, i, j, nb;
+   GSList *l0;
+   Task *tsk;
 
    win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
 
    if (!win) return;
    
-   /* Remove any old and set active win */
+   // Remove any old and set active win
    active_win = window_get_active ();
 
-   Task *tsk;
-   Taskbar *tskbar;
-   GSList *l0;
-   for (l0 = panel.area.list; l0 ; l0 = l0->next) {
-      tskbar = l0->data;
-      GSList *l1;
-      for (l1 = tskbar->area.list; l1 ; l1 = l1->next) {
-         tsk = l1->data;
-
+   nb = panel.nb_desktop * panel.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 == active_win) panel.task_active = tsk;
          
          for (j = 0; j < num_results; j++) {
@@ -83,11 +77,11 @@ void task_refresh_tasklist ()
          if (tsk->win != win[j]) remove_task (tsk);
       }
    }
-   
-   /* Add any new */
-   for (i = 0; i < num_results; i++) {
-      if (!task_get_task (win[i])) add_task (win[i]);
-   }
+
+   // Add any new
+   for (i = 0; i < num_results; i++) 
+      if (!task_get_task (win[i])) 
+         add_task (win[i]);
 
    XFree (win);
 }
@@ -141,3 +135,42 @@ int resize_tasks (Taskbar *taskbar)
 }
 
 
+// initialise taskbar posx and width
+void resize_taskbar()
+{
+   int taskbar_width, modulo_width, taskbar_on_screen;
+
+   if (panel.mode == MULTI_DESKTOP) taskbar_on_screen = panel.nb_desktop;
+   else taskbar_on_screen = panel.nb_monitor;
+   
+   taskbar_width = panel.area.width - (2 * panel.area.paddingx) - (2 * panel.area.border.width);
+   if (panel.clock.time1_format) 
+      taskbar_width -= (panel.clock.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 posx, modulo, i, nb;
+   nb = panel.nb_desktop * panel.nb_monitor;
+   for (i=0 ; i < nb ; i++) {
+      if ((i % taskbar_on_screen) == 0) {
+         posx = panel.area.border.width + panel.area.paddingx;
+         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--;
+      }
+      
+      resize_tasks(&panel.taskbar[i]);
+   }
+}
+
+
index 3b3560da4d14b09e5fa4ed1041ee07d66a52848f..b35c60ff114b3172688685663f8463a20788008c 100644 (file)
@@ -8,7 +8,6 @@
 // --------------------------------------------------
 // taskbar parameter
 typedef struct {
-   // --------------------------------------------------
    // always start with area
    Area area;
 
@@ -33,6 +32,8 @@ void task_refresh_tasklist ();
 // return 1 if task_width changed
 int resize_tasks (Taskbar *tskbar);
 
+void resize_taskbar();
+
 //void add_taskbar(Area *a);
 
 #endif
index 56cbc1ce541f3cb018af6af7bd25a40980cc0cda..b0959ec8f9630d9bb845a8ca1e0fbe66525fc6fe 100644 (file)
@@ -158,6 +158,8 @@ void event_button_press (int x, int y)
 void event_button_release (int button, int x, int y)
 {
    int action = TOGGLE_ICONIFY;
+   // TODO: convert event_button_press(int x, int y) to area->event_button_press()
+   // if systray is ok
 
    switch (button) {
       case 2:
@@ -173,9 +175,6 @@ void event_button_release (int button, int x, int y)
          action = panel.mouse_scroll_down;
          break;
    }
-
-   // TODO: ne pas afficher les taskbar invisibles
-   //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue;
    
    // search taskbar
    Taskbar *tskbar;
@@ -237,13 +236,15 @@ void event_property_notify (Window win, Atom at)
       /* Change number of desktops */
       else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) {
          config_taskbar();
+         visible_object();
          redraw(&panel.area);
-         panel.refresh = 1;
       }
       /* Change desktop */
       else if (at == server.atom._NET_CURRENT_DESKTOP) {
          server.desktop = server_get_current_desktop ();
-         if (panel.mode != MULTI_DESKTOP) panel.refresh = 1;
+         if (panel.mode != MULTI_DESKTOP) {
+            visible_object();
+         }
       }
       /* Window list */
       else if (at == server.atom._NET_CLIENT_LIST) {
@@ -313,20 +314,14 @@ void event_configure_notify (Window win)
 
    tsk = task_get_task (win);
    if (!tsk) return;
-
-/* TODO ??? voir ancien code !!
-   Taskbar *tskbar;
-   tskbar = tsk->area.parent;
-   int new_monitor = window_get_monitor (win);
-   int desktop = tskbar->desktop;
    
-   // task on the same monitor
-   if (tsk->id_taskbar == index(desktop, new_monitor)) return;
-   
-   add_task (tsk->win);
-   remove_task (tsk);
-   panel.refresh = 1;
-   */
+   Taskbar *tskbar = tsk->area.parent;
+   if (tskbar->monitor != window_get_monitor (win)) {   
+      // task on another monitor
+      add_task (tsk->win);
+      remove_task (tsk);
+      panel.refresh = 1;
+   }
 }
 
 
@@ -375,6 +370,9 @@ load_config:
    config_finish ();
    
    window_draw_panel ();
+   
+   // BUG: draw(clock) is needed here, but 'on the paper' it's not necessary.
+   draw(&panel.clock.area);
 
    x11_fd = ConnectionNumber (server.dsp);
    XSync (server.dsp, False);
index ab391d4abcc4473b3b55534ae2f627fc36f63597..ee44748c48f822df15c394af9307407a623935a2 100755 (executable)
Binary files a/src/tint2 and b/src/tint2 differ
index 2f44cf5b24eb8440672f169070d2a84ac7699f84..c1347a195a94822201a8c8ef62a8f53717b81bd8 100644 (file)
@@ -30,7 +30,6 @@
 #include "area.h"
 
 
-
 void redraw (Area *a)
 {
    a->redraw = 1;
@@ -43,34 +42,41 @@ void redraw (Area *a)
 
 int draw (Area *a)
 {
-   if (!a->redraw) return 0;
-
    cairo_surface_t *cs;
    cairo_t *c;
    int ret = 0;
 
-   if (a->pmap) XFreePixmap (server.dsp, a->pmap);
-   a->pmap = server_create_pixmap (a->width, a->height);
+   if (a->redraw) {
+      //printf("begin draw area\n");
+      if (a->pmap) XFreePixmap (server.dsp, a->pmap);
+      a->pmap = server_create_pixmap (a->width, a->height);
 
-   // add layer of root pixmap
-   XCopyArea (server.dsp, server.pmap, a->pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
+      // add layer of root pixmap
+      XCopyArea (server.dsp, server.pmap, a->pmap, server.gc, a->posx, a->posy, a->width, a->height, 0, 0);
 
-   cs = cairo_xlib_surface_create (server.dsp, a->pmap, server.visual, a->width, a->height);
-   c = cairo_create (cs);
+      cs = cairo_xlib_surface_create (server.dsp, a->pmap, server.visual, a->width, a->height);
+      c = cairo_create (cs);
 
-   draw_background (a, c);
-   
-   if (a->draw_foreground) {
-      ret = a->draw_foreground(a, c);
+      draw_background (a, c);
+      
+      if (a->draw_foreground)
+         ret = a->draw_foreground(a, c);
+
+      cairo_destroy (c);
+      cairo_surface_destroy (cs);
+      a->redraw = 0;
    }
-   else {
-      // parcours de la liste des sous objets
+   
+   XCopyArea (server.dsp, a->pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
+   
+   GSList *l = a->list;
+   if (l) {
+      // draw child object
+      for (; l ; l = l->next)
+         draw(l->data);
    }
 
-   cairo_destroy (c);
-   cairo_surface_destroy (cs);
-   a->redraw = 0;
-   
+   //printf("end draw area\n");
    return ret;
 }
 
@@ -153,12 +159,6 @@ void draw_background (Area *a, cairo_t *c)
 }
 
 
-void refresh (Area *a)
-{
-   XCopyArea (server.dsp, a->pmap, server.pmap, server.gc, 0, 0, a->width, a->height, a->posx, a->posy);
-}
-
-
 void remove_area (Area *a)
 {
    Area *parent;
@@ -180,3 +180,16 @@ void add_area (Area *a)
 
 }
 
+
+void free_area (Area *a)
+{
+   GSList *l0;
+   for (l0 = a->list; l0 ; l0 = l0->next) 
+      free_area (l0->data);
+
+   if (a->list) {
+      g_slist_free(a->list);
+      a->list = 0;   
+   }
+}
+
index 1dc6f1873bf5dfe95a654acf2d6bc247b6c1731e..5be636f524362a2c679d25c134d83d023b40d48d 100644 (file)
@@ -7,8 +7,8 @@
 * Area manage the background and border drawing, size and padding.
 * Area manage also the tree of visible objects
 *   panel -> taskbars -> tasks
-*         -> clock
 *         -> systray -> icons
+*         -> clock
 * 
 * un objet comprend les actions:
 * 1) redraw(obj)
@@ -110,7 +110,7 @@ typedef struct {
    void (*add_child)(void *obj);
    int (*remove_child)(void *obj);
    
-   // list of child
+   // list of child : Area object
    GSList *list;
 } Area;
 
@@ -123,9 +123,9 @@ void redraw (Area *a);
 int  draw (Area *a);
 void draw_background (Area *a, cairo_t *c);
 
-void refresh (Area *a);
 void remove_area (Area *a);
 void add_area (Area *a);
+void free_area (Area *a);
 
 #endif
 
This page took 0.04683 seconds and 4 git commands to generate.