]> Dogcows Code - chaz/tint2/blobdiff - src/server.c
fixed issue 48
[chaz/tint2] / src / server.c
index 82f51b8ef00e6beed3691716616f196078aeda19..db069930a6bfdf3e9da783febad492fb823c5ca8 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.
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "server.h"
-#include "panel.h"
 #include "task.h"
 #include "window.h"
 
 void server_catch_error (Display *d, XErrorEvent *ev){}
 
+static char *name_trayer = 0;
+
 
 void server_init_atoms ()
 {
@@ -41,6 +43,7 @@ void server_init_atoms ()
    server.atom._NET_WM_STATE_SKIP_PAGER = XInternAtom (server.dsp, "_NET_WM_STATE_SKIP_PAGER", False);
    server.atom._NET_WM_STATE_SKIP_TASKBAR = XInternAtom (server.dsp, "_NET_WM_STATE_SKIP_TASKBAR", False);
    server.atom._NET_WM_STATE_STICKY = XInternAtom (server.dsp, "_NET_WM_STATE_STICKY", False);
+   server.atom._NET_WM_STATE_DEMANDS_ATTENTION = XInternAtom (server.dsp, "_NET_WM_STATE_DEMANDS_ATTENTION", False);
    server.atom._NET_WM_WINDOW_TYPE_DOCK = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_DOCK", False);
    server.atom._NET_WM_WINDOW_TYPE_DESKTOP = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_DESKTOP", False);
    server.atom._NET_WM_WINDOW_TYPE_TOOLBAR = XInternAtom (server.dsp, "_NET_WM_WINDOW_TYPE_TOOLBAR", False);
@@ -68,6 +71,20 @@ void server_init_atoms ()
    server.atom.WM_NAME = XInternAtom(server.dsp, "WM_NAME", False);
    server.atom.__SWM_VROOT = XInternAtom(server.dsp, "__SWM_VROOT", False);
    server.atom._MOTIF_WM_HINTS = XInternAtom(server.dsp, "_MOTIF_WM_HINTS", False);
+
+       // systray protocol
+       name_trayer = g_strdup_printf("_NET_SYSTEM_TRAY_S%d", DefaultScreen(server.dsp));
+       server.atom._NET_SYSTEM_TRAY_SCREEN = XInternAtom(server.dsp, name_trayer, False);
+       server.atom._NET_SYSTEM_TRAY_OPCODE = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_OPCODE", False);
+       server.atom.MANAGER = XInternAtom(server.dsp, "MANAGER", False);
+       server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
+       server.atom._NET_SYSTEM_TRAY_ORIENTATION = XInternAtom(server.dsp, "_NET_SYSTEM_TRAY_ORIENTATION", False);
+}
+
+
+void cleanup_server()
+{
+       if (name_trayer) free(name_trayer);
 }
 
 
@@ -135,84 +152,109 @@ 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 ()
+void get_root_pixmap()
 {
-   Pixmap ret;
-       Window root = RootWindow(server.dsp, server.screen);
-
-   ret = None;    
-   int  act_format, c = 2 ;
-   u_long  nitems ;
-   u_long  bytes_after ;
-   u_char *prop ;
-   Atom dummy_id;
-
-   do {
-      if (XGetWindowProperty(server.dsp, root, server.atom._XROOTPMAP_ID, 0, 1,
-                False, XA_PIXMAP, &dummy_id, &act_format,
-                &nitems, &bytes_after, &prop) == Success) {
-          if (prop) {
-              ret = *((Pixmap *)prop);
-              XFree(prop);
-              break;
-          }
-      }
-   } while (--c > 0);
+       Pixmap ret = None;
 
-   return ret;
+   unsigned long *res;
+       int  c = 2;
+
+       do {
+               res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0);
+               if (res) {
+                       ret = *((Pixmap*)res);
+                       XFree(res);
+         break;
+               }
+       } while (--c > 0);
+       server.root_pmap = ret;
+
+       if (server.root_pmap == None)
+               fprintf(stderr, "tint2 : pixmap background detection failed\n");
+       else {
+               XGCValues  gcv;
+               gcv.ts_x_origin = 0;
+               gcv.ts_y_origin = 0;
+               gcv.fill_style = FillTiled;
+               uint mask = GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle | GCTile;
+
+               gcv.tile = server.root_pmap;
+               XChangeGC(server.dsp, server.gc, mask, &gcv);
+       }
 }
 
 
-/*
-Pixmap get_root_pixmap ()
+int compareMonitor(const void *monitor1, const void *monitor2)
 {
-   // conky capture correctement le fond d'écran en xlib !!
-   Pixmap root_pixmap;
-   unsigned long *res;
-
-       server.root_win = window_get_root();   
+   Monitor *m1 = (Monitor*)monitor1;
+   Monitor *m2 = (Monitor*)monitor2;
 
-   res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0);
-   if (res) {
-      root_pixmap = *((Drawable*) res);
-      XFree(res);
-      return root_pixmap;
+   if (m1->x < m2->x) {
+      return -1;
    }
-   else {
-      printf("get_root_pixmap incorrect\n");
-      // try _XSETROOT_ID
-   }
-   return 0;
-}  
-*/
+   else
+      if (m1->x > m2->x) {
+         return 1;
+      }
+      else
+         if (m1->width < m2->width) {
+            return 1;
+         }
+         else
+            if (m1->width > m2->width) {
+               return -1;
+            }
+            else {
+               return 0;
+            }
+}
 
 
-void get_monitors()
+void get_monitors_and_desktops()
 {
+   int i;
+
    if (server.monitor) free(server.monitor);
    server.nb_monitor = 0;
    server.monitor = 0;
-   
+
+   int nb_monitor;
    if (XineramaIsActive(server.dsp)) {
-      XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &server.nb_monitor);
+      XineramaScreenInfo *info = XineramaQueryScreens(server.dsp, &nb_monitor);
 
       if (info) {
-         int i;
-         
-         server.monitor = calloc(server.nb_monitor, sizeof(Monitor));
-         for (i = 0; i < server.nb_monitor; i++) {
-            server.monitor[i].x = info[i].x_org;
-            server.monitor[i].y = info[i].y_org;
-            server.monitor[i].width = info[i].width;
-            server.monitor[i].height = info[i].height;
-         }  
+                       int nb=0, j;
+
+         i = 0;
+         server.monitor = calloc(nb_monitor, sizeof(Monitor));
+         while (i < nb_monitor) {
+                for (j = 0; j < i; j++) {
+                                       if (info[i].x_org >= info[j].x_org && info[i].y_org >= info[j].y_org && (info[i].x_org+info[i].width) <= (info[j].x_org+info[j].width) && (info[i].y_org+info[i].height) <= (info[j].y_org+info[j].height)) {
+                                               if (info[i].x_org == info[j].x_org && info[i].y_org == info[j].y_org && info[i].width == info[j].width && info[i].height == info[j].height && nb == 0) {
+                                                       // add the first monitor
+                                                       break;
+                                               }
+                                               else {
+                                                       // doesn't count monitor 'i' because it's included into another one
+                                       //fprintf(stderr, "monitor %d included into another one\n", i);
+                                       goto next;
+                                               }
+                                       }
+                               }
+
+            server.monitor[nb].x = info[i].x_org;
+            server.monitor[nb].y = info[i].y_org;
+            server.monitor[nb].width = info[i].width;
+            server.monitor[nb].height = info[i].height;
+                               nb++;
+next:
+                               i++;
+         }
          XFree(info);
+         server.nb_monitor = nb;
+
+         // ordered monitor according to coordinate
+         qsort(server.monitor, server.nb_monitor, sizeof(Monitor), compareMonitor);
       }
    }
 
@@ -223,6 +265,18 @@ void get_monitors()
       server.monitor[0].width = DisplayWidth (server.dsp, server.screen);
       server.monitor[0].height = DisplayHeight (server.dsp, server.screen);
    }
+
+       // detect number of desktops
+   for (i=0 ; i < 15 ; i++) {
+      server.nb_desktop = server_get_number_of_desktop ();
+      if (server.nb_desktop > 0) break;
+      sleep(1);
+   }
+   if (server.nb_desktop == 0) {
+      server.nb_desktop = 1;
+      fprintf(stderr, "tint2 : cannot found number of desktop.\n");
+   }
+       fprintf(stderr, "tint2 : nb monitor %d, nb desktop %d\n", server.nb_monitor, server.nb_desktop);
 }
 
 
This page took 0.025132 seconds and 4 git commands to generate.