=> 0e7060d5306fef1f585982cc78223250d3ee8551
[1mdiff --git a/src/app.c b/src/app.c[m [1mindex e597edbe..fa601ac3 100644[m [1m--- a/src/app.c[m [1m+++ b/src/app.c[m [36m@@ -1273,6 +1273,7 @@[m [mvoid processEvents_App(enum iAppEventMode eventMode) {[m }[m }[m #endif[m [32m+[m[32m const iWidget *oldHover = d->window->hover;[m iBool wasUsed = processEvent_Window(d->window, &ev);[m if (!wasUsed) {[m /* There may be a key bindings for this. */[m [36m@@ -1307,6 +1308,11 @@[m [mvoid processEvents_App(enum iAppEventMode eventMode) {[m /* Allocated by postCommand_Apps(). */[m free(ev.user.data1);[m }[m [32m+[m[32m /* Update when hover has changed. */[m [32m+[m[32m if (oldHover != d->window->hover) {[m [32m+[m[32m refresh_Widget(oldHover);[m [32m+[m[32m refresh_Widget(d->window->hover);[m [32m+[m[32m }[m break;[m }[m }[m [1mdiff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c[m [1mindex 802a2d6c..59d62544 100644[m [1m--- a/src/ui/inputwidget.c[m [1m+++ b/src/ui/inputwidget.c[m [36m@@ -27,6 +27,7 @@[m [mSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */[m #include "keys.h"[m #include "prefs.h"[m #include "lang.h"[m [32m+[m[32m#include "touch.h"[m #include "app.h"[m [m #include[m [36m@@ -1565,11 +1566,11 @@[m [mstatic iBool processEvent_InputWidget_(iInputWidget *d, const SDL_Event *ev) {[m }[m switch (processEvent_Click(&d->click, ev)) {[m case none_ClickResult:[m [31m- if (ev->type == SDL_MOUSEBUTTONUP &&[m [31m- deviceType_App() != desktop_AppDeviceType && isFocused_Widget(d)) {[m [31m- setFocus_Widget(NULL);[m [31m- return iTrue;[m [31m- }[m [32m+[m[32m// if (ev->type == SDL_MOUSEBUTTONUP &&[m [32m+[m[32m// deviceType_App() != desktop_AppDeviceType && isFocused_Widget(d)) {[m [32m+[m[32m// setFocus_Widget(NULL);[m [32m+[m[32m// return iTrue;[m [32m+[m[32m// }[m break;[m case started_ClickResult: {[m setFocus_Widget(w);[m [1mdiff --git a/src/ui/listwidget.c b/src/ui/listwidget.c[m [1mindex 46d32e9a..6fa23986 100644[m [1m--- a/src/ui/listwidget.c[m [1m+++ b/src/ui/listwidget.c[m [36m@@ -391,6 +391,7 @@[m [mstatic void draw_ListWidget_(const iListWidget *d) {[m const int scrollY = pos_SmoothScroll(&d->scrollY);[m iPaint p;[m init_Paint(&p);[m [32m+[m[32m drawLayerEffects_Widget(w);[m drawBackground_Widget(w);[m alloc_VisBuf(d->visBuf, bounds.size, d->itemHeight);[m /* Update invalid regions/items. */ {[m [1mdiff --git a/src/ui/mobile.c b/src/ui/mobile.c[m [1mindex 9e2dc4f7..4c183ffa 100644[m [1m--- a/src/ui/mobile.c[m [1m+++ b/src/ui/mobile.c[m [36m@@ -129,6 +129,12 @@[m [mstatic iBool mainDetailSplitHandler_(iWidget *mainDetailSplit, const char *cmd)[m }[m arrange_Widget(mainDetailSplit);[m }[m [32m+[m[32m else if (equal_Command(cmd, "mouse.clicked") && arg_Command(cmd)) {[m [32m+[m[32m if (focus_Widget() && class_Widget(focus_Widget()) == &Class_InputWidget) {[m [32m+[m[32m setFocus_Widget(NULL);[m [32m+[m[32m return iTrue;[m [32m+[m[32m }[m [32m+[m[32m }[m return iFalse;[m }[m [m [36m@@ -331,7 +337,7 @@[m [mstatic iWidget *makeValuePaddingWithHeading_(iLabelWidget *heading, iWidget *val[m //setFixedSize_Widget(as_Widget(heading), init_I2(-1, height_Widget(value)));[m setFont_LabelWidget(heading, labelFont_());[m setTextColor_LabelWidget(heading, uiTextStrong_ColorId);[m [31m- if (isInput) {[m [32m+[m[32m if (isInput && ~value->flags & fixedWidth_WidgetFlag) {[m addChildFlags_Widget(div, iClob(value), expand_WidgetFlag);[m }[m else if (isInstance_Object(value, &Class_LabelWidget) &&[m [36m@@ -388,6 +394,27 @@[m [mstatic size_t countItems_(const iMenuItem *itemsNullTerminated) {[m return num;[m }[m [m [32m+[m[32mstatic iBool dropdownHeadingHandler_(iWidget *d, const char *cmd) {[m [32m+[m[32m if (isVisible_Widget(d) &&[m [32m+[m[32m equal_Command(cmd, "mouse.clicked") && contains_Widget(d, coord_Command(cmd)) &&[m [32m+[m[32m arg_Command(cmd)) {[m [32m+[m[32m postCommand_Widget(userData_Object(d),[m [32m+[m[32m cstr_String(command_LabelWidget(userData_Object(d))));[m [32m+[m[32m return iTrue;[m [32m+[m[32m }[m [32m+[m[32m return iFalse;[m [32m+[m[32m}[m [32m+[m [32m+[m[32mstatic iBool inputHeadingHandler_(iWidget *d, const char *cmd) {[m [32m+[m[32m if (isVisible_Widget(d) &&[m [32m+[m[32m equal_Command(cmd, "mouse.clicked") && contains_Widget(d, coord_Command(cmd)) &&[m [32m+[m[32m arg_Command(cmd)) {[m [32m+[m[32m setFocus_Widget(userData_Object(d));[m [32m+[m[32m return iTrue;[m [32m+[m[32m }[m [32m+[m[32m return iFalse;[m [32m+[m[32m}[m [32m+[m void makePanelItem_Mobile(iWidget *panel, const iMenuItem *item) {[m iWidget * widget = NULL;[m iLabelWidget *heading = NULL;[m [36m@@ -434,6 +461,8 @@[m [mvoid makePanelItem_Mobile(iWidget *panel, const iMenuItem *item) {[m frameless_WidgetFlag, iTrue);[m setId_Widget(as_Widget(drop), id);[m widget = makeValuePaddingWithHeading_(heading = makeHeading_Widget(label), as_Widget(drop));[m [32m+[m[32m setCommandHandler_Widget(widget, dropdownHeadingHandler_);[m [32m+[m[32m setUserData_Object(widget, drop);[m }[m else if (equal_Command(spec, "radio") || equal_Command(spec, "buttons")) {[m const iBool isRadio = equal_Command(spec, "radio");[m [36m@@ -504,6 +533,8 @@[m [mvoid makePanelItem_Mobile(iWidget *panel, const iMenuItem *item) {[m }[m widget = makeValuePaddingWithHeading_(heading = makeHeading_Widget(label),[m as_Widget(input));[m [32m+[m[32m setCommandHandler_Widget(widget, inputHeadingHandler_);[m [32m+[m[32m setUserData_Object(widget, input);[m }[m }[m else if (equal_Command(spec, "button")) {[m [1mdiff --git a/src/ui/paint.c b/src/ui/paint.c[m [1mindex af62f908..71ebb81d 100644[m [1m--- a/src/ui/paint.c[m [1m+++ b/src/ui/paint.c[m [36m@@ -65,10 +65,33 @@[m [mvoid endTarget_Paint(iPaint *d) {[m [m void setClip_Paint(iPaint *d, iRect rect) {[m //rect = intersect_Rect(rect, rect_Root(get_Root()));[m [32m+[m[32m addv_I2(&rect.pos, origin_Paint);[m if (isEmpty_Rect(rect)) {[m rect = init_Rect(0, 0, 1, 1);[m }[m [31m- addv_I2(&rect.pos, origin_Paint);[m [32m+[m[32m// iRect root = rect_Root(get_Root());[m [32m+[m[32m iRect targetRect = zero_Rect();[m [32m+[m[32m SDL_Texture *target = SDL_GetRenderTarget(renderer_Paint_(d));[m [32m+[m[32m if (target) {[m [32m+[m[32m SDL_QueryTexture(target, NULL, NULL, &targetRect.size.x, &targetRect.size.y);[m [32m+[m[32m rect = intersect_Rect(rect, targetRect);[m [32m+[m[32m }[m [32m+[m[32m else {[m [32m+[m[32m rect = intersect_Rect(rect, rect_Root(get_Root()));[m [32m+[m[32m }[m [32m+[m[41m [m [32m+[m[32m /*if (rect.pos.x < 0) {[m [32m+[m[32m adjustEdges_Rect(&rect, 0, 0, 0, -rect.pos.x);[m [32m+[m[32m }[m [32m+[m[32m if (rect.pos.y < 0) {[m [32m+[m[32m adjustEdges_Rect(&rect, -rect.pos.y, 0, 0, 0);[m [32m+[m[32m }[m [32m+[m[32m if (right_Rect(rect) > right_Rect(root)) {[m [32m+[m[32m adjustEdges_Rect(&rect, 0, right_Rect(root) - right_Rect(rect), 0, 0);[m [32m+[m[32m }[m [32m+[m[32m if (bottom_Rect(rect) > bottom_Rect(root)) {[m [32m+[m[32m adjustEdges_Rect(&rect, 0, bottom_Rect(root) - bottom_Rect(rect), 0, 0);[m [32m+[m[32m }*/[m SDL_RenderSetClipRect(renderer_Paint_(d), (const SDL_Rect *) &rect);[m }[m [m [1mdiff --git a/src/ui/root.c b/src/ui/root.c[m [1mindex 7b2b5b15..59f98aa4 100644[m [1m--- a/src/ui/root.c[m [1m+++ b/src/ui/root.c[m [36m@@ -525,7 +525,9 @@[m [mvoid updateToolbarColors_Root(iRoot *d) {[m #if defined (iPlatformMobile)[m iWidget *toolBar = findChild_Widget(d->widget, "toolbar");[m if (toolBar) {[m [31m- const iBool isSidebarVisible = isVisible_Widget(findChild_Widget(d->widget, "sidebar"));[m [32m+[m[32m const iBool isSidebarVisible =[m [32m+[m[32m isVisible_Widget(findChild_Widget(d->widget, "sidebar")) ||[m [32m+[m[32m isVisible_Widget(findChild_Widget(d->widget, "sidebar2"));[m const int bg = isSidebarVisible ? uiBackgroundSidebar_ColorId :[m tmBannerBackground_ColorId;[m setBackgroundColor_Widget(toolBar, bg);[m [1mdiff --git a/src/ui/touch.c b/src/ui/touch.c[m [1mindex f0456acb..5fc8f245 100644[m [1m--- a/src/ui/touch.c[m [1m+++ b/src/ui/touch.c[m [36m@@ -254,6 +254,8 @@[m [mstatic iFloat3 gestureVector_Touch_(const iTouch *d) {[m }[m [m static void update_TouchState_(void *ptr) {[m [32m+[m[32m iWindow *win = get_Window();[m [32m+[m[32m const iWidget *oldHover = win->hover;[m iTouchState *d = ptr;[m /* Check for long presses to simulate right clicks. */[m const uint32_t nowTime = SDL_GetTicks();[m [36m@@ -293,6 +295,7 @@[m [mstatic void update_TouchState_(void *ptr) {[m /* Looks like a possible tap. */[m dispatchNotification_Touch_(touch, widgetTapBegins_UserEventCode);[m dispatchMotion_Touch_(touch->pos[0], 0);[m [32m+[m[32m refresh_Widget(touch->affinity);[m touch->isTapBegun = iTrue;[m }[m if (!touch->isTapAndHold && nowTime - touch->startTime >= longPressSpanMs_ &&[m [36m@@ -363,6 +366,10 @@[m [mstatic void update_TouchState_(void *ptr) {[m if (!isEmpty_Array(d->touches) || !isEmpty_Array(d->moms)) {[m addTickerRoot_App(update_TouchState_, NULL, ptr);[m }[m [32m+[m[32m if (oldHover != win->hover) {[m [32m+[m[32m refresh_Widget(oldHover);[m [32m+[m[32m refresh_Widget(win->hover);[m [32m+[m[32m }[m }[m [m #if 0[m [1mdiff --git a/src/ui/util.c b/src/ui/util.c[m [1mindex 05d39c01..48ed41a6 100644[m [1m--- a/src/ui/util.c[m [1m+++ b/src/ui/util.c[m [36m@@ -1349,10 +1349,17 @@[m [miWidget *makeValueInput_Widget(iWidget *parent, const iString *initialValue, con[m 2)));[m // finalizeSheet_Mobile(dlg);[m arrange_Widget(dlg);[m [31m- setupSheetTransition_Mobile(dlg, incoming_TransitionFlag | top_TransitionDir);[m if (parent) {[m setFocus_Widget(as_Widget(input));[m }[m [32m+[m[32m /* Check that the top is in the safe area. */ {[m [32m+[m[32m int top = top_Rect(bounds_Widget(dlg));[m [32m+[m[32m int delta = top - top_Rect(safeRect_Root(dlg->root));[m [32m+[m[32m if (delta < 0) {[m [32m+[m[32m dlg->rect.pos.y -= delta;[m [32m+[m[32m }[m [32m+[m[32m }[m [32m+[m[32m setupSheetTransition_Mobile(dlg, incoming_TransitionFlag | top_TransitionDir);[m return dlg;[m }[m [m [1mdiff --git a/src/ui/widget.c b/src/ui/widget.c[m [1mindex 7665c5bc..0765bf9f 100644[m [1m--- a/src/ui/widget.c[m [1m+++ b/src/ui/widget.c[m [36m@@ -89,7 +89,7 @@[m [mstatic void release_WidgetDrawBuffer(iWidgetDrawBuffer *d) {[m static iRect boundsForDraw_Widget_(const iWidget *d) {[m iRect bounds = bounds_Widget(d);[m if (d->flags & drawBackgroundToBottom_WidgetFlag) {[m [31m- bounds.size.y = iMaxi(bounds.size.y, size_Root(d->root).y - top_Rect(bounds));[m [32m+[m[32m bounds.size.y = iMax(bounds.size.y, size_Root(d->root).y);[m }[m return bounds;[m }[m [36m@@ -1218,7 +1218,7 @@[m [miLocalDef iBool isDrawn_Widget_(const iWidget *d) {[m return ~d->flags & hidden_WidgetFlag || d->flags & visualOffset_WidgetFlag;[m }[m [m [31m-static void drawLayerEffects_Widget_(const iWidget *d) {[m [32m+[m[32mvoid drawLayerEffects_Widget(const iWidget *d) {[m /* Layered effects are not buffered, so they are drawn here separately. */[m iAssert(isDrawn_Widget_(d));[m iBool shadowBorder = (d->flags & keepOnTop_WidgetFlag && ~d->flags & mouseModal_WidgetFlag) != 0;[m [36m@@ -1248,6 +1248,48 @@[m [mstatic void drawLayerEffects_Widget_(const iWidget *d) {[m fillRect_Paint(&p, rect_Root(d->root), backgroundFadeColor_Widget());[m SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_NONE);[m }[m [32m+[m[32m#if defined (iPlatformAppleMobile)[m [32m+[m[32m if (d->bgColor >= 0 && d->flags & (drawBackgroundToHorizontalSafeArea_WidgetFlag |[m [32m+[m[32m drawBackgroundToVerticalSafeArea_WidgetFlag)) {[m [32m+[m[32m iPaint p;[m [32m+[m[32m init_Paint(&p);[m [32m+[m[32m const iRect rect = bounds_Widget(d);[m [32m+[m[32m const iInt2 rootSize = size_Root(d->root);[m [32m+[m[32m const iInt2 center = divi_I2(rootSize, 2);[m [32m+[m[32m int top = 0, right = 0, bottom = 0, left = 0;[m [32m+[m[32m if (d->flags & drawBackgroundToHorizontalSafeArea_WidgetFlag) {[m [32m+[m[32m const iBool isWide = width_Rect(rect) > rootSize.x * 9 / 10;[m [32m+[m[32m if (isWide || mid_Rect(rect).x < center.x) {[m [32m+[m[32m left = -left_Rect(rect);[m [32m+[m[32m }[m [32m+[m[32m if (isWide || mid_Rect(rect).x > center.x) {[m [32m+[m[32m right = rootSize.x - right_Rect(rect);[m [32m+[m[32m }[m [32m+[m[32m }[m [32m+[m[32m if (d->flags & drawBackgroundToVerticalSafeArea_WidgetFlag) {[m [32m+[m[32m if (top_Rect(rect) > center.y) {[m [32m+[m[32m bottom = rootSize.y - bottom_Rect(rect);[m [32m+[m[32m }[m [32m+[m[32m if (bottom_Rect(rect) < center.y) {[m [32m+[m[32m top = -top_Rect(rect);[m [32m+[m[32m }[m [32m+[m[32m }[m [32m+[m[32m if (top < 0) {[m [32m+[m[32m fillRect_Paint(&p, (iRect){ init_I2(left_Rect(rect), 0),[m [32m+[m[32m init_I2(width_Rect(rect), top_Rect(rect)) },[m [32m+[m[32m d->bgColor);[m [32m+[m[32m }[m [32m+[m[32m if (left < 0) {[m [32m+[m[32m fillRect_Paint(&p, (iRect){ init_I2(0, top_Rect(rect)),[m [32m+[m[32m init_I2(left_Rect(rect), height_Rect(rect)) }, d->bgColor);[m [32m+[m[32m }[m [32m+[m[32m if (right > 0) {[m [32m+[m[32m fillRect_Paint(&p, (iRect){ init_I2(right_Rect(rect), top_Rect(rect)),[m [32m+[m[32m init_I2(right, height_Rect(rect)) }, d->bgColor);[m [32m+[m[32m }[m [32m+[m[32m// adjustEdges_Rect(&rect, iMin(0, top), iMax(0, right), iMax(0, bottom), iMin(0, left));[m [32m+[m[32m }[m [32m+[m[32m#endif[m }[m [m void drawBackground_Widget(const iWidget *d) {[m [36m@@ -1261,12 +1303,13 @@[m [mvoid drawBackground_Widget(const iWidget *d) {[m if (d->bgColor >= 0 || d->frameColor >= 0) {[m iRect rect = bounds_Widget(d);[m if (d->flags & drawBackgroundToBottom_WidgetFlag) {[m [31m- rect.size.y = iMax(rect.size.y, size_Root(d->root).y - top_Rect(rect));[m [32m+[m[32m rect.size.y += size_Root(d->root).y; // = iMax(rect.size.y, size_Root(d->root).y - top_Rect(rect));[m }[m iPaint p;[m init_Paint(&p);[m if (d->bgColor >= 0) {[m [31m-#if defined (iPlatformAppleMobile)[m [32m+[m[32m#if 0 && defined (iPlatformAppleMobile)[m [32m+[m[32m /* TODO: This is part of the unbuffered draw (layer effects). */[m if (d->flags & (drawBackgroundToHorizontalSafeArea_WidgetFlag |[m drawBackgroundToVerticalSafeArea_WidgetFlag)) {[m const iInt2 rootSize = size_Root(d->root);[m [36m@@ -1289,7 +1332,7 @@[m [mvoid drawBackground_Widget(const iWidget *d) {[m top = -top_Rect(rect);[m }[m }[m [31m- adjustEdges_Rect(&rect, top, right, bottom, left);[m [32m+[m[32m adjustEdges_Rect(&rect, iMin(0, top), iMax(0, right), iMax(0, bottom), iMin(0, left));[m }[m #endif[m fillRect_Paint(&p, rect, d->bgColor);[m [36m@@ -1339,7 +1382,7 @@[m [mstatic void addToPotentiallyVisible_Widget_(const iWidget *d, iPtrArray *pvs, iR[m if (isDrawn_Widget_(d)) {[m iRect bounds = bounds_Widget(d);[m if (d->flags & drawBackgroundToBottom_WidgetFlag) {[m [31m- bounds.size.y = size_Root(d->root).y - top_Rect(bounds);[m [32m+[m[32m bounds.size.y += size_Root(d->root).y; // iMax(bounds.size.y, size_Root(d->root).y - top_Rect(bounds));[m }[m if (isFullyContainedByOther_Rect(bounds, *fullyMasked)) {[m return; /* can't be seen */[m [36m@@ -1411,14 +1454,21 @@[m [mvoid setDrawBufferEnabled_Widget(iWidget *d, iBool enable) {[m [m static void beginBufferDraw_Widget_(const iWidget *d) {[m if (d->drawBuf) {[m [31m-// printf("[%p] drawbuffer update %d\n", d, d->drawBuf->isValid);[m [32m+[m[32m printf("[%p] drawbuffer update %d\n", d, d->drawBuf->isValid);[m [32m+[m[32m if (d->drawBuf->isValid) {[m [32m+[m[32m iAssert(!isEqual_I2(d->drawBuf->size, boundsForDraw_Widget_(d).size));[m [32m+[m[32m// printf(" drawBuf:%dx%d boundsForDraw:%dx%d\n",[m [32m+[m[32m// d->drawBuf->size.x, d->drawBuf->size.y,[m [32m+[m[32m// boundsForDraw_Widget_(d).size.x,[m [32m+[m[32m// boundsForDraw_Widget_(d).size.y);[m [32m+[m[32m }[m const iRect bounds = bounds_Widget(d);[m SDL_Renderer *render = renderer_Window(get_Window());[m d->drawBuf->oldTarget = SDL_GetRenderTarget(render);[m d->drawBuf->oldOrigin = origin_Paint;[m realloc_WidgetDrawBuffer(d->drawBuf, render, boundsForDraw_Widget_(d).size);[m SDL_SetRenderTarget(render, d->drawBuf->texture);[m [31m- //SDL_SetRenderDrawColor(render, 255, 0, 0, 128);[m [32m+[m[32m// SDL_SetRenderDrawColor(render, 255, 0, 0, 128);[m SDL_SetRenderDrawColor(render, 0, 0, 0, 0);[m SDL_RenderClear(render);[m origin_Paint = neg_I2(bounds.pos); /* with current visual offset */[m [36m@@ -1445,7 +1495,7 @@[m [mvoid draw_Widget(const iWidget *d) {[m }[m return;[m }[m [31m- drawLayerEffects_Widget_(d);[m [32m+[m[32m drawLayerEffects_Widget(d);[m if (!d->drawBuf || !checkDrawBuffer_Widget_(d)) {[m beginBufferDraw_Widget_(d);[m drawBackground_Widget(d);[m [36m@@ -1755,7 +1805,9 @@[m [miWidget *focus_Widget(void) {[m }[m [m void setHover_Widget(iWidget *d) {[m [31m- get_Window()->hover = d;[m [32m+[m[32m iWindow *win = get_Window();[m [32m+[m[32m iAssert(win);[m [32m+[m[32m win->hover = d;[m }[m [m iWidget *hover_Widget(void) {[m [36m@@ -1850,7 +1902,8 @@[m [mvoid postCommand_Widget(const iAnyObject *d, const char *cmd, ...) {[m deinit_String(&str);[m }[m [m [31m-void refresh_Widget(const iAnyObject *d) { [m [32m+[m[32mvoid refresh_Widget(const iAnyObject *d) {[m [32m+[m[32m if (!d) return;[m /* TODO: Could be widget specific, if parts of the tree are cached. */[m /* TODO: The visbuffer in DocumentWidget and ListWidget could be moved to be a general[m purpose feature of Widget. */[m [1mdiff --git a/src/ui/widget.h b/src/ui/widget.h[m [1mindex fd4d8898..b46e5177 100644[m [1m--- a/src/ui/widget.h[m [1m+++ b/src/ui/widget.h[m [36m@@ -204,6 +204,7 @@[m [miAny * findFocusable_Widget (const iWidget *startFrom, enum iWidgetF[m iAny * findOverflowScrollable_Widget (iWidget *);[m size_t childCount_Widget (const iWidget *);[m void draw_Widget (const iWidget *);[m [32m+[m[32mvoid drawLayerEffects_Widget (const iWidget *);[m void drawBackground_Widget (const iWidget *);[m void drawChildren_Widget (const iWidget *);[m void drawRoot_Widget (const iWidget *); /* root only */[m [1mdiff --git a/src/ui/window.c b/src/ui/window.c[m [1mindex 3385f436..8034d858 100644[m [1m--- a/src/ui/window.c[m [1m+++ b/src/ui/window.c[m [36m@@ -875,7 +875,7 @@[m [miBool processEvent_Window(iWindow *d, const SDL_Event *ev) {[m }[m }[m }[m [31m- const iWidget *oldHover = d->hover;[m [32m+[m[32m// const iWidget *oldHover = d->hover;[m iBool wasUsed = iFalse;[m /* Dispatch first to the mouse-grabbed widget. */[m // iWidget *widget = d->root.widget;[m [36m@@ -929,9 +929,10 @@[m [miBool processEvent_Window(iWindow *d, const SDL_Event *ev) {[m }[m }[m }[m [31m- if (oldHover != d->hover) {[m [31m- postRefresh_App();[m [31m- }[m [32m+[m[32m// if (oldHover != d->hover) {[m [32m+[m[32m// refresh_Widget(oldHover);[m [32m+[m[32m// refresh_Widget(d->hover);[m [32m+[m[32m// }[m if (event.type == SDL_MOUSEMOTION) {[m applyCursor_Window_(d);[m }[m [36m@@ -1107,7 +1108,7 @@[m [mvoid draw_Window(iWindow *d) {[m }[m setCurrent_Root(NULL);[m #if !defined (NDEBUG)[m [31m- draw_Text(defaultBold_FontId, zero_I2(), red_ColorId, "%d", drawCount_);[m [32m+[m[32m draw_Text(defaultBold_FontId, safeRect_Root(d->roots[0]).pos, red_ColorId, "%d", drawCount_);[m drawCount_ = 0;[m #endif[m }[m
text/gemini; charset=utf-8
This content has been proxied by September (3851b).