X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=85431967d8128266aa48c9757859863bf1ee8d34;hb=386f2fec6d8d7c3ebe1e2192f4632ed0b12f0df1;hp=d9e3411e5d4fcff7bf4f6190b95f8f5c5ed57819;hpb=77ca42c796001308f9baf2fa279fc18ffa7666e9;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index d9e3411..8543196 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -43,28 +43,29 @@ Window net_sel_win = None, hint_win = None; // freedesktop specification doesn't allow multi systray Systraybar systray; int refresh_systray; +int systray_enabled; void init_systray() { - Panel *panel = &panel1[0]; + start_net(); - if (systray.area.on_screen) - systray.area.on_screen = init_net(); - - if (!systray.area.on_screen) + if (!systray_enabled) 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; + systray.area.on_screen = 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,22 +74,16 @@ 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; } void cleanup_systray() { - 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; - } - + systray_enabled = 0; + systray.area.on_screen = 0; free_area(&systray.area); - cleanup_net(); } @@ -175,8 +170,18 @@ void resize_systray(void *obj) // *********************************************** // systray protocol -int init_net() +void start_net() { + if (net_sel_win) { + // protocol already started + if (!systray_enabled) + stop_net(); + return; + } + else + if (!systray_enabled) + return; + Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN); // freedesktop systray specification @@ -199,7 +204,7 @@ int init_net() fprintf(stderr, " pid=%d", pid); } fprintf(stderr, "\n"); - return 0; + return; } // init systray protocol @@ -212,10 +217,12 @@ int init_net() XSetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN, net_sel_win, CurrentTime); if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != net_sel_win) { + stop_net(); fprintf(stderr, "tint2 : can't get systray manager\n"); - return 0; + return; } + //fprintf(stderr, "tint2 : systray started\n"); XClientMessageEvent ev; ev.type = ClientMessage; ev.window = server.root_win; @@ -227,12 +234,21 @@ int init_net() ev.data.l[3] = 0; ev.data.l[4] = 0; XSendEvent(server.dsp, server.root_win, False, StructureNotifyMask, (XEvent*)&ev); - return 1; } -void cleanup_net() +void stop_net() { + //fprintf(stderr, "tint2 : systray stopped\n"); + 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; + } + if (net_sel_win != None) { XDestroyWindow(server.dsp, net_sel_win); net_sel_win = None; @@ -363,7 +379,6 @@ void remove_icon(TrayWindow *traywin) // remove from our list systray.list_icons = g_slist_remove(systray.list_icons, traywin); - g_free(traywin); systray.area.resize = 1; systray.area.redraw = 1; //printf("remove_icon id %lx, %d\n", traywin->id); @@ -378,6 +393,7 @@ void remove_icon(TrayWindow *traywin) XReparentWindow(server.dsp, traywin->id, server.root_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); + g_free(traywin); // changed in systray force resize on panel Panel *panel = systray.area.panel;