X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=d9e3411e5d4fcff7bf4f6190b95f8f5c5ed57819;hb=77ca42c796001308f9baf2fa279fc18ffa7666e9;hp=c135077eff6515485f375bd5dc3a0c9455ee017f;hpb=9ad50cc90314fb960c8eea1d41f912f6d9e402fd;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index c135077..d9e3411 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -78,14 +78,14 @@ void init_systray() void cleanup_systray() { - if (systray.list_icons) { + if (systray.list_icons) { // remove_icon change systray.list_icons while(systray.list_icons) remove_icon((TrayWindow*)systray.list_icons->data); - g_slist_free(systray.list_icons); - systray.list_icons = 0; - } + g_slist_free(systray.list_icons); + systray.list_icons = 0; + } free_area(&systray.area); cleanup_net(); @@ -113,7 +113,12 @@ void resize_systray(void *obj) else icon_size = sysbar->area.width; icon_size = icon_size - (2 * sysbar->area.pix.border.width) - (2 * sysbar->area.paddingy); - count = g_slist_length(systray.list_icons); + count = 0; + for (l = systray.list_icons; l ; l = l->next) { + if (!((TrayWindow*)l->data)->hide) + count++; + } + //printf("count %d\n", count); if (panel_horizontal) { if (!count) systray.area.width = 0; @@ -150,6 +155,7 @@ void resize_systray(void *obj) } for (l = systray.list_icons; l ; l = l->next) { traywin = (TrayWindow*)l->data; + if (traywin->hide) continue; traywin->y = posy; traywin->x = posx; @@ -171,17 +177,36 @@ 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 = 0; + int pid; + + _NET_WM_PID = XInternAtom(server.dsp, "_NET_WM_PID", True); + 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 == Success && prop) { + pid = prop[1] * 256; + pid += prop[0]; + fprintf(stderr, " pid=%d", pid); + } + fprintf(stderr, "\n"); return 0; } // init systray protocol - net_sel_win = XCreateSimpleWindow(server.dsp, server.root_win, -1, -1, 1, 1, 0, 0, 0); + net_sel_win = XCreateSimpleWindow(server.dsp, server.root_win, -1, -1, 1, 1, 0, 0, 0); - // v0.2 trayer specification. tint2 always orizontal. - // TODO : vertical panel ?? + // v0.2 trayer specification. tint2 always horizontal. + // Vertical panel will draw the systray horizontal. int orient = 0; XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ORIENTATION, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &orient, 1); @@ -189,11 +214,11 @@ int init_net() if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) { fprintf(stderr, "tint2 : can't get systray manager\n"); return 0; - } + } - XClientMessageEvent ev; + XClientMessageEvent ev; ev.type = ClientMessage; - ev.window = server.root_win; + ev.window = server.root_win; ev.message_type = server.atom.MANAGER; ev.format = 32; ev.data.l[0] = CurrentTime; @@ -209,8 +234,8 @@ int init_net() void cleanup_net() { if (net_sel_win != None) { - XDestroyWindow(server.dsp, net_sel_win); - net_sel_win = None; + XDestroyWindow(server.dsp, net_sel_win); + net_sel_win = None; } } @@ -254,6 +279,7 @@ gboolean add_icon(Window id) TrayWindow *traywin; XErrorHandler old; Panel *panel = systray.area.panel; + int hide = 0; error = FALSE; old = XSetErrorHandler(window_error_handler); @@ -273,8 +299,16 @@ gboolean add_icon(Window id) int ret; ret = XGetWindowProperty(server.dsp, id, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data); - if (data) XFree(data); - if (ret != Success) { + if (ret == Success) { + if (data) { + if (nbitem == 2) { + //hide = ((data[1] & XEMBED_MAPPED) == 0); + //printf("hide %d\n", hide); + } + XFree(data); + } + } + else { fprintf(stderr, "tint2 : xembed error\n"); return FALSE; } @@ -297,10 +331,15 @@ gboolean add_icon(Window id) traywin = g_new0(TrayWindow, 1); traywin->id = id; + traywin->hide = hide; -// 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; + if (systray.sort == 3) + systray.list_icons = g_slist_prepend(systray.list_icons, traywin); + else if (systray.sort == 2) + systray.list_icons = g_slist_append(systray.list_icons, traywin); + else + 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)); @@ -308,7 +347,8 @@ gboolean add_icon(Window id) XSelectInput(server.dsp, traywin->id, StructureNotifyMask); // show the window - XMapRaised(server.dsp, traywin->id); + if (!traywin->hide) + XMapRaised(server.dsp, traywin->id); // changed in systray force resize on panel panel->area.resize = 1; @@ -320,22 +360,22 @@ gboolean add_icon(Window id) void remove_icon(TrayWindow *traywin) { XErrorHandler old; - Window id = traywin->id; // remove from our list systray.list_icons = g_slist_remove(systray.list_icons, traywin); g_free(traywin); - systray.area.resize = 1; + systray.area.resize = 1; systray.area.redraw = 1; //printf("remove_icon id %lx, %d\n", traywin->id); - XSelectInput(server.dsp, id, NoEventMask); + XSelectInput(server.dsp, traywin->id, NoEventMask); // reparent to root error = FALSE; old = XSetErrorHandler(window_error_handler); - XUnmapWindow(server.dsp, id); - XReparentWindow(server.dsp, id, server.root_win, 0, 0); + if (!traywin->hide) + XUnmapWindow(server.dsp, traywin->id); + XReparentWindow(server.dsp, traywin->id, server.root_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); @@ -379,6 +419,7 @@ void refresh_systray_icon() GSList *l; for (l = systray.list_icons; l ; l = l->next) { traywin = (TrayWindow*)l->data; + if (traywin->hide) continue; XClearArea(server.dsp, traywin->id, 0, 0, traywin->width, traywin->height, True); } }