From 33620846cca5678fbd662ea1a48fad302727dae7 Mon Sep 17 00:00:00 2001

From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= jaakko.keranen@iki.fi

Date: Sun, 12 Sep 2021 13:49:38 +0300

Subject: [PATCH 1/1] Mobile: Draw optimizations; focus handling

Widgets can now be marked for buffering their contents, which is useful if their contents change seldom but they are drawn often.

For example, the navbar is always visible but doesn't change very often, and during animations menu contents are static but there is a moving animation so everything gets drawn 60 FPS.

Focus handling was also improved so the lookup results can be scrolled while entering text, and one can tap outside an input field to unfocus it.


src/ui/inputwidget.c | 5 +

src/ui/mobile.c | 4 +-

src/ui/paint.c | 18 ++-

src/ui/paint.h | 2 +

src/ui/root.c | 54 ++++++++-

src/ui/sidebarwidget.c | 3 +-

src/ui/text.c | 7 ++

src/ui/text_simple.c | 2 +

src/ui/touch.c | 2 +-

src/ui/translation.c | 3 +-

src/ui/uploadwidget.c | 8 +-

src/ui/util.c | 1 +

src/ui/widget.c | 241 +++++++++++++++++++++++++++++++++++++----

src/ui/widget.h | 9 ++

src/ui/window.c | 7 +-

15 files changed, 327 insertions(+), 39 deletions(-)

diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c

index 6e9ef6c2..802a2d6c 100644

--- a/src/ui/inputwidget.c

+++ b/src/ui/inputwidget.c

@@ -1565,6 +1565,11 @@ static iBool processEvent_InputWidget_(iInputWidget *d, const SDL_Event *ev) {

 }

 switch (processEvent_Click(&d->click, ev)) {

     case none_ClickResult:

         break;

     case started_ClickResult: {

         setFocus_Widget(w);

diff --git a/src/ui/mobile.c b/src/ui/mobile.c

index 6ea672e6..9e2dc4f7 100644

--- a/src/ui/mobile.c

+++ b/src/ui/mobile.c

@@ -357,6 +357,7 @@ static iWidget *addChildPanel_(iWidget *parent, iLabelWidget *panelButton,

 setId_Widget(panel, "panel");

 setUserData_Object(panelButton, panel);

 setBackgroundColor_Widget(panel, uiBackground_ColorId);

 setId_Widget(addChild_Widget(panel, iClob(makePadding_Widget(0))), "panel.toppad");

 if (titleText) {

     iLabelWidget *title =

@@ -601,6 +602,7 @@ void initPanels_Mobile(iWidget *panels, iWidget *parentWidget,

 /* The panel roots. */

 iWidget *topPanel = new_Widget(); {

     setId_Widget(topPanel, "panel.top");

     setCommandHandler_Widget(topPanel, topPanelHandler_);

     setFlags_Widget(topPanel,

                     arrangeVertical_WidgetFlag | resizeWidthOfChildren_WidgetFlag |

@@ -730,7 +732,7 @@ void initPanels_Mobile(iWidget *panels, iWidget *parentWidget,

 updatePanelSheetMetrics_(panels);

 arrange_Widget(panels);

 postCommand_App("widget.overflow"); /* with the correct dimensions */    

+// printTree_Widget(panels);

}

#if 0

diff --git a/src/ui/paint.c b/src/ui/paint.c

index 79adb7d1..af62f908 100644

--- a/src/ui/paint.c

+++ b/src/ui/paint.c

@@ -24,6 +24,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

#include <SDL_version.h>

+iInt2 origin_Paint;

iLocalDef SDL_Renderer *renderer_Paint_(const iPaint *d) {

 iAssert(d->dst);

 return d->dst->render;

@@ -62,10 +64,11 @@ void endTarget_Paint(iPaint *d) {

}

void setClip_Paint(iPaint *d, iRect rect) {

 if (isEmpty_Rect(rect)) {

     rect = init_Rect(0, 0, 1, 1);

 }

 SDL_RenderSetClipRect(renderer_Paint_(d), (const SDL_Rect *) &rect);

}

@@ -85,6 +88,7 @@ void unsetClip_Paint(iPaint *d) {

}

void drawRect_Paint(const iPaint *d, iRect rect, int color) {

 iInt2 br = bottomRight_Rect(rect);

 /* Keep the right/bottom edge visible in the window. */

 if (br.x == d->dst->size.x) br.x--;

@@ -115,11 +119,14 @@ void drawRectThickness_Paint(const iPaint *d, iRect rect, int thickness, int col

}

void fillRect_Paint(const iPaint *d, iRect rect, int color) {

 setColor_Paint_(d, color);

+// printf("fillRect_Paint: %d,%d %dx%d\n", rect.pos.x, rect.pos.y, rect.size.x, rect.size.y);

 SDL_RenderFillRect(renderer_Paint_(d), (SDL_Rect *) &rect);

}

void drawSoftShadow_Paint(const iPaint *d, iRect inner, int thickness, int color, int alpha) {

 SDL_Renderer *render = renderer_Paint_(d);

 SDL_Texture *shadow = get_Window()->borderShadow;

 const iInt2 size = size_SDLTexture(shadow);

@@ -146,9 +153,14 @@ void drawSoftShadow_Paint(const iPaint *d, iRect inner, int thickness, int color

                &(SDL_Rect){ outer.pos.x, inner.pos.y, thickness, inner.size.y });

}

-void drawLines_Paint(const iPaint *d, const iInt2 *points, size_t count, int color) {

+void drawLines_Paint(const iPaint *d, const iInt2 *points, size_t n, int color) {

 setColor_Paint_(d, color);

}

iInt2 size_SDLTexture(SDL_Texture *d) {

diff --git a/src/ui/paint.h b/src/ui/paint.h

index 90cc2aef..e6701635 100644

--- a/src/ui/paint.h

+++ b/src/ui/paint.h

@@ -36,6 +36,8 @@ struct Impl_Paint {

 uint8_t      alpha;

};

+extern iInt2 origin_Paint; /* add this to all drawn positions so buffered graphics are correctly offset */

void init_Paint (iPaint *);

void beginTarget_Paint (iPaint *, SDL_Texture *target);

diff --git a/src/ui/root.c b/src/ui/root.c

index a792e93d..7b2b5b15 100644

--- a/src/ui/root.c

+++ b/src/ui/root.c

@@ -685,6 +685,34 @@ static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) {

     }

     return iTrue;

 }

 else if (equal_Command(cmd, "input.edited")) {

     iAnyObject *   url  = findChild_Widget(navBar, "url");

     const iString *text = text_InputWidget(url);

@@ -941,7 +969,7 @@ void updateMetrics_Root(iRoot *d) {

     setFixedSize_Widget(appIcon, init_I2(appIconSize_Root(), appMin->rect.size.y));

 }

 iWidget *navBar     = findChild_Widget(d->widget, "navbar");

+// iWidget *lock = findChild_Widget(navBar, "navbar.lock");

 iWidget *url        = findChild_Widget(d->widget, "url");

 iWidget *rightEmbed = findChild_Widget(navBar, "url.rightembed");

 iWidget *embedPad   = findChild_Widget(navBar, "url.embedpad");

@@ -1044,6 +1072,7 @@ void createUserInterface_Root(iRoot *d) {

 /* Navigation bar. */ {

     navBar = new_Widget();

     setId_Widget(navBar, "navbar");

     setFlags_Widget(navBar,

                     hittable_WidgetFlag | /* context menu */

                         arrangeHeight_WidgetFlag |

@@ -1095,6 +1124,16 @@ void createUserInterface_Root(iRoot *d) {

             setFont_LabelWidget(lock, symbols_FontId + uiNormal_FontSize);

             updateTextCStr_LabelWidget(lock, "\U0001f512");

         }

         iWidget *rightEmbed = new_Widget();

         setId_Widget(rightEmbed, "url.rightembed");

         addChildFlags_Widget(as_Widget(url),

@@ -1151,6 +1190,13 @@ void createUserInterface_Root(iRoot *d) {

         setFlags_Widget(urlButtons, embedFlags | arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag, iTrue);

         /* Mobile page menu. */

         if (deviceType_App() != desktop_AppDeviceType) {

+// setFont_LabelWidget(navCancel, defaultBold_FontId);

             iLabelWidget *pageMenuButton;

             /* In a mobile layout, the reload button is replaced with the Page/Ellipsis menu. */

             pageMenuButton = makeMenuButton_LabelWidget(pageMenuCStr_,

@@ -1172,13 +1218,14 @@ void createUserInterface_Root(iRoot *d) {

             setId_Widget(as_Widget(pageMenuButton), "pagemenubutton");

             setFont_LabelWidget(pageMenuButton, uiContentBold_FontId);

             setAlignVisually_LabelWidget(pageMenuButton, iTrue);

             updateSize_LabelWidget(pageMenuButton);

         }

         /* Reload button. */ {

             iLabelWidget *reload = newIcon_LabelWidget(reloadCStr_, 0, 0, "navigate.reload");

             setId_Widget(as_Widget(reload), "reload");

             updateSize_LabelWidget(reload);

         }

         addChildFlags_Widget(as_Widget(url), iClob(urlButtons), moveToParentRightEdge_WidgetFlag);

@@ -1287,6 +1334,7 @@ void createUserInterface_Root(iRoot *d) {

     iWidget *toolBar = new_Widget();

     addChild_Widget(root, iClob(toolBar));

     setId_Widget(toolBar, "toolbar");

     setCommandHandler_Widget(toolBar, handleToolBarCommands_);

     setFlags_Widget(toolBar, moveToParentBottomEdge_WidgetFlag |

                                  parentCannotResizeHeight_WidgetFlag |

diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c

index b816b572..eb129424 100644

--- a/src/ui/sidebarwidget.c

+++ b/src/ui/sidebarwidget.c

@@ -663,8 +663,9 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {

 /* On a phone, the right sidebar is used exclusively for Identities. */

 const iBool isPhone = deviceType_App() == phone_AppDeviceType;

 if (!isPhone || d->side == left_SidebarSide) {

     setId_Widget(buttons, "buttons");

     for (int i = 0; i < max_SidebarMode; i++) {

         if (deviceType_App() == phone_AppDeviceType && i == identities_SidebarMode) {

             continue;

diff --git a/src/ui/text.c b/src/ui/text.c

index 231281eb..f7fff4bc 100644

--- a/src/ui/text.c

+++ b/src/ui/text.c

@@ -25,6 +25,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

#include "metrics.h"

#include "embedded.h"

#include "window.h"

+#include "paint.h"

#include "app.h"

#define STB_TRUETYPE_IMPLEMENTATION

@@ -1712,6 +1713,8 @@ static iRect run_Font_(iFont *d, const iRunArgs *args) {

                 }

                 SDL_Rect src;

                 memcpy(&src, &glyph->rect[hoff], sizeof(SDL_Rect));

                 if (args->mode & fillBackground_RunMode) {

                     /* Alpha blending looks much better if the RGB components don't change in

                        the partially transparent pixels. */

@@ -2182,6 +2185,8 @@ void init_TextBuf(iTextBuf *d, iWrapText *wrapText, int font, int color) {

 }

 if (d->texture) {

     SDL_Texture *oldTarget = SDL_GetRenderTarget(render);

     SDL_SetRenderTarget(render, d->texture);

     SDL_SetRenderDrawBlendMode(render, SDL_BLENDMODE_NONE);

     SDL_SetRenderDrawColor(render, 255, 255, 255, 0);

@@ -2190,6 +2195,7 @@ void init_TextBuf(iTextBuf *d, iWrapText *wrapText, int font, int color) {

     draw_WrapText(wrapText, font, zero_I2(), color | fillBackground_ColorId);

     SDL_SetTextureBlendMode(text_.cache, SDL_BLENDMODE_BLEND);

     SDL_SetRenderTarget(render, oldTarget);

     SDL_SetTextureBlendMode(d->texture, SDL_BLENDMODE_BLEND);

 }

}

@@ -2203,6 +2209,7 @@ iTextBuf *newRange_TextBuf(int font, int color, iRangecc text) {

}

void draw_TextBuf(const iTextBuf *d, iInt2 pos, int color) {

 const iColor clr = get_Color(color);

 SDL_SetTextureColorMod(d->texture, clr.r, clr.g, clr.b);

 SDL_RenderCopy(text_.render,

diff --git a/src/ui/text_simple.c b/src/ui/text_simple.c

index e88b09a8..bf33b4be 100644

--- a/src/ui/text_simple.c

+++ b/src/ui/text_simple.c

@@ -306,6 +306,8 @@ static iRect runSimple_Font_(iFont *d, const iRunArgs *args) {

             src.y += over;

             src.h -= over;

         }

         if (args->mode & fillBackground_RunMode) {

             /* Alpha blending looks much better if the RGB components don't change in

                the partially transparent pixels. */

diff --git a/src/ui/touch.c b/src/ui/touch.c

index dac1152e..f0456acb 100644

--- a/src/ui/touch.c

+++ b/src/ui/touch.c

@@ -614,7 +614,7 @@ iBool processEvent_Touch(const SDL_Event *ev) {

// pixels.y, y_F3(amount), y_F3(touch->accum),

// touch->edge);

         if (pixels.x || pixels.y) {

             dispatchMotion_Touch_(touch->pos[0], 0);

             setCurrent_Root(touch->affinity->root);

             dispatchEvent_Widget(touch->affinity, (SDL_Event *) &(SDL_MouseWheelEvent){

diff --git a/src/ui/translation.c b/src/ui/translation.c

index cef68dce..b86e6e52 100644

--- a/src/ui/translation.c

+++ b/src/ui/translation.c

@@ -136,7 +136,8 @@ static void draw_TranslationProgressWidget_(const iTranslationProgressWidget *d)

         get_Color(palette[palCur]), get_Color(palette[palNext]), palPos - (int) palPos);

     SDL_SetRenderDrawColor(renderer_Window(get_Window()), back.r, back.g, back.b, p.alpha);

     SDL_RenderFillRect(renderer_Window(get_Window()),

     if (fg >= 0) {

         setOpacity_Text(opacity * 2);

         drawRange_Text(d->font, addX_I2(pos, spr->xoff), fg, range_String(&spr->text));

diff --git a/src/ui/uploadwidget.c b/src/ui/uploadwidget.c

index fb8aaf0a..78a1196a 100644

--- a/src/ui/uploadwidget.c

+++ b/src/ui/uploadwidget.c

@@ -376,11 +376,11 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) {

 return processEvent_Widget(w, ev);

}

-static void draw_UploadWidget_(const iUploadWidget *d) {

-}

+//static void draw_UploadWidget_(const iUploadWidget *d) {

+// draw_Widget(constAs_Widget(d));

+//}

iBeginDefineSubclass(UploadWidget, Widget)

 .processEvent = (iAny *) processEvent_UploadWidget_,

iEndDefineSubclass(UploadWidget)

diff --git a/src/ui/util.c b/src/ui/util.c

index 6069e800..05d39c01 100644

--- a/src/ui/util.c

+++ b/src/ui/util.c

@@ -685,6 +685,7 @@ static iWidget *makeMenuSeparator_(void) {

iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) {

 iWidget *menu = new_Widget();

 setBackgroundColor_Widget(menu, uiBackgroundMenu_ColorId);

 if (deviceType_App() != desktop_AppDeviceType) {

     setPadding1_Widget(menu, 2 * gap_UI);

diff --git a/src/ui/widget.c b/src/ui/widget.c

index 659a00cc..66cd0e7b 100644

--- a/src/ui/widget.c

+++ b/src/ui/widget.c

@@ -40,6 +40,67 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

include "../ios.h"

#endif

+struct Impl_WidgetDrawBuffer {

+};

+static void init_WidgetDrawBuffer(iWidgetDrawBuffer *d) {

+}

+static void deinit_WidgetDrawBuffer(iWidgetDrawBuffer *d) {

+}

+iDefineTypeConstruction(WidgetDrawBuffer)

+static void realloc_WidgetDrawBuffer(iWidgetDrawBuffer *d, SDL_Renderer *render, iInt2 size) {

+}

+static void release_WidgetDrawBuffer(iWidgetDrawBuffer *d) {

+}

+static iRect boundsForDraw_Widget_(const iWidget *d) {

+}

+static iBool checkDrawBuffer_Widget_(const iWidget *d) {

+}

+/----------------------------------------------------------------------------------------------/

static void printInfo_Widget_(const iWidget *);

void releaseChildren_Widget(iWidget *d) {

@@ -66,6 +127,7 @@ void init_Widget(iWidget *d) {

 d->children       = NULL;

 d->parent         = NULL;

 d->commandHandler = NULL;

 iZap(d->padding);

}

@@ -82,6 +144,7 @@ static void visualOffsetAnimation_Widget_(void *ptr) {

void deinit_Widget(iWidget *d) {

 releaseChildren_Widget(d);

#if 0 && !defined (NDEBUG)

 printf("widget %p (%s) deleted (on top:%d)\n", d, cstr_String(&d->id),

        d->flags & keepOnTop_WidgetFlag ? 1 : 0);

@@ -1036,7 +1099,8 @@ iBool scrollOverflow_Widget(iWidget *d, int delta) {

 const iInt2 newPos = windowToInner_Widget(d->parent, bounds.pos);

 if (!isEqual_I2(newPos, d->rect.pos)) {

     d->rect.pos = newPos;

+// refresh_Widget(d);

 }

 return height_Rect(bounds) > height_Rect(winRect);

}

@@ -1077,6 +1141,9 @@ iBool processEvent_Widget(iWidget *d, const SDL_Event *ev) {

         }

         if (ev->user.code == command_UserEventCode) {

             const char *cmd = command_UserEvent(ev);

             if (d->flags & (leftEdgeDraggable_WidgetFlag | rightEdgeDraggable_WidgetFlag) &&

                 isVisible_Widget(d) && ~d->flags & disabled_WidgetFlag &&

                 equal_Command(cmd, "edgeswipe.moved")) {

@@ -1147,14 +1214,13 @@ int backgroundFadeColor_Widget(void) {

 }

}

-void drawBackground_Widget(const iWidget *d) {

+iLocalDef iBool isDrawn_Widget_(const iWidget *d) {

+}

+static void drawLayerEffects_Widget_(const iWidget *d) {

 iBool shadowBorder   = (d->flags & keepOnTop_WidgetFlag && ~d->flags & mouseModal_WidgetFlag) != 0;

 iBool fadeBackground = (d->bgColor >= 0 || d->frameColor >= 0) && d->flags & mouseModal_WidgetFlag;

 if (deviceType_App() == phone_AppDeviceType) {

@@ -1163,13 +1229,12 @@ void drawBackground_Widget(const iWidget *d) {

         shadowBorder = iFalse;

     }

 }

 if (shadowBorder && ~d->flags & noShadowBorder_WidgetFlag) {

     iPaint p;

     init_Paint(&p);

     drawSoftShadow_Paint(&p, bounds_Widget(d), 12 * gap_UI, black_ColorId, 30);

 }

 if (isFaded) {

     iPaint p;

     init_Paint(&p);

@@ -1183,10 +1248,20 @@ void drawBackground_Widget(const iWidget *d) {

     fillRect_Paint(&p, rect_Root(d->root), backgroundFadeColor_Widget());

     SDL_SetRenderDrawBlendMode(renderer_Window(get_Window()), SDL_BLENDMODE_NONE);

 }

+}

+void drawBackground_Widget(const iWidget *d) {

 if (d->bgColor >= 0 || d->frameColor >= 0) {

     iRect rect = bounds_Widget(d);

     if (d->flags & drawBackgroundToBottom_WidgetFlag) {

     }

     iPaint p;

     init_Paint(&p);

@@ -1242,8 +1317,54 @@ void drawBackground_Widget(const iWidget *d) {

 }

}

-iLocalDef iBool isDrawn_Widget_(const iWidget *d) {

+int drawCount_;

+static iBool isRoot_Widget_(const iWidget *d) {

+}

+iLocalDef iBool isFullyContainedByOther_Rect(const iRect d, const iRect other) {

+}

+static void addToPotentiallyVisible_Widget_(const iWidget *d, iPtrArray *pvs, iRect *fullyMasked) {

+}

+static void findPotentiallyVisible_Widget_(const iWidget *d, iPtrArray *pvs) {

}

void drawChildren_Widget(const iWidget *d) {

@@ -1253,21 +1374,85 @@ void drawChildren_Widget(const iWidget *d) {

 iConstForEach(ObjectList, i, d->children) {

     const iWidget *child = constAs_Widget(i.object);

     if (~child->flags & keepOnTop_WidgetFlag && isDrawn_Widget_(child)) {

         class_Widget(child)->draw(child);

     }

 }

+}

+void drawRoot_Widget(const iWidget *d) {

 /* Root draws the on-top widgets on top of everything else. */

+}

+void setDrawBufferEnabled_Widget(iWidget *d, iBool enable) {

+}

+static void beginBufferDraw_Widget_(const iWidget *d) {

+// printf("[%p] drawbuffer update %d\n", d, d->drawBuf->isValid);

+// printf("beginBufferDraw: origin %d,%d\n", origin_Paint.x, origin_Paint.y);

+// fflush(stdout);

+}

+static void endBufferDraw_Widget_(const iWidget *d) {

+// printf("endBufferDraw: origin %d,%d\n", origin_Paint.x, origin_Paint.y);

+// fflush(stdout);

}

void draw_Widget(const iWidget *d) {

+// printf("[%p] drawBuffer released\n", d);

}

iAny *addChild_Widget(iWidget *d, iAnyObject *child) {

@@ -1659,12 +1844,20 @@ void postCommand_Widget(const iAnyObject *d, const char *cmd, ...) {

 deinit_String(&str);

}

-void refresh_Widget(const iAnyObject *d) {

+void refresh_Widget(const iAnyObject *d) {

 /* TODO: Could be widget specific, if parts of the tree are cached. */

 /* TODO: The visbuffer in DocumentWidget and ListWidget could be moved to be a general

    purpose feature of Widget. */

 iAssert(isInstance_Object(d, &Class_Widget));

+// if (w->drawBuf->isValid) {

+// printf("[%p] drawbuffer invalidated by %p\n", w, d); fflush(stdout);

+// }

 postRefresh_App();

}

diff --git a/src/ui/widget.h b/src/ui/widget.h

index 1a944c0a..fd4d8898 100644

--- a/src/ui/widget.h

+++ b/src/ui/widget.h

@@ -131,6 +131,8 @@ enum iWidgetFocusDir {

 backward_WidgetFocusDir,

};

+iDeclareType(WidgetDrawBuffer)

struct Impl_Widget {

 iObject      object;

 iString      id;

@@ -148,6 +150,7 @@ struct Impl_Widget {

 iWidget *    parent;

 iBool      (*commandHandler)(iWidget *, const char *);

 iRoot *      root;

};

iDeclareObjectConstruction(Widget)

@@ -203,6 +206,12 @@ size_t childCount_Widget (const iWidget *);

void draw_Widget (const iWidget *);

void drawBackground_Widget (const iWidget *);

void drawChildren_Widget (const iWidget *);

+void drawRoot_Widget (const iWidget ); / root only */

+void setDrawBufferEnabled_Widget (iWidget *, iBool enable);

+iLocalDef iBool isDrawBufferEnabled_Widget(const iWidget *d) {

+}

iLocalDef int width_Widget(const iAnyObject *d) {

 if (d) {

diff --git a/src/ui/window.c b/src/ui/window.c

index 096853cc..3385f436 100644

--- a/src/ui/window.c

+++ b/src/ui/window.c

@@ -1060,12 +1060,13 @@ void draw_Window(iWindow *d) {

 d->frameTime = SDL_GetTicks();

 if (isExposed_Window(d)) {

     d->isInvalidated = iFalse;

     iForIndices(i, d->roots) {

         iRoot *root = d->roots[i];

         if (root) {

             setCurrent_Root(root);

             unsetClip_Paint(&p); /* update clip to current root */

#if defined (LAGRANGE_ENABLE_CUSTOM_FRAME)

             /* App icon. */

             const iWidget *appIcon = findChild_Widget(root->widget, "winbar.icon");

@@ -1105,6 +1106,10 @@ void draw_Window(iWindow *d) {

         }

     }

     setCurrent_Root(NULL);

+#if !defined (NDEBUG)

+#endif

 }

#if 0

 /* Text cache debugging. */ {

--

2.25.1

Proxy Information
Original URL
gemini://git.skyjake.fi/lagrange/work%2Fv1.7/patch/33620846cca5678fbd662ea1a48fad302727dae7.patch
Status Code
Success (20)
Meta
text/plain
Capsule Response Time
91.474266 milliseconds
Gemini-to-HTML Time
12.996877 milliseconds

This content has been proxied by September (ba2dc).