remove flickering on systray

git-svn-id: http://tint2.googlecode.com/svn/trunk@120 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
lorthiois@bbsoft.fr 2009-06-20 15:08:33 +00:00
parent 4c5408d5fd
commit c7ba119ff2
4 changed files with 31 additions and 12 deletions

View file

@ -1,3 +1,6 @@
2009-06-20
- remove flickering on systray
2009-06-20 2009-06-20
- 'urgent_nb_of_blink' allow to choose the number of blink - 'urgent_nb_of_blink' allow to choose the number of blink

View file

@ -42,6 +42,7 @@ Window net_sel_win = None, hint_win = None;
// freedesktop specification doesn't allow multi systray // freedesktop specification doesn't allow multi systray
Systraybar systray; Systraybar systray;
int refresh_systray;
void init_systray() void init_systray()
@ -56,7 +57,9 @@ void init_systray()
systray.area.parent = panel; systray.area.parent = panel;
systray.area.panel = panel; systray.area.panel = panel;
systray.area._draw_foreground = draw_systray;
systray.area._resize = resize_systray; systray.area._resize = resize_systray;
refresh_systray = 0;
// configure systray // configure systray
// draw only one systray (even with multi panel) // 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) void resize_systray(void *obj)
{ {
Systraybar *sysbar = obj; Systraybar *sysbar = obj;
@ -310,7 +320,7 @@ void net_message(XClientMessageEvent *e)
} }
void refresh_systray() void refresh_systray_icon()
{ {
TrayWindow *traywin; TrayWindow *traywin;
GSList *l; GSList *l;

View file

@ -33,6 +33,7 @@ typedef struct
extern Window net_sel_win; extern Window net_sel_win;
extern Systraybar systray; extern Systraybar systray;
extern int refresh_systray;
void init_systray(); void init_systray();
@ -44,9 +45,11 @@ void net_message(XClientMessageEvent *e);
void remove_icon(TrayWindow *traywin); void remove_icon(TrayWindow *traywin);
void draw_systray(void *obj, cairo_t *c, int active);
void resize_systray(void *obj); void resize_systray(void *obj);
void refresh_systray(); void refresh_systray_icon();
#endif #endif

View file

@ -650,26 +650,29 @@ load_config:
if (panel_refresh) { if (panel_refresh) {
panel_refresh = 0; 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++) { for (i=0 ; i < nb_panel ; i++) {
panel = &panel1[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); 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); panel->temp_pmap = XCreatePixmap(server.dsp, server.root_win, panel->area.width, panel->area.height, server.depth);
refresh(&panel->area); refresh(&panel->area);
XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); 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); 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();
}
} }
} }
} }