]> Dogcows Code - chaz/tint2/blobdiff - src/panel.c
WM menu in left and right padding
[chaz/tint2] / src / panel.c
index 2e1c2283928f2dd69c4a7566cc0da531cdd27162..b9cbcf2dd341dda20a266143aa7fc3886df241b3 100644 (file)
 
 void visual_refresh ()
 {
-   server_refresh_root_pixmap ();
+   if (!panel.area.pmap)
+      set_panel_background(); 
    
-   draw (&panel.area);
-   refresh (&panel.area);
-   
-/*
-pour version 0.7
-gestion du systray
-  positionnement et taille fixe du systray (objet systray)
-  détection des notifications (détection des icones, ajout a la liste)
-  ajouter la transparence des icones
-  gérer le redimentionnement des éléments
-    => voir si lon peut faire abstraction sur le positionnement des objets ?
-       sachant que certains objets (task, taskbar) on une taille définit par l'extérieur
-       et d'autres objets (clock, systray) on une taille définit par l'intérieur
-
-gestion du layout 
-  voir le positionnement des taskbar, task et systray
-  définir panel_layout dans la configuration
-  comment gérer le multi panel avec des layouts différents
-
-vérifier le niveau d'abstraction du code
-  utiliser la fonction draw(obj) récurrente sur Taskbar, Task, Systray, Clock
-  est ce compatible avec l'affichage de la tache active et les changement de taille -> redessine le panel
-
-correction de bugs : 
-  memory, segfault
-  background
-  remettre en place single_desktop avec nouveau layout
-  remettre en place multi_monitor avec nouveau layout
-  vérifier le changement de configuration
-
-pour version 0.8
-gestion du thème
-  voir la gestion du dégradé sur le bord et le fond (inkscape)
-  faut-il trois coordonnées de padding x, y, x inter-objects
-
-gestion du zoom  
-  définir le zoom du panel
-
-*/
-
-   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);
-   }
+   if (server.pmap) XFreePixmap (server.dsp, server.pmap);
+   server.pmap = server_create_pixmap (panel.area.width, panel.area.height);
+   XCopyArea (server.dsp, panel.area.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
 
-   // 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);
-         
-         if (tsk == panel.task_active) refresh (&tsk->area_active);
-         else refresh (&tsk->area);
-      }
-   }
+   // draw child object
+   GSList *l = panel.area.list;
+   for (; l ; l = l->next)
+      draw (l->data);
 
-   XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
-   XFlush(server.dsp);
+   // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right.
+   XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingx, 0, panel.area.width-(2*panel.area.paddingx), panel.area.height, 0, 0);
+   XFlush (server.dsp);
    panel.refresh = 0;
 }
 
@@ -140,9 +78,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;
@@ -183,9 +121,10 @@ void window_draw_panel ()
    /* Catch some events */
    XSetWindowAttributes att = { ParentRelative, 0L, 0, 0L, 0, 0, Always, 0L, 0L, False, ExposureMask|ButtonPressMask|ButtonReleaseMask, NoEventMask, False, 0, 0 };
                
-   /* XCreateWindow(display, parent, x, y, w, h, border, depth, class, visual, mask, attrib) */
+   // XCreateWindow(display, parent, x, y, w, h, border, depth, class, visual, mask, attrib)
+   // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right.
    if (window.main_win) XDestroyWindow(server.dsp, window.main_win);
-   win = XCreateWindow (server.dsp, server.root_win, server.posx, server.posy, panel.area.width, panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att);
+   win = XCreateWindow (server.dsp, server.root_win, server.posx+panel.area.paddingx, server.posy, panel.area.width-(2*panel.area.paddingx), panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att);
 
    set_panel_properties (win);
    window.main_win = win;
@@ -194,56 +133,65 @@ void window_draw_panel ()
    if (server.gc) XFree(server.gc);
    XGCValues gcValues;
    server.gc = XCreateGC(server.dsp, win, (unsigned long) 0, &gcValues);
-   
+   if (server.gc_root) XFree(server.gc_root);
+   server.gc_root = XCreateGC(server.dsp, server.root_win, (unsigned long) 0, &gcValues);
+
    XMapWindow (server.dsp, win);
    XFlush (server.dsp);
 }
 
 
-void resize_clock()
+void visible_object()
 {
-   panel.clock.area.posx = panel.area.width - panel.clock.area.width - panel.area.paddingx - panel.area.border.width;
+   if (panel.area.list) {
+      g_slist_free(panel.area.list);
+      panel.area.list = 0;   
+   }
+
+   // 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);
+      }
+   }
+   redraw(&panel.area);
+   panel.refresh = 1;
 }
 
 
-// initialise taskbar posx and width
-void resize_taskbar()
+void set_panel_background()
 {
-   int taskbar_width, modulo_width, taskbar_on_screen;
+   Pixmap wall = get_root_pixmap();
 
-   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;
+   panel.area.pmap = server_create_pixmap (panel.area.width, panel.area.height);
+
+   // add layer of root pixmap
+   XCopyArea (server.dsp, wall, panel.area.pmap, server.gc, server.posx, server.posy, panel.area.width, panel.area.height, 0, 0);
+
+   // draw background panel
+   cairo_surface_t *cs;
+   cairo_t *c;
+   cs = cairo_xlib_surface_create (server.dsp, panel.area.pmap, server.visual, panel.area.width, panel.area.height);
+   c = cairo_create (cs);
+
+   draw_background (&panel.area, c);
    
-   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--;
-      }
+   cairo_destroy (c);
+   cairo_surface_destroy (cs);
 
-      resize_tasks(tskbar);
-   }
+   // copy background panel on desktop window
+   XCopyArea (server.dsp, panel.area.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy);
+
+   redraw (&panel.area);
 }
 
 
This page took 0.02674 seconds and 4 git commands to generate.