=> c8ab67f3408f6e939ce534513adb03cc300a865e
[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/gemini; charset=utf-8
This content has been proxied by September (3851b).