diff options
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 25559890..a52e99af 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -1332,7 +1332,8 @@ static void drawRun_DrawContext_(void *context, const iGmRun *run) { | |||
1332 | run->text); | 1332 | run->text); |
1333 | } | 1333 | } |
1334 | else { | 1334 | else { |
1335 | if (d->showLinkNumbers && run->linkId && run->flags & decoration_GmRunFlag) { | 1335 | if (d->showLinkNumbers && run->linkId && run->flags & decoration_GmRunFlag && |
1336 | ~run->flags & caption_GmRunFlag) { | ||
1336 | const size_t ord = visibleLinkOrdinal_DocumentView_(d->view, run->linkId); | 1337 | const size_t ord = visibleLinkOrdinal_DocumentView_(d->view, run->linkId); |
1337 | if (ord >= d->view->owner->ordinalBase) { | 1338 | if (ord >= d->view->owner->ordinalBase) { |
1338 | const iChar ordChar = | 1339 | const iChar ordChar = |
@@ -1655,7 +1656,6 @@ static iBool render_DocumentView_(const iDocumentView *d, iDrawContext *ctx, iBo | |||
1655 | ctx->viewPos = init_I2(left_Rect(ctx->docBounds) - left_Rect(bounds), -buf->origin); | 1656 | ctx->viewPos = init_I2(left_Rect(ctx->docBounds) - left_Rect(bounds), -buf->origin); |
1656 | // printf(" buffer %zu: buf vis range %d...%d\n", i, bufVisRange.start, bufVisRange.end); | 1657 | // printf(" buffer %zu: buf vis range %d...%d\n", i, bufVisRange.start, bufVisRange.end); |
1657 | if (!prerenderExtra && !isEmpty_Range(&bufVisRange)) { | 1658 | if (!prerenderExtra && !isEmpty_Range(&bufVisRange)) { |
1658 | didDraw = iTrue; | ||
1659 | if (isEmpty_Rangei(buf->validRange)) { | 1659 | if (isEmpty_Rangei(buf->validRange)) { |
1660 | /* Fill the required currently visible range (vis). */ | 1660 | /* Fill the required currently visible range (vis). */ |
1661 | const iRangei bufVisRange = intersect_Rangei(bufRange, vis); | 1661 | const iRangei bufVisRange = intersect_Rangei(bufRange, vis); |
@@ -1668,26 +1668,46 @@ static iBool render_DocumentView_(const iDocumentView *d, iDrawContext *ctx, iBo | |||
1668 | extend_GmRunRange_(&meta->runsDrawn); | 1668 | extend_GmRunRange_(&meta->runsDrawn); |
1669 | buf->validRange = bufVisRange; | 1669 | buf->validRange = bufVisRange; |
1670 | // printf(" buffer %zu valid %d...%d\n", i, bufRange.start, bufRange.end); | 1670 | // printf(" buffer %zu valid %d...%d\n", i, bufRange.start, bufRange.end); |
1671 | didDraw = iTrue; | ||
1671 | } | 1672 | } |
1672 | } | 1673 | } |
1673 | else { | 1674 | else { |
1674 | /* Progressively fill the required runs. */ | 1675 | /* Progressively fill the required runs. */ |
1675 | if (meta->runsDrawn.start) { | 1676 | if (meta->runsDrawn.start && buf->validRange.start > bufRange.start) { |
1676 | beginTarget_Paint(p, buf->texture); | 1677 | beginTarget_Paint(p, buf->texture); |
1677 | meta->runsDrawn.start = renderProgressive_GmDocument(d->doc, meta->runsDrawn.start, | 1678 | iZap(ctx->runsDrawn); |
1678 | -1, iInvalidSize, | 1679 | const iGmRun *newStart = renderProgressive_GmDocument(d->doc, |
1679 | bufVisRange, | 1680 | meta->runsDrawn.start, |
1680 | drawRun_DrawContext_, | 1681 | -1, |
1681 | ctx); | 1682 | iInvalidSize, |
1682 | buf->validRange.start = bufVisRange.start; | 1683 | bufVisRange, |
1684 | drawRun_DrawContext_, | ||
1685 | ctx); | ||
1686 | if (ctx->runsDrawn.start) { | ||
1687 | /* Something was actually drawn, so update the valid range. */ | ||
1688 | const int newTop = top_Rect(ctx->runsDrawn.start->visBounds); | ||
1689 | if (newTop != buf->validRange.start) { | ||
1690 | didDraw = iTrue; | ||
1691 | // printf("render: valid:%d->%d run:%p->%p\n", | ||
1692 | // buf->validRange.start, newTop, | ||
1693 | // meta->runsDrawn.start, | ||
1694 | // ctx->runsDrawn.start); fflush(stdout); | ||
1695 | buf->validRange.start = newTop; | ||
1696 | } | ||
1697 | meta->runsDrawn.start = newStart; | ||
1698 | } | ||
1683 | } | 1699 | } |
1684 | if (meta->runsDrawn.end) { | 1700 | if (meta->runsDrawn.end) { |
1685 | beginTarget_Paint(p, buf->texture); | 1701 | beginTarget_Paint(p, buf->texture); |
1702 | iZap(ctx->runsDrawn); | ||
1686 | meta->runsDrawn.end = renderProgressive_GmDocument(d->doc, meta->runsDrawn.end, | 1703 | meta->runsDrawn.end = renderProgressive_GmDocument(d->doc, meta->runsDrawn.end, |
1687 | +1, iInvalidSize, | 1704 | +1, iInvalidSize, |
1688 | bufVisRange, | 1705 | bufVisRange, |
1689 | drawRun_DrawContext_, | 1706 | drawRun_DrawContext_, |
1690 | ctx); | 1707 | ctx); |
1708 | if (ctx->runsDrawn.start) { | ||
1709 | didDraw = iTrue; | ||
1710 | } | ||
1691 | buf->validRange.end = bufVisRange.end; | 1711 | buf->validRange.end = bufVisRange.end; |
1692 | } | 1712 | } |
1693 | } | 1713 | } |
@@ -2711,7 +2731,7 @@ static void updateDocument_DocumentWidget_(iDocumentWidget *d, | |||
2711 | : "media.untitled.audio"); | 2731 | : "media.untitled.audio"); |
2712 | iUrl parts; | 2732 | iUrl parts; |
2713 | init_Url(&parts, d->mod.url); | 2733 | init_Url(&parts, d->mod.url); |
2714 | if (!isEmpty_Range(&parts.path)) { | 2734 | if (!isEmpty_Range(&parts.path) && !equalCase_Rangecc(parts.scheme, "data")) { |
2715 | linkTitle = | 2735 | linkTitle = |
2716 | baseName_Path(collect_String(newRange_String(parts.path))).start; | 2736 | baseName_Path(collect_String(newRange_String(parts.path))).start; |
2717 | } | 2737 | } |
@@ -3095,12 +3115,14 @@ static const char *humanReadableStatusCode_(enum iGmStatusCode code) { | |||
3095 | return format_CStr("%d ", code); | 3115 | return format_CStr("%d ", code); |
3096 | } | 3116 | } |
3097 | 3117 | ||
3098 | static void setUrl_DocumentWidget_(iDocumentWidget *d, const iString *url) { | 3118 | static iBool setUrl_DocumentWidget_(iDocumentWidget *d, const iString *url) { |
3099 | url = canonicalUrl_String(url); | 3119 | url = canonicalUrl_String(url); |
3100 | if (!equal_String(d->mod.url, url)) { | 3120 | if (!equal_String(d->mod.url, url)) { |
3101 | d->flags |= urlChanged_DocumentWidgetFlag; | 3121 | d->flags |= urlChanged_DocumentWidgetFlag; |
3102 | set_String(d->mod.url, url); | 3122 | set_String(d->mod.url, url); |
3123 | return iTrue; | ||
3103 | } | 3124 | } |
3125 | return iFalse; | ||
3104 | } | 3126 | } |
3105 | 3127 | ||
3106 | static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | 3128 | static void checkResponse_DocumentWidget_(iDocumentWidget *d) { |
@@ -3125,7 +3147,9 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
3125 | iMediaRequest *mr = newReused_MediaRequest(d, d->requestLinkId, d->request); | 3147 | iMediaRequest *mr = newReused_MediaRequest(d, d->requestLinkId, d->request); |
3126 | unlockResponse_GmRequest(d->request); | 3148 | unlockResponse_GmRequest(d->request); |
3127 | d->request = NULL; /* ownership moved */ | 3149 | d->request = NULL; /* ownership moved */ |
3128 | postCommand_Widget(d, "document.request.cancelled doc:%p", d); | 3150 | if (!isFinished_GmRequest(mr->req)) { |
3151 | postCommand_Widget(d, "document.request.cancelled doc:%p", d); | ||
3152 | } | ||
3129 | pushBack_ObjectList(d->media, mr); | 3153 | pushBack_ObjectList(d->media, mr); |
3130 | iRelease(mr); | 3154 | iRelease(mr); |
3131 | /* Reset the fetch state, returning to the originating page. */ | 3155 | /* Reset the fetch state, returning to the originating page. */ |
@@ -3133,9 +3157,14 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
3133 | if (equal_String(&mostRecentUrl_History(d->mod.history)->url, url_GmRequest(mr->req))) { | 3157 | if (equal_String(&mostRecentUrl_History(d->mod.history)->url, url_GmRequest(mr->req))) { |
3134 | undo_History(d->mod.history); | 3158 | undo_History(d->mod.history); |
3135 | } | 3159 | } |
3136 | setUrl_DocumentWidget_(d, url_GmDocument(d->view.doc)); | 3160 | if (setUrl_DocumentWidget_(d, url_GmDocument(d->view.doc))) { |
3161 | postCommand_Widget(d, "!document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); | ||
3162 | } | ||
3137 | updateFetchProgress_DocumentWidget_(d); | 3163 | updateFetchProgress_DocumentWidget_(d); |
3138 | postCommand_Widget(d, "media.updated link:%u request:%p", d->requestLinkId, mr); | 3164 | postCommand_Widget(d, "media.updated link:%u request:%p", d->requestLinkId, mr); |
3165 | if (isFinished_GmRequest(mr->req)) { | ||
3166 | postCommand_Widget(d, "media.finished link:%u request:%p", d->requestLinkId, mr); | ||
3167 | } | ||
3139 | return; | 3168 | return; |
3140 | } | 3169 | } |
3141 | /* Get ready for the incoming new document. */ | 3170 | /* Get ready for the incoming new document. */ |
@@ -3211,9 +3240,10 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
3211 | addChildPos_Widget(buttons, iClob(lineBreak), front_WidgetAddPos); | 3240 | addChildPos_Widget(buttons, iClob(lineBreak), front_WidgetAddPos); |
3212 | } | 3241 | } |
3213 | /* Menu for additional actions, past entries. */ { | 3242 | /* Menu for additional actions, past entries. */ { |
3243 | const iBinding *bind = findCommand_Keys("input.precedingline"); | ||
3214 | iMenuItem items[] = { { "${menu.input.precedingline}", | 3244 | iMenuItem items[] = { { "${menu.input.precedingline}", |
3215 | SDLK_v, | 3245 | bind->key, |
3216 | KMOD_PRIMARY | KMOD_SHIFT, | 3246 | bind->mods, |
3217 | format_CStr("!valueinput.set ptr:%p text:%s", | 3247 | format_CStr("!valueinput.set ptr:%p text:%s", |
3218 | buttons, | 3248 | buttons, |
3219 | cstr_String(&d->linePrecedingLink)) } }; | 3249 | cstr_String(&d->linePrecedingLink)) } }; |