[1mdiff --git a/src/ui/listwidget.c b/src/ui/listwidget.c[m
[1mindex 7a627188..cf333b78 100644[m
[1m--- a/src/ui/listwidget.c[m
[1m+++ b/src/ui/listwidget.c[m
[36m@@ -71,6 +71,17 @@[m [mstatic void scrollBegan_ListWidget_(iAnyObject *any, int offset, uint32_t span)[m
refreshWhileScrolling_ListWidget_(d);[m
}[m
[m
[32m+[m[32mstatic void visBufferInvalidated_ListWidget_(iVisBuf *d, size_t index) {[m
[32m+[m[32m /* Clear a texture to background color when invalidated. */[m
[32m+[m[32m iVisBufTexture *vbuf = &d->buffers[index];[m
[32m+[m[32m const iListWidget *list = vbuf->user;[m
[32m+[m[32m iPaint p;[m
[32m+[m[32m init_Paint(&p);[m
[32m+[m[32m beginTarget_Paint(&p, vbuf->texture);[m
[32m+[m[32m fillRect_Paint(&p, (iRect){ zero_I2(), d->texSize }, list->widget.bgColor);[m
[32m+[m[32m endTarget_Paint(&p);[m
[32m+[m[32m}[m
[32m+[m
void init_ListWidget(iListWidget *d) {[m
iWidget *w = as_Widget(d);[m
init_Widget(w);[m
[36m@@ -91,7 +102,10 @@[m [mvoid init_ListWidget(iListWidget *d) {[m
init_Click(&d->click, d, SDL_BUTTON_LEFT);[m
init_IntSet(&d->invalidItems);[m
d->visBuf = new_VisBuf();[m
[31m- d->needRepaint = iFalse;[m
[32m+[m[32m iForIndices(i, d->visBuf->buffers) {[m
[32m+[m[32m d->visBuf->buffers[i].user = d;[m
[32m+[m[32m }[m
[32m+[m[32m d->visBuf->bufferInvalidated = visBufferInvalidated_ListWidget_;[m
}[m
[m
void deinit_ListWidget(iListWidget *d) {[m
[36m@@ -104,7 +118,6 @@[m [mvoid deinit_ListWidget(iListWidget *d) {[m
void invalidate_ListWidget(iListWidget *d) {[m
invalidate_VisBuf(d->visBuf);[m
clear_IntSet(&d->invalidItems); /* all will be drawn */[m
[31m- d->needRepaint = iTrue;[m
refresh_Widget(as_Widget(d));[m
}[m
[m
[36m@@ -555,15 +568,7 @@[m [mstatic void draw_ListWidget_(const iListWidget *d) {[m
init_Paint(&p);[m
drawLayerEffects_Widget(w);[m
drawBackground_Widget(w);[m
[31m- if (alloc_VisBuf(d->visBuf, bounds.size, d->itemHeight) ||[m
[31m- d->needRepaint) {[m
[31m- iForIndices(i, d->visBuf->buffers) {[m
[31m- beginTarget_Paint(&p, d->visBuf->buffers[i].texture);[m
[31m- fillRect_Paint(&p, (iRect){ zero_I2(), d->visBuf->texSize }, w->bgColor);[m
[31m- endTarget_Paint(&p);[m
[31m- }[m
[31m- iConstCast(iListWidget *, d)->needRepaint = iFalse;[m
[31m- }[m
[32m+[m[32m alloc_VisBuf(d->visBuf, bounds.size, d->itemHeight);[m
/* Update invalid regions/items. */ {[m
/* TODO: This seems to draw two items per each shift of the visible region, even though[m
one should be enough. Probably an off-by-one error in the calculation of the[m
[36m@@ -577,7 +582,7 @@[m [mstatic void draw_ListWidget_(const iListWidget *d) {[m
const int bottom = numItems_ListWidget(d) * d->itemHeight;[m
const iRangei vis = { scrollY / d->itemHeight * d->itemHeight,[m
((scrollY + bounds.size.y) / d->itemHeight + 1) * d->itemHeight };[m
[31m- const iBool visChanged = reposition_VisBuf(d->visBuf, vis);[m
[32m+[m[32m reposition_VisBuf(d->visBuf, vis);[m
/* Check which parts are invalid. */[m
iRangei invalidRange[iElemCount(d->visBuf->buffers)];[m
invalidRanges_VisBuf(d->visBuf, (iRangei){ 0, bottom }, invalidRange);[m
[1mdiff --git a/src/ui/listwidget.h b/src/ui/listwidget.h[m
[1mindex d59f11ef..da215b19 100644[m
[1m--- a/src/ui/listwidget.h[m
[1m+++ b/src/ui/listwidget.h[m
[36m@@ -73,7 +73,6 @@[m [mstruct Impl_ListWidget {[m
iVisBuf *visBuf;[m
enum iScrollMode scrollMode;[m
iBool noHoverWhileScrolling;[m
[31m- iBool needRepaint;[m
};[m
[m
void init_ListWidget (iListWidget *);[m
[1mdiff --git a/src/ui/visbuf.h b/src/ui/visbuf.h[m
[1mindex 31c2c114..407112dc 100644[m
[1m--- a/src/ui/visbuf.h[m
[1m+++ b/src/ui/visbuf.h[m
[36m@@ -33,7 +33,7 @@[m [mstruct Impl_VisBufTexture {[m
SDL_Texture *texture;[m
int origin;[m
iRangei validRange;[m
[31m- void *user;[m
[32m+[m[32m void user; / user provided data pointer for additional per-buffer data */[m
};[m
[m
#define numBuffers_VisBuf ((size_t) 4)[m
text/plain
This content has been proxied by September (3851b).