From 8374b8d8765d5223b66b7c426093abd62e611c9c Mon Sep 17 00:00:00 2001 From: nakst <> Date: Mon, 3 Jan 2022 11:36:50 +0000 Subject: [PATCH] bugfixes: double instance close; cursor shadow clearing; populate offset adjust at end of group --- desktop/api.cpp | 9 ++++++++ desktop/list_view.cpp | 48 ++++++++++++++++++++---------------------- kernel/syscall.cpp | 1 + res/Theme Source.dat | Bin 533284 -> 530532 bytes res/Theme.dat | Bin 31320 -> 31316 bytes 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/desktop/api.cpp b/desktop/api.cpp index 57d948a..ab03498 100644 --- a/desktop/api.cpp +++ b/desktop/api.cpp @@ -174,6 +174,7 @@ struct APIInstance { EsFileStore *fileStore; bool closeAfterSaveCompletes; + bool closing; union { EsInstanceClassEditorSettings editorSettings; @@ -953,6 +954,14 @@ void EsInstanceCloseReference(EsInstance *_instance) { void EsInstanceClose(EsInstance *instance) { EsMessageMutexCheck(); + APIInstance *apiInstance = (APIInstance *) instance->_private; + + if (apiInstance->closing) { + return; + } + + apiInstance->closing = true; + if (instance->callback) { EsMessage m = {}; m.type = ES_MSG_INSTANCE_CLOSE; diff --git a/desktop/list_view.cpp b/desktop/list_view.cpp index a02e960..4db86f3 100644 --- a/desktop/list_view.cpp +++ b/desktop/list_view.cpp @@ -460,18 +460,16 @@ struct EsListView : EsElement { addHeader = 1; } - intptr_t band = -position / (fixedSize + gapBetweenItems); + EsListViewIndex band = -position / (fixedSize + gapBetweenItems); if (band < 0) band = 0; position += band * (fixedSize + gapBetweenItems); - if (flags & ES_LIST_VIEW_TILED) { - band *= GetItemsPerBand(); - } + EsListViewIndex itemsPerBand = (flags & ES_LIST_VIEW_TILED) ? GetItemsPerBand() : 1; + index.iterateIndex.index = band * itemsPerBand + addHeader; - index.iterateIndex.index = band + addHeader; - - if (index.iterateIndex.index >= (intptr_t) group->itemCount) { + if (index.iterateIndex.index >= group->itemCount) { index.iterateIndex.index = group->itemCount - 1; + position += (index.iterateIndex.index / itemsPerBand - band) * (fixedSize + gapBetweenItems); } *_position = position; @@ -560,24 +558,6 @@ struct EsListView : EsElement { } void _Populate() { -#if 0 - EsPrint("--- Before Populate() ---\n"); - EsPrint("Scroll: %i\n", (int) (scroll.position[1] - style->insets.t)); - - for (uintptr_t i = 0; i < visibleItems.Length(); i++) { - EsMessage m = { ES_MSG_LIST_VIEW_GET_CONTENT }; - uint8_t _buffer[512]; - EsBuffer buffer = { .out = _buffer, .bytes = sizeof(_buffer) }; - m.getContent.buffer = &buffer; - m.getContent.index = visibleItems[i].index; - m.getContent.group = visibleItems[i].group; - EsMessageSend(this, &m); - EsPrint("%d: %d '%s' at %i\n", i, visibleItems[i].index, buffer.position, _buffer, visibleItems[i].element->offsetY - GetListBounds().t); - } - - EsPrint("------\n"); -#endif - // TODO Keep one item before and after the viewport, so tab traversal on custom elements works. // TODO Always keep an item if it has FOCUS_WITHIN. // - But maybe we shouldn't allow focusable elements in a list view. @@ -2117,6 +2097,24 @@ void ListViewPopulateActionCallback(EsElement *element, EsGeneric) { view->populateQueued = false; view->_Populate(); EsAssert(!view->populateQueued); + +#if 0 + if (element->flags & ES_ELEMENT_DEBUG) { + EsPrint("Populate complete for list %x with scroll %i:\n", view, view->scroll.position[1]); + + for (uintptr_t i = 0; i < view->visibleItems.Length(); i++) { + EsMessage m = { ES_MSG_LIST_VIEW_GET_CONTENT }; + uint8_t _buffer[512]; + EsBuffer buffer = { .out = _buffer, .bytes = sizeof(_buffer) }; + m.getContent.buffer = &buffer; + m.getContent.index = view->visibleItems[i].index; + m.getContent.group = view->visibleItems[i].group; + EsMessageSend(view, &m); + EsPrint("\t%d: %d '%s' at %i\n", i, view->visibleItems[i].index, buffer.position, _buffer, + view->visibleItems[i].element->offsetY - view->GetListBounds().t); + } + } +#endif } void ListViewEnsureVisibleActionCallback(EsElement *element, EsGeneric) { diff --git a/kernel/syscall.cpp b/kernel/syscall.cpp index 4261a73..9205da7 100644 --- a/kernel/syscall.cpp +++ b/kernel/syscall.cpp @@ -911,6 +911,7 @@ SYSCALL_IMPLEMENT(ES_SYSCALL_WINDOW_SET_CURSOR) { if (windowManager.cursorSurface.Resize(width, height) && windowManager.cursorSwap.Resize(width, height) && windowManager.cursorTemporary.Resize(width, height)) { + EsMemoryZero(windowManager.cursorSurface.bits, windowManager.cursorSurface.width * windowManager.cursorSurface.height * 4); windowManager.cursorSurface.SetBits((K_USER_BUFFER const void *) argument1, argument3 & 0xFFFFFF, ES_RECT_4PD(CURSOR_PADDING_L, CURSOR_PADDING_T, imageWidth, imageHeight)); diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 0753544a2d033c59f68982a5d965552393ff78e7..0af32ac78ea3a0ad05ca6197132bdc9dd8497084 100644 GIT binary patch delta 261 zcmZ2-OyS7}1ujMg28LW_28JBg$#NQI8yyaaO?Ozq$UXh^JSM5hydmtHb;KnZCr65E zO!rM-)R=tLOnveiGtJ4dKzaiw`{dbjJe!MUCz@A22g=PL>pr2Q#KyIxs?5lQSVg9NXVSvA$uPUhsf<&Saht z{^`+XEQ*t-+*X+UL5yRwhju38$VT6ecgY#5wsUqdbu2n9QN6u>Fq{yU%R^<%3yV delta 542 zcmYk2PiPZS5XLjR`}QTJ#H1}YIkeeB?B*cJrjdf!LjnrcgGn#aK!p@hLK|tUIaEQh zsMLagvOeTf6b#r3UbGTr1us3>Qz1nPMaAx+y_JSsgrE>NMbv?hVTNJm_s#aQw)jcw zAeYN^Np`sk4E-hzy-lthBtJ%))V+!owgpIVY`H13lw(l#$S_eC4VS+LNUvHsJ)?p!|1CP z>tiHclX3k$4YV5%8_9M;Zb{9H%%(HhRP(Sm$iW*_{xGI*E2nVJA{}?XaAUqQ&aBF~ z`eI9xOf!|h>@bgD_mSkr2a`0%$2#r%80MG1BKM9N{sMD;_+NODN>Lci9qttmqCwik z+$z^$pOoU_)nJGwF|n%Z(iFq}@BAflKV=Q}7V`-$9)Mx9xLE7uqGkkyeb|F1w|I=E zV6O25*U%_l- zjHIu@F13>OuWrD$jNCo9F`)zVnlUo_0c_h~&tS10_?h^-m!da*$Ak}E zborEM-^h*eyzTfEm_x%F$ZSR|633#RpXZJ%r3#$IYShH4O0F!H*Ij@vS?gy^v^xLl7_YxO~**Vxu`-lGXbcXaXzr`pHZ`C4JIv#50K-Evs*3S7|~3 delta 603 zcmZ9Jze~eF6vy8+Ib*PNXaYL;1EmT=k=DfyW+>D;Xf?423J#9q>=H%N;_6c0;^3g0 zV>8BCQrPkj%-f&^20 zwYWOyc&9Kc38T{IU?)IK