remove flickering on systray
git-svn-id: http://tint2.googlecode.com/svn/trunk@120 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
parent
4c5408d5fd
commit
c7ba119ff2
4 changed files with 31 additions and 12 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
23
src/tint.c
23
src/tint.c
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue