+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;
+ 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;
+ //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);
+ }
+}
+
+