X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=16dd079c57ce25060d414623bdd650e636a13900;hb=3cf41266a0125935c58edb64941f2a27a0fab3c4;hp=130372e329e33ec3e1f21f482ab1e76056bfa082;hpb=ff3943fb6d59f541d06a4fed1910eaffc8ae85ec;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 130372e..16dd079 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -47,24 +47,24 @@ int refresh_systray; void init_systray() { - Panel *panel = &panel1[0]; - if (systray.area.on_screen) systray.area.on_screen = init_net(); if (!systray.area.on_screen) return; - systray.area.parent = panel; - systray.area.panel = panel; systray.area._draw_foreground = draw_systray; systray.area._resize = resize_systray; systray.area.resize = 1; systray.area.redraw = 1; refresh_systray = 0; +} + + +void init_systray_panel(void *p) +{ + Panel *panel =(Panel*)p; - // configure systray - // draw only one systray (even with multi panel) if (panel_horizontal) { systray.area.posy = panel->area.pix.border.width + panel->area.paddingy; systray.area.height = panel->area.height - (2 * systray.area.posy); @@ -73,6 +73,8 @@ void init_systray() systray.area.posx = panel->area.pix.border.width + panel->area.paddingy; systray.area.width = panel->area.width - (2 * panel->area.pix.border.width) - (2 * panel->area.paddingy); } + systray.area.parent = p; + systray.area.panel = p; } @@ -113,7 +115,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 +157,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; @@ -184,8 +192,6 @@ int init_net() 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"); @@ -201,8 +207,8 @@ int init_net() // init systray protocol 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); @@ -275,6 +281,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); @@ -294,8 +301,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; } @@ -318,9 +333,12 @@ gboolean add_icon(Window id) traywin = g_new0(TrayWindow, 1); traywin->id = id; + traywin->hide = hide; - if (systray.sort == 0) + 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; @@ -331,7 +349,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; @@ -343,7 +362,6 @@ 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); @@ -352,13 +370,14 @@ void remove_icon(TrayWindow *traywin) 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); @@ -402,6 +421,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); } }