summaryrefslogtreecommitdiff
path: root/src/ui/documentwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r--src/ui/documentwidget.c60
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
3098static void setUrl_DocumentWidget_(iDocumentWidget *d, const iString *url) { 3118static 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
3106static void checkResponse_DocumentWidget_(iDocumentWidget *d) { 3128static 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)) } };