]> Dogcows Code - chaz/tint2/blobdiff - src/systray/systraybar.c
detect pid of process owning the systray
[chaz/tint2] / src / systray / systraybar.c
index 069a3fc8aa998a7f103699d2889e2f310f85acc1..c014fd91362e842061b90ac040b451af2389e8b4 100644 (file)
@@ -171,9 +171,30 @@ void resize_systray(void *obj)
 
 int init_net()
 {
+       Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN);
+
        // freedesktop systray specification
-       if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != None) {
-               fprintf(stderr, "tint2 : another systray is running\n");
+       if (win != None) {
+               // search pid
+               Atom _NET_WM_PID, actual_type;
+               int actual_format;
+               unsigned long nitems;
+               unsigned long bytes_after;
+               unsigned char *prop;
+               int pid;
+
+               _NET_WM_PID = XInternAtom(server.dsp, "_NET_WM_PID", True);
+               //atom_name = XGetAtomName (dpy,atom);
+
+               int ret = XGetWindowProperty(server.dsp, win, _NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop);
+
+               fprintf(stderr, "tint2 : another systray is running");
+               if (ret == 0) {
+                       pid = prop[1] * 256;
+                       pid += prop[0];
+                       fprintf(stderr, " pid=%d", pid);
+               }
+               fprintf(stderr, "\n");
                return 0;
        }
 
@@ -227,6 +248,28 @@ int window_error_handler(Display *d, XErrorEvent *e)
 }
 
 
+static gint compare_traywindows(gconstpointer a, gconstpointer b)
+{
+       const TrayWindow * traywin_a = (TrayWindow*)a;
+       const TrayWindow * traywin_b = (TrayWindow*)b;
+       XTextProperty name_a, name_b;
+
+       if(XGetWMName(server.dsp, traywin_a->id, &name_a) == 0) {
+               return -1;
+       }
+       else if(XGetWMName(server.dsp, traywin_b->id, &name_b) == 0) {
+               XFree(name_a.value);
+               return 1;
+       }
+       else {
+               gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) * systray.sort;
+               XFree(name_a.value);
+               XFree(name_b.value);
+               return retval;
+       }
+}
+
+
 gboolean add_icon(Window id)
 {
        TrayWindow *traywin;
@@ -276,7 +319,8 @@ gboolean add_icon(Window id)
        traywin = g_new0(TrayWindow, 1);
        traywin->id = id;
 
-       systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
+//     systray.list_icons = g_slist_prepend(systray.list_icons, traywin);
+       systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
        systray.area.resize = 1;
        systray.area.redraw = 1;
        //printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
This page took 0.020647 seconds and 4 git commands to generate.