X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=069a3fc8aa998a7f103699d2889e2f310f85acc1;hb=ed39165e7908dda7b2c7581075ef71a6de669a59;hp=f0adce7258220d9687fb11afe9378eaea80b7fdf;hpb=101ed479957ad40d2579faddb858a62a554007a3;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index f0adce7..069a3fc 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -59,39 +59,35 @@ void init_systray() 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; // configure systray // draw only one systray (even with multi panel) - systray.area.posy = panel->area.pix.border.width + panel->area.paddingy; - systray.area.height = panel->area.height - (2 * systray.area.posy); - systray.area.width = 0; - systray.area.redraw = 1; - - systray.area.posx = panel->area.width - panel->area.paddingxlr - panel->area.pix.border.width - systray.area.width; - if (panel->clock.area.on_screen) - systray.area.posx -= (panel->clock.area.width + panel->area.paddingx); -#ifdef ENABLE_BATTERY - if (panel->battery.area.on_screen) - systray.area.posx -= (panel->battery.area.width + panel->area.paddingx); -#endif + if (panel_horizontal) { + systray.area.posy = panel->area.pix.border.width + panel->area.paddingy; + systray.area.height = panel->area.height - (2 * systray.area.posy); + } + else { + 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); + } } void cleanup_systray() { if (systray.list_icons) { - GSList *it; - - for (it = systray.list_icons; it; it = it->next) - remove_icon((TrayWindow*)it->data); + // 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; } free_area(&systray.area); - cleanup_net(); } @@ -112,22 +108,46 @@ void resize_systray(void *obj) int count, posx, posy; int icon_size; - icon_size = sysbar->area.height - (2 * sysbar->area.pix.border.width) - (2 * sysbar->area.paddingy); + if (panel_horizontal) + icon_size = sysbar->area.height; + 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); - if (!count) systray.area.width = 0; - else systray.area.width = (2 * systray.area.pix.border.width) + (2 * systray.area.paddingxlr) + (icon_size * count) + ((count-1) * systray.area.paddingx); + if (panel_horizontal) { + if (!count) systray.area.width = 0; + else systray.area.width = (2 * systray.area.pix.border.width) + (2 * systray.area.paddingxlr) + (icon_size * count) + ((count-1) * systray.area.paddingx); - systray.area.posx = panel->area.width - panel->area.pix.border.width - panel->area.paddingxlr - systray.area.width; - if (panel->clock.area.on_screen) - systray.area.posx -= (panel->clock.area.width + panel->area.paddingx); + systray.area.posx = panel->area.width - panel->area.pix.border.width - panel->area.paddingxlr - systray.area.width; + if (panel->clock.area.on_screen) + systray.area.posx -= (panel->clock.area.width + panel->area.paddingx); #ifdef ENABLE_BATTERY - if (panel->battery.area.on_screen) - systray.area.posx -= (panel->battery.area.width + panel->area.paddingx); + if (panel->battery.area.on_screen) + systray.area.posx -= (panel->battery.area.width + panel->area.paddingx); #endif + } + else { + if (!count) systray.area.height = 0; + else systray.area.height = (2 * systray.area.pix.border.width) + (2 * systray.area.paddingxlr) + (icon_size * count) + ((count-1) * systray.area.paddingx); - posy = panel->area.pix.border.width + panel->area.paddingy + systray.area.pix.border.width + systray.area.paddingy; - posx = systray.area.posx + systray.area.pix.border.width + systray.area.paddingxlr; + systray.area.posy = panel->area.pix.border.width + panel->area.paddingxlr; + if (panel->clock.area.on_screen) + systray.area.posy += (panel->clock.area.height + panel->area.paddingx); +#ifdef ENABLE_BATTERY + if (panel->battery.area.on_screen) + systray.area.posy += (panel->battery.area.height + panel->area.paddingx); +#endif + } + + if (panel_horizontal) { + posy = panel->area.pix.border.width + panel->area.paddingy + systray.area.pix.border.width + systray.area.paddingy; + posx = systray.area.posx + systray.area.pix.border.width + systray.area.paddingxlr; + } + else { + posx = panel->area.pix.border.width + panel->area.paddingy + systray.area.pix.border.width + systray.area.paddingy; + posy = systray.area.posy + systray.area.pix.border.width + systray.area.paddingxlr; + } for (l = systray.list_icons; l ; l = l->next) { traywin = (TrayWindow*)l->data; @@ -135,51 +155,33 @@ void resize_systray(void *obj) traywin->x = posx; traywin->width = icon_size; traywin->height = icon_size; - posx += (icon_size + systray.area.paddingx); + if (panel_horizontal) + posx += (icon_size + systray.area.paddingx); + else + posy += (icon_size + systray.area.paddingx); // position and size the icon window XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, icon_size, icon_size); } - //printf("resize_systray %d %d\n", systray.area.posx, systray.area.width); } -/* -void create_hint_win() -{ - XWMHints hints; - XClassHint classhints; - Panel *panel = systray.area.panel; - - hint_win = XCreateSimpleWindow(server.dsp, server.root_win, 0, 0, 1, 1, 0, 0, 0); - - hints.flags = StateHint | WindowGroupHint | IconWindowHint; - hints.initial_state = WithdrawnState; - hints.window_group = hint_win; - hints.icon_window = panel->main_win; - - classhints.res_name = "docker"; - classhints.res_class = "Docker"; - XSetWMProperties(server.dsp, hint_win, NULL, NULL, NULL, 0, - NULL, &hints, &classhints); - - XMapWindow(server.dsp, hint_win); -} -*/ +// *********************************************** +// systray protocol int init_net() { + // freedesktop systray specification if (XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN) != None) { fprintf(stderr, "tint2 : another systray is running\n"); return 0; } - //create_hint_win(); - // 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 ?? int orient = 0; XChangeProperty(server.dsp, net_sel_win, server.atom._NET_SYSTEM_TRAY_ORIENTATION, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &orient, 1); @@ -225,7 +227,6 @@ int window_error_handler(Display *d, XErrorEvent *e) } -// The traywin must have its id and type set. gboolean add_icon(Window id) { TrayWindow *traywin; @@ -237,19 +238,48 @@ gboolean add_icon(Window id) XReparentWindow(server.dsp, id, panel->main_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); - if (error != FALSE) { fprintf(stderr, "tint2 : not icon_swallow\n"); return FALSE; } + { + Atom acttype; + int actfmt; + unsigned long nbitem, bytes; + unsigned char *data = 0; + 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) { + fprintf(stderr, "tint2 : xembed error\n"); + return FALSE; + } + } + { + XEvent e; + e.xclient.type = ClientMessage; + e.xclient.serial = 0; + e.xclient.send_event = True; + e.xclient.message_type = server.atom._XEMBED; + e.xclient.window = id; + e.xclient.format = 32; + e.xclient.data.l[0] = CurrentTime; + e.xclient.data.l[1] = XEMBED_EMBEDDED_NOTIFY; + e.xclient.data.l[2] = 0; + e.xclient.data.l[3] = panel->main_win; + e.xclient.data.l[4] = 0; + XSendEvent(server.dsp, id, False, 0xFFFFFF, &e); + } + traywin = g_new0(TrayWindow, 1); traywin->id = id; systray.list_icons = g_slist_prepend(systray.list_icons, traywin); - //printf("ajout d'un icone %d (%lx)\n", g_slist_length(systray.list_icons), id); systray.area.resize = 1; systray.area.redraw = 1; + //printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons)); // watch for the icon trying to resize itself! XSelectInput(server.dsp, traywin->id, StructureNotifyMask); @@ -267,28 +297,29 @@ 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.redraw = 1; + //printf("remove_icon id %lx, %d\n", traywin->id); - XSelectInput(server.dsp, traywin->id, NoEventMask); + XSelectInput(server.dsp, id, NoEventMask); // reparent to root error = FALSE; old = XSetErrorHandler(window_error_handler); - XReparentWindow(server.dsp, traywin->id, server.root_win, 0, 0); + XUnmapWindow(server.dsp, id); + XReparentWindow(server.dsp, id, server.root_win, 0, 0); XSync(server.dsp, False); XSetErrorHandler(old); - // remove from our list - systray.list_icons = g_slist_remove(systray.list_icons, traywin); - g_free(traywin); - //printf("suppression d'un icone %d\n", g_slist_length(systray.list_icons)); - systray.area.resize = 1; - systray.area.redraw = 1; - // changed in systray force resize on panel Panel *panel = systray.area.panel; panel->area.resize = 1; panel_refresh = 1; - } @@ -310,11 +341,10 @@ void net_message(XClientMessageEvent *e) break; default: - if (opcode == server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA) { + if (opcode == server.atom._NET_SYSTEM_TRAY_MESSAGE_DATA) printf("message from dockapp: %s\n", e->data.b); - } else - printf("SYSTEM_TRAY : unknown message type\n"); + fprintf(stderr, "SYSTEM_TRAY : unknown message type\n"); break; } }