diff --git a/event.c b/event.c index a662ddfbe..80a1bdbeb 100644 --- a/event.c +++ b/event.c @@ -495,25 +495,25 @@ event_handle_expose(void *data __attribute__ ((unused)), xcb_connection_t *connection __attribute__ ((unused)), xcb_expose_event_t *ev) { - if(!ev->count) - { - int screen; - client_t *c; + client_t *c; - for(screen = 0; screen < globalconf.nscreen; screen++) - for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) + for(int screen = 0; screen < globalconf.nscreen; screen++) + for(int i = 0; i < globalconf.screens[screen].statusbars.len; i++) + { + statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; + if(statusbar->sw.window == ev->window) { - statusbar_t *statusbar = globalconf.screens[screen].statusbars.tab[i]; - if(statusbar->sw.window == ev->window) - { - simplewindow_refresh_pixmap(&statusbar->sw); - return 0; - } + simplewindow_refresh_pixmap_partial(&statusbar->sw, + ev->x, ev->y, + ev->width, ev->height); + return 0; } + } - if((c = client_getbytitlebarwin(ev->window))) - simplewindow_refresh_pixmap(&c->titlebar->sw); - } + if((c = client_getbytitlebarwin(ev->window))) + simplewindow_refresh_pixmap_partial(&c->titlebar->sw, + ev->x, ev->y, + ev->width, ev->height); return 0; } diff --git a/swindow.c b/swindow.c index 69bd801e6..9d632acee 100644 --- a/swindow.c +++ b/swindow.c @@ -236,12 +236,13 @@ simplewindow_moveresize(simple_window_t *sw, int x, int y, int w, int h) * \param sw The simple window to refresh. */ void -simplewindow_refresh_pixmap(simple_window_t *sw) +simplewindow_refresh_pixmap_partial(simple_window_t *sw, + int16_t x, int16_t y, + uint16_t w, uint16_t h) { xcb_copy_area(globalconf.connection, sw->pixmap, - sw->window, sw->gc, 0, 0, 0, 0, - sw->geometry.width, - sw->geometry.height); + sw->window, sw->gc, x, y, x, y, + w, h); } /** Set a simple window border width. diff --git a/swindow.h b/swindow.h index 33b05dcbc..f17b9fb9a 100644 --- a/swindow.h +++ b/swindow.h @@ -59,9 +59,19 @@ void simplewindow_wipe(simple_window_t *); void simplewindow_move(simple_window_t *, int, int); void simplewindow_resize(simple_window_t *, int, int); void simplewindow_moveresize(simple_window_t *, int, int, int, int); -void simplewindow_refresh_pixmap(simple_window_t *); +void simplewindow_refresh_pixmap_partial(simple_window_t *, int16_t, int16_t, uint16_t, uint16_t); void simplewindow_border_width_set(simple_window_t *, uint32_t); void simplewindow_border_color_set(simple_window_t *, const xcolor_t *); +/** Refresh the window content by copying its pixmap data to its window. + * \param sw The simple window to refresh. + */ +static inline void +simplewindow_refresh_pixmap(simple_window_t *sw) +{ + simplewindow_refresh_pixmap_partial(sw, 0, 0, sw->geometry.width, sw->geometry.height); +} + + #endif // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80