]> Dogcows Code - chaz/tint2/blobdiff - src/tint.c
add another padding parameter in config file, update documentation and sample config...
[chaz/tint2] / src / tint.c
index 56cbc1ce541f3cb018af6af7bd25a40980cc0cda..9ff04fc2cf5363dab6764ba059498eb4b27ddb6d 100644 (file)
@@ -1,10 +1,10 @@
 /**************************************************************************
 *
 * Tint2 panel
-* 
+*
 * Copyright (C) 2007 Pål Staurland (staura@gmail.com)
 * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
-* 
+*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
@@ -63,11 +63,7 @@ void init ()
    panel.clock.area.draw_foreground = draw_foreground_clock;
    g_task.area.draw_foreground = draw_foreground_task;
    window.main_win = 0;
-   
-   // append full transparency background
-   //Area *back = calloc(1, sizeof(Area));
-   list_back = g_slist_append(0, calloc(1, sizeof(Area)));
-   
+
    server.dsp = XOpenDisplay (NULL);
    if (!server.dsp) {
       fprintf(stderr, "Could not open display.\n");
@@ -89,7 +85,7 @@ void init ()
    //kde_init();
    //net_init();
    //printf("ici 4\n");
-   
+
    imlib_context_set_display (server.dsp);
    imlib_context_set_visual (server.visual);
    imlib_context_set_colormap (DefaultColormap (server.dsp, server.screen));
@@ -97,7 +93,7 @@ void init ()
    /* Catch events */
    XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
 
-   setlocale(LC_ALL, "");
+   setlocale (LC_ALL, "");
 }
 
 
@@ -125,13 +121,13 @@ void window_action (Task *tsk, int action)
 
 
 void event_button_press (int x, int y)
-{   
+{
    if (panel.mode == SINGLE_DESKTOP) {
       // drag and drop disabled
       XLowerWindow (server.dsp, window.main_win);
       return;
    }
-   
+
    Taskbar *tskbar;
    GSList *l0;
    for (l0 = panel.area.list; l0 ; l0 = l0->next) {
@@ -150,7 +146,7 @@ void event_button_press (int x, int y)
          }
       }
    }
-      
+
    XLowerWindow (server.dsp, window.main_win);
 }
 
@@ -158,6 +154,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:
@@ -174,9 +172,6 @@ void event_button_release (int button, int x, int y)
          break;
    }
 
-   // TODO: ne pas afficher les taskbar invisibles
-   //if (panel.mode != MULTI_DESKTOP && desktop != server.desktop) continue;
-   
    // search taskbar
    Taskbar *tskbar;
    GSList *l0;
@@ -195,15 +190,17 @@ 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;
    }
-   
+
    // switch desktop
    if (panel.mode == MULTI_DESKTOP)
       if (tskbar->desktop != server.desktop && action != CLOSE)
@@ -219,15 +216,15 @@ suite:
          break;
       }
    }
-   
+
    // to keep window below
    XLowerWindow (server.dsp, window.main_win);
 }
 
 
 void event_property_notify (Window win, Atom at)
-{   
-   
+{
+
    if (win == server.root_win) {
       if (!server.got_root_win) {
          XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
@@ -237,37 +234,70 @@ void event_property_notify (Window win, Atom at)
       /* Change number of desktops */
       else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) {
          config_taskbar();
-         redraw(&panel.area);
-         panel.refresh = 1;
+         visible_object();
       }
       /* 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) {
          task_refresh_tasklist ();
          panel.refresh = 1;
       }
-      /* Active */
+      /* Change active */
       else if (at == server.atom._NET_ACTIVE_WINDOW) {
+       if (panel.task_active) {
+               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 ();
          Task *t = task_get_task(w1);
-         if (t) panel.task_active = t;
-         else {
+         if (!t) {
             Window w2;
             if (XGetTransientForHint(server.dsp, w1, &w2) != 0)
-               if (w2) panel.task_active = task_get_task(w2);
+               if (w2) t = task_get_task(w2);
          }
+         if (t) {
+               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;
       }
       /* Wallpaper changed */
       else if (at == server.atom._XROOTPMAP_ID) {
-         XFreePixmap (server.dsp, server.root_pmap);
-         server.root_pmap = 0;
-         redraw(&panel.area);
-         panel.clock.area.redraw = 1;
+         XFreePixmap (server.dsp, panel.area.pix.pmap);
+         panel.area.pix.pmap = 0;
          panel.refresh = 1;
       }
    }
@@ -279,26 +309,63 @@ 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) 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) {
-         if (tsk->icon_data != 0) XFree (tsk->icon_data);
+         if (tsk->icon_data) {
+            free (tsk->icon_data);
+            tsk->icon_data = 0;
+         }
          tsk->area.redraw = 1;
-         tsk->icon_data = 0;
          panel.refresh = 1;
       }
       /* Window desktop changed */
       else if (at == server.atom._NET_WM_DESKTOP) {
-         add_task (tsk->win);
-         remove_task (tsk);         
+         remove_task (tsk);
+         add_task (win);
          panel.refresh = 1;
       }
 
@@ -308,25 +375,19 @@ void event_property_notify (Window win, Atom at)
 
 
 void event_configure_notify (Window win)
-{   
-   Task *tsk;
+{
+   if (panel.mode != MULTI_MONITOR) return;
 
-   tsk = task_get_task (win);
+   Task *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
+      remove_task (tsk);
+      add_task (win);
+      panel.refresh = 1;
+   }
 }
 
 
@@ -335,11 +396,11 @@ void event_timer()
    struct timeval stv;
 
    if (!panel.clock.time1_format) return;
-   
+
    if (gettimeofday(&stv, 0)) return;
-   
+
    if (abs(stv.tv_sec - panel.clock.clock.tv_sec) < panel.clock.time_precision) return;
-      
+
    // update clock
    panel.clock.clock.tv_sec = stv.tv_sec;
    panel.clock.clock.tv_sec -= panel.clock.clock.tv_sec % panel.clock.time_precision;
@@ -359,8 +420,11 @@ int main (int argc, char *argv[])
    init ();
 
 load_config:
-   if (server.root_pmap) XFreePixmap (server.dsp, server.root_pmap);
-   server.root_pmap = 0;                          
+   if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap);
+   panel.area.pix.pmap = 0;
+   // append full transparency background
+   list_back = g_slist_append(0, calloc(1, sizeof(Area)));
+
    // read tint2rc config
    i = 0;
    if (c != -1)
@@ -373,12 +437,15 @@ load_config:
       exit(1);
    }
    config_finish ();
-   
+
    window_draw_panel ();
 
+   // BUG: refresh(clock) is needed here, but 'on the paper' it's not necessary.
+   refresh(&panel.clock.area);
+
    x11_fd = ConnectionNumber (server.dsp);
    XSync (server.dsp, False);
-   
+
    while (1) {
       // thanks to AngryLlama for the timer
       // Create a File Description Set containing x11_fd
@@ -387,12 +454,12 @@ load_config:
 
       tv.tv_usec = 500000;
       tv.tv_sec = 0;
-      
+
       // Wait for X Event or a Timer
       if (select(x11_fd+1, &fd, 0, 0, &tv)) {
          while (XPending (server.dsp)) {
             XNextEvent(server.dsp, &e);
-            
+
             switch (e.type) {
                case ButtonPress:
                   if (e.xbutton.button == 1) event_button_press (e.xbutton.x, e.xbutton.y);
@@ -401,9 +468,10 @@ load_config:
                case ButtonRelease:
                   event_button_release (e.xbutton.button, e.xbutton.x, e.xbutton.y);
                   break;
-            
+
                case Expose:
-                  XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
+                  XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy);
+                  XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0);
                   break;
 
                case PropertyNotify:
@@ -415,8 +483,7 @@ load_config:
                   if (e.xconfigure.window == server.root_win)
                      goto load_config;
                   else
-                     if (panel.mode == MULTI_MONITOR) 
-                        event_configure_notify (e.xconfigure.window);                        
+                     event_configure_notify (e.xconfigure.window);
                   break;
             }
          }
@@ -435,7 +502,7 @@ load_config:
       if (panel.refresh && !panel.sleep_mode) {
          visual_refresh ();
          //printf("   *** visual_refresh\n");
-      }      
+      }
    }
 }
 
This page took 0.029234 seconds and 4 git commands to generate.