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;
}
}
+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;
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));