systray: reduce icon flicker by painting on buffer instead of directly on window

This commit is contained in:
o9000 2015-06-21 15:00:01 +02:00
parent 876cae8239
commit ea75558ac2
2 changed files with 12 additions and 14 deletions

View file

@ -923,7 +923,7 @@ void systray_render_icon_composited(void* t)
imlib_image_put_back_data(data); imlib_image_put_back_data(data);
XCopyArea(server.dsp, render_background, systray.area.pix, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x-systray.area.posx, traywin->y-systray.area.posy); XCopyArea(server.dsp, render_background, systray.area.pix, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x-systray.area.posx, traywin->y-systray.area.posy);
render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy); render_image(systray.area.pix, traywin->x-systray.area.posx, traywin->y-systray.area.posy);
XCopyArea(server.dsp, systray.area.pix, panel->main_win, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x, traywin->y); XCopyArea(server.dsp, systray.area.pix, panel->temp_pmap, server.gc, traywin->x-systray.area.posx, traywin->y-systray.area.posy, traywin->width, traywin->height, traywin->x, traywin->y);
imlib_free_image_and_decache(); imlib_free_image_and_decache();
XFreePixmap(server.dsp, tmp_pmap); XFreePixmap(server.dsp, tmp_pmap);
imlib_context_set_visual(server.visual); imlib_context_set_visual(server.visual);

View file

@ -1133,29 +1133,27 @@ start:
fprintf(stderr, BLUE "[%f] %s:%d redrawing panel\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__); fprintf(stderr, BLUE "[%f] %s:%d redrawing panel\n" RESET, profiling_get_time(), __FUNCTION__, __LINE__);
panel_refresh = 0; panel_refresh = 0;
for (i=0 ; i < nb_panel ; i++) { for (i = 0; i < nb_panel ;i++) {
panel = &panel1[i]; panel = &panel1[i];
if (panel->is_hidden) { if (panel->is_hidden) {
XCopyArea(server.dsp, panel->hidden_pixmap, panel->main_win, server.gc, 0, 0, panel->hidden_width, panel->hidden_height, 0, 0); XCopyArea(server.dsp, panel->hidden_pixmap, panel->main_win, server.gc, 0, 0, panel->hidden_width, panel->hidden_height, 0, 0);
XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->hidden_pixmap); XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->hidden_pixmap);
} } else {
else { if (panel->temp_pmap)
if (panel->temp_pmap) XFreePixmap(server.dsp, 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);
rendering(panel); rendering(panel);
XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0); if (panel == (Panel*)systray.area.panel) {
}
}
panel = (Panel*)systray.area.panel;
if (refresh_systray && panel && !panel->is_hidden) { if (refresh_systray && panel && !panel->is_hidden) {
refresh_systray = 0; refresh_systray = 0;
// tint2 doen't draw systray icons. it just redraw background.
XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->temp_pmap); XSetWindowBackgroundPixmap(server.dsp, panel->main_win, panel->temp_pmap);
// force icon's refresh
refresh_systray_icons(); refresh_systray_icons();
} }
}
XCopyArea(server.dsp, panel->temp_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0);
}
}
XFlush(server.dsp); XFlush(server.dsp);
} }