From 101ed479957ad40d2579faddb858a62a554007a3 Mon Sep 17 00:00:00 2001 From: Thierry Lorthiois Date: Sat, 20 Jun 2009 15:08:33 +0000 Subject: [PATCH] remove flickering on systray --- ChangeLog | 3 +++ src/systray/systraybar.c | 12 +++++++++++- src/systray/systraybar.h | 5 ++++- src/tint.c | 23 +++++++++++++---------- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2687011..17d03af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2009-06-20 +- remove flickering on systray + 2009-06-20 - 'urgent_nb_of_blink' allow to choose the number of blink diff --git a/src/systray/systraybar.c b/src/systray/systraybar.c index d382d8a..f0adce7 100644 --- a/src/systray/systraybar.c +++ b/src/systray/systraybar.c @@ -42,6 +42,7 @@ Window net_sel_win = None, hint_win = None; // freedesktop specification doesn't allow multi systray Systraybar systray; +int refresh_systray; void init_systray() @@ -56,7 +57,9 @@ void init_systray() systray.area.parent = panel; systray.area.panel = panel; + systray.area._draw_foreground = draw_systray; systray.area._resize = resize_systray; + refresh_systray = 0; // configure systray // draw only one systray (even with multi panel) @@ -93,6 +96,13 @@ void cleanup_systray() } +void draw_systray(void *obj, cairo_t *c, int active) +{ + // tint2 don't draw systray icons. just the background. + refresh_systray = 1; +} + + void resize_systray(void *obj) { Systraybar *sysbar = obj; @@ -310,7 +320,7 @@ void net_message(XClientMessageEvent *e) } -void refresh_systray() +void refresh_systray_icon() { TrayWindow *traywin; GSList *l; diff --git a/src/systray/systraybar.h b/src/systray/systraybar.h index 4f36971..dbe3fbe 100644 --- a/src/systray/systraybar.h +++ b/src/systray/systraybar.h @@ -33,6 +33,7 @@ typedef struct extern Window net_sel_win; extern Systraybar systray; +extern int refresh_systray; void init_systray(); @@ -44,9 +45,11 @@ void net_message(XClientMessageEvent *e); void remove_icon(TrayWindow *traywin); +void draw_systray(void *obj, cairo_t *c, int active); + void resize_systray(void *obj); -void refresh_systray(); +void refresh_systray_icon(); #endif diff --git a/src/tint.c b/src/tint.c index da98965..94ec86c 100644 --- a/src/tint.c +++ b/src/tint.c @@ -650,26 +650,29 @@ load_config: if (panel_refresh) { panel_refresh = 0; + if (refresh_systray) { + panel = (Panel*)systray.area.panel; + XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None); + } for (i=0 ; i < nb_panel ; i++) { panel = &panel1[i]; - if (panel == systray.area.panel) - XSetWindowBackgroundPixmap (server.dsp, panel->main_win, None); - if (panel->temp_pmap) XFreePixmap(server.dsp, panel->temp_pmap); panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth); refresh(&panel->area); XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); - - if (panel == systray.area.panel) { - // tint2 doen't draw systray icons. it just redraw background. - XSetWindowBackgroundPixmap (server.dsp, panel->main_win, panel->temp_pmap); - // force icon's refresh - refresh_systray(); - } } XFlush (server.dsp); + + if (refresh_systray) { + refresh_systray = 0; + panel = (Panel*)systray.area.panel; + // tint2 doen't draw systray icons. it just redraw background. + XSetWindowBackgroundPixmap (server.dsp, panel->main_win, panel->temp_pmap); + // force icon's refresh + refresh_systray_icon(); + } } } } -- 2.44.0