X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsystray%2Fsystraybar.c;h=c0672e35b7335d1fde481e71f8f2326729215580;hb=87acd48b92031b378887ea8b7ea9fa54aea8fa25;hp=2d13af46b457eb0c908cb7b01f8464530f1e1079;hpb=bbec33ce1a15b555a737f2fefe7bdfb6a8881705;p=chaz%2Ftint2 diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index 2d13af4..c0672e3 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,11 +96,11 @@ void init_systray() void init_systray_panel(void *p) { - Panel *panel =(Panel*)p; - systray.area.parent = p; systray.area.panel = p; - + if (systray.area.bg == 0) + systray.area.bg = &g_array_index(backgrounds, Background, 0); + GSList *l; int count = 0; for (l = systray.list_icons; l ; l = l->next) { @@ -107,61 +108,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); @@ -212,6 +167,57 @@ 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; + 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); + } +} + + // *********************************************** // systray protocol @@ -426,7 +432,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); @@ -488,10 +494,9 @@ void remove_icon(TrayWindow *traywin) if (!((TrayWindow*)l->data)->hide) count++; } - if (count == 0) { - systray.area.on_screen = 0; - systray.area.width = 0; - } + if (count == 0) + hide(&systray.area); + // changed in systray systray.area.resize = 1; panel_refresh = 1; @@ -530,6 +535,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