X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=c2f437e679d067d3eed61e0684dd720e9da4c30e;hb=c929b4afa0049f43fd31927680303d3516f6e84f;hp=0b92bb002d42896aca56a7fad8958eb4b6c26cef;hpb=2fd9e91579d04f8eeadea8a1584b2d994626a8f1;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 0b92bb0..c2f437e 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -1,7 +1,7 @@ /************************************************************************** * Tint2 : systraybar * -* Copyright (C) 2009 thierry lorthiois (lorthiois@bbsoft.fr) +* Copyright (C) 2009 thierry lorthiois (lorthiois@bbsoft.fr) from Omega distribution * based on 'docker-1.5' from Ben Jansens. * * This program is free software; you can redistribute it and/or @@ -61,6 +61,7 @@ void default_systray() systray.alpha = 100; systray.sort = 3; systray.area._draw_foreground = draw_systray; + systray.area._on_change_layout = on_change_systray; systray.area.size_mode = SIZE_BY_CONTENT; systray.area._resize = resize_systray; } @@ -95,16 +96,6 @@ void init_systray() void init_systray_panel(void *p) { - Panel *panel =(Panel*)p; - - if (panel_horizontal) { - systray.area.posy = panel->area.bg->border.width + panel->area.paddingy; - systray.area.height = panel->area.height - (2 * systray.area.posy); - } - else { - systray.area.posx = panel->area.bg->border.width + panel->area.paddingy; - systray.area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy); - } systray.area.parent = p; systray.area.panel = p; @@ -115,61 +106,15 @@ void init_systray_panel(void *p) count++; } if (count == 0) - systray.area.on_screen = 0; + hide(&systray.area); else - systray.area.on_screen = 1; + show(&systray.area); refresh_systray = 0; } void draw_systray(void *obj, cairo_t *c) { - // here, sysbar's position is defined. so we can calculate position of tray icon. - Systraybar *sysbar = obj; - Panel *panel = sysbar->area.panel; - int i, posx, posy; - int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +sysbar->marging/2; - if (panel_horizontal) { - posy = start; - posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr; - } - else { - posx = start; - posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr; - } - - TrayWindow *traywin; - GSList *l; - for (i=1, l = systray.list_icons; l ; i++, l = l->next) { - traywin = (TrayWindow*)l->data; - if (traywin->hide) continue; - - traywin->y = posy; - traywin->x = posx; - traywin->width = sysbar->icon_size; - traywin->height = sysbar->icon_size; - if (panel_horizontal) { - if (i % sysbar->icons_per_column) - posy += sysbar->icon_size + sysbar->area.paddingx; - else { - posy = start; - posx += (sysbar->icon_size + systray.area.paddingx); - } - } - else { - if (i % sysbar->icons_per_row) - posx += sysbar->icon_size + systray.area.paddingx; - else { - posx = start; - posy += (sysbar->icon_size + systray.area.paddingx); - } - } - - // position and size the icon window - XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, sysbar->icon_size, sysbar->icon_size); - XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size); - } - if (server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) { if (render_background) XFreePixmap(server.dsp, render_background); render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth); @@ -220,6 +165,56 @@ int resize_systray(void *obj) } +void on_change_systray (void *obj) +{ + // here, systray.area.posx/posy are defined by rendering engine. so we can calculate position of tray icon. + Systraybar *sysbar = obj; + int i, posx, posy; + int start = systray.area.posy + systray.area.bg->border.width + systray.area.paddingy + sysbar->marging/2; + if (panel_horizontal) { + posy = start; + posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr; + } + else { + posx = start; + posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr; + } + + TrayWindow *traywin; + GSList *l; + for (i=1, l = systray.list_icons; l ; i++, l = l->next) { + traywin = (TrayWindow*)l->data; + if (traywin->hide) continue; + + traywin->y = posy; + traywin->x = posx; + //printf("systray %d : %d,%d\n", i, posx, posy); + traywin->width = sysbar->icon_size; + traywin->height = sysbar->icon_size; + if (panel_horizontal) { + if (i % sysbar->icons_per_column) + posy += sysbar->icon_size + sysbar->area.paddingx; + else { + posy = start; + posx += (sysbar->icon_size + systray.area.paddingx); + } + } + else { + if (i % sysbar->icons_per_row) + posx += sysbar->icon_size + systray.area.paddingx; + else { + posx = start; + posy += (sysbar->icon_size + systray.area.paddingx); + } + } + + // position and size the icon window + XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, sysbar->icon_size, sysbar->icon_size); + XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size); + } +} + + // *********************************************** // systray protocol @@ -434,7 +429,7 @@ gboolean add_icon(Window id) traywin->damage = 0; if (systray.area.on_screen == 0) - systray.area.on_screen = 1; + show(&systray.area); if (systray.sort == 3) systray.list_icons = g_slist_prepend(systray.list_icons, traywin); @@ -442,7 +437,6 @@ gboolean add_icon(Window id) 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; //printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons)); // watch for the icon trying to resize itself! @@ -458,8 +452,8 @@ gboolean add_icon(Window id) if (!traywin->hide && !panel->is_hidden) XMapRaised(server.dsp, traywin->id); - // changed in systray force resize on panel - panel->area.resize = 1; + // changed in systray + systray.area.resize = 1; panel_refresh = 1; return TRUE; } @@ -471,7 +465,6 @@ void remove_icon(TrayWindow *traywin) // remove from our list systray.list_icons = g_slist_remove(systray.list_icons, traywin); - systray.area.resize = 1; //printf("remove_icon id %lx, %d\n", traywin->id); XSelectInput(server.dsp, traywin->tray_id, NoEventMask); @@ -498,13 +491,11 @@ void remove_icon(TrayWindow *traywin) if (!((TrayWindow*)l->data)->hide) count++; } - if (count == 0) { - systray.area.on_screen = 0; - systray.area.width = 0; - } - // changed in systray force resize on panel - Panel *panel = systray.area.panel; - panel->area.resize = 1; + if (count == 0) + hide(&systray.area); + + // changed in systray + systray.area.resize = 1; panel_refresh = 1; } @@ -541,6 +532,11 @@ void systray_render_icon_now(void* t) // we made also sure, that we always have a 32 bit visual, i.e. we can safely create 32 bit pixmaps here TrayWindow* traywin = t; traywin->render_timeout = 0; + if ( traywin->width == 0 || traywin->height == 0 ) { + // reschedule rendering since the geometry information has not yet been processed (can happen on slow cpu) + systray_render_icon(traywin); + return; + } // good systray icons support 32 bit depth, but some icons are still 24 bit. // We create a heuristic mask for these icons, i.e. we get the rgb value in the top left corner, and