X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=0b92bb002d42896aca56a7fad8958eb4b6c26cef;hb=2fd9e91579d04f8eeadea8a1584b2d994626a8f1;hp=4161a6a0ea79f19020e6afd55214366540aca47e;hpb=7a03bbf353324d6803aa84ca8fd41e6c6f4d099c;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 4161a6a..0b92bb0 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -90,10 +90,6 @@ void init_systray() systray.alpha = 100; systray.brightness = systray.saturation = 0; } - systray.area.resize = 1; - systray.area.redraw = 1; - systray.area.on_screen = 1; - refresh_systray = 0; } @@ -111,17 +107,28 @@ void init_systray_panel(void *p) } systray.area.parent = p; systray.area.panel = p; + + GSList *l; + int count = 0; + for (l = systray.list_icons; l ; l = l->next) { + if (!((TrayWindow*)l->data)->hide) + count++; + } + if (count == 0) + systray.area.on_screen = 0; + else + systray.area.on_screen = 1; + refresh_systray = 0; } void draw_systray(void *obj, cairo_t *c) { - // TODO : position and size the icon window when position of systray is known + // 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, marging=3, icons_per_column=1, icons_per_row=1; - int icon_size = 24; - int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +marging/2; + 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; @@ -139,28 +146,28 @@ void draw_systray(void *obj, cairo_t *c) traywin->y = posy; traywin->x = posx; - traywin->width = icon_size; - traywin->height = icon_size; + traywin->width = sysbar->icon_size; + traywin->height = sysbar->icon_size; if (panel_horizontal) { - if (i % icons_per_column) - posy += icon_size + sysbar->area.paddingx; + if (i % sysbar->icons_per_column) + posy += sysbar->icon_size + sysbar->area.paddingx; else { posy = start; - posx += (icon_size + systray.area.paddingx); + posx += (sysbar->icon_size + systray.area.paddingx); } } else { - if (i % icons_per_row) - posx += icon_size + systray.area.paddingx; + if (i % sysbar->icons_per_row) + posx += sysbar->icon_size + systray.area.paddingx; else { posx = start; - posy += (icon_size + systray.area.paddingx); + posy += (sysbar->icon_size + systray.area.paddingx); } } // position and size the icon window - XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, icon_size, icon_size); - XResizeWindow(server.dsp, traywin->tray_id, icon_size, icon_size); + 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) { @@ -177,16 +184,15 @@ int resize_systray(void *obj) { Systraybar *sysbar = obj; GSList *l; - int count, icon_size; - int icons_per_column=1, icons_per_row=1, marging=0; + int count; if (panel_horizontal) - icon_size = sysbar->area.height; + sysbar->icon_size = sysbar->area.height; else - icon_size = sysbar->area.width; - icon_size = icon_size - (2 * sysbar->area.bg->border.width) - (2 * sysbar->area.paddingy); - if (systray_max_icon_size > 0 && icon_size > systray_max_icon_size) - icon_size = systray_max_icon_size; + sysbar->icon_size = sysbar->area.width; + sysbar->icon_size = sysbar->icon_size - (2 * sysbar->area.bg->border.width) - (2 * sysbar->area.paddingy); + if (systray_max_icon_size > 0 && sysbar->icon_size > systray_max_icon_size) + sysbar->icon_size = systray_max_icon_size; count = 0; for (l = systray.list_icons; l ; l = l->next) { if (!((TrayWindow*)l->data)->hide) @@ -195,26 +201,20 @@ int resize_systray(void *obj) //printf("count %d\n", count); if (panel_horizontal) { - if (!count) systray.area.width = 0; - else { - int height = sysbar->area.height - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; - // here icons_per_column always higher than 0 - icons_per_column = (height+sysbar->area.paddingx) / (icon_size+sysbar->area.paddingx); - marging = height - (icons_per_column-1)*(icon_size+sysbar->area.paddingx) - icon_size; - icons_per_row = count / icons_per_column + (count%icons_per_column != 0); - systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (icon_size * icons_per_row) + ((icons_per_row-1) * systray.area.paddingx); - } + int height = sysbar->area.height - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; + // here icons_per_column always higher than 0 + sysbar->icons_per_column = (height+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx); + sysbar->marging = height - (sysbar->icons_per_column-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size; + sysbar->icons_per_row = count / sysbar->icons_per_column + (count%sysbar->icons_per_column != 0); + systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_row) + ((sysbar->icons_per_row-1) * systray.area.paddingx); } else { - if (!count) systray.area.height = 0; - else { - int width = sysbar->area.width - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; - // here icons_per_row always higher than 0 - icons_per_row = (width+sysbar->area.paddingx) / (icon_size+sysbar->area.paddingx); - marging = width - (icons_per_row-1)*(icon_size+sysbar->area.paddingx) - icon_size; - icons_per_column = count / icons_per_row+ (count%icons_per_row != 0); - systray.area.height = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (icon_size * icons_per_column) + ((icons_per_column-1) * systray.area.paddingx); - } + int width = sysbar->area.width - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; + // here icons_per_row always higher than 0 + sysbar->icons_per_row = (width+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx); + sysbar->marging = width - (sysbar->icons_per_row-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size; + sysbar->icons_per_column = count / sysbar->icons_per_row+ (count%sysbar->icons_per_row != 0); + systray.area.height = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_column) + ((sysbar->icons_per_column-1) * systray.area.paddingx); } return 1; } @@ -433,6 +433,9 @@ gboolean add_icon(Window id) traywin->depth = attr.depth; traywin->damage = 0; + if (systray.area.on_screen == 0) + systray.area.on_screen = 1; + if (systray.sort == 3) systray.list_icons = g_slist_prepend(systray.list_icons, traywin); else if (systray.sort == 2) @@ -488,6 +491,17 @@ void remove_icon(TrayWindow *traywin) stop_timeout(traywin->render_timeout); g_free(traywin); + // check empty systray + int count = 0; + GSList *l; + for (l = systray.list_icons; l ; l = l->next) { + 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;