X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=8a840ce7130a11499a1b058e554c54c1ffbd1200;hb=fc22af941cf7b9db65a703e9e697490119c70ec2;hp=f1eb7c5273c4c9ebfa6fc9d1d877493238b81d5b;hpb=928fc258ac46f2cc098f714921c028351b07ec31;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index f1eb7c5..8a840ce 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -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,62 +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) { - // TODO : position and size the icon window when position of systray is known - 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; - 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 = icon_size; - traywin->height = icon_size; - if (panel_horizontal) { - if (i % icons_per_column) - posy += icon_size + sysbar->area.paddingx; - else { - posy = start; - posx += (icon_size + systray.area.paddingx); - } - } - else { - if (i % icons_per_row) - posx += icon_size + systray.area.paddingx; - else { - posx = start; - 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); - XResizeWindow(server.dsp, traywin->tray_id, icon_size, 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); @@ -185,16 +129,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) @@ -205,23 +148,73 @@ int resize_systray(void *obj) if (panel_horizontal) { 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); + 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 { 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); + 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; } +void on_change_systray (void *obj) +{ + // 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); + } +} + + // *********************************************** // systray protocol @@ -436,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); @@ -444,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! @@ -460,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; } @@ -473,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); @@ -500,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; } @@ -543,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