diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-05-21 10:52:44 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-05-21 10:52:44 +0300 |
commit | 8c1ccfed06a4b986d1a4addd8c173ad6bb4d6691 (patch) | |
tree | 5f74fb05d591b941dee41a67accf38821b56f1da /src | |
parent | 38d1b4a51e56c1125b6fb1a832a09c9201fd3edf (diff) |
DocumentWidget: Scroll position vs. reload/navigating to new page
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/documentwidget.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 337e2a03..40b3d7a4 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -222,6 +222,7 @@ enum iDocumentWidgetFlag { | |||
222 | movingSelectMarkStart_DocumentWidgetFlag = iBit(10), | 222 | movingSelectMarkStart_DocumentWidgetFlag = iBit(10), |
223 | movingSelectMarkEnd_DocumentWidgetFlag = iBit(11), | 223 | movingSelectMarkEnd_DocumentWidgetFlag = iBit(11), |
224 | otherRootByDefault_DocumentWidgetFlag = iBit(12), /* links open to other root by default */ | 224 | otherRootByDefault_DocumentWidgetFlag = iBit(12), /* links open to other root by default */ |
225 | urlChanged_DocumentWidgetFlag = iBit(13), | ||
225 | }; | 226 | }; |
226 | 227 | ||
227 | enum iDocumentLinkOrdinalMode { | 228 | enum iDocumentLinkOrdinalMode { |
@@ -1414,6 +1415,7 @@ static void updateFromCachedResponse_DocumentWidget_(iDocumentWidget *d, float n | |||
1414 | moveSpan_SmoothScroll(&d->scrollY, 0, 0); /* clamp position to new max */ | 1415 | moveSpan_SmoothScroll(&d->scrollY, 0, 0); /* clamp position to new max */ |
1415 | cacheDocumentGlyphs_DocumentWidget_(d); | 1416 | cacheDocumentGlyphs_DocumentWidget_(d); |
1416 | d->drawBufs->flags |= updateTimestampBuf_DrawBufsFlag | updateSideBuf_DrawBufsFlag; | 1417 | d->drawBufs->flags |= updateTimestampBuf_DrawBufsFlag | updateSideBuf_DrawBufsFlag; |
1418 | d->flags &= ~urlChanged_DocumentWidgetFlag; | ||
1417 | postCommandf_Root(as_Widget(d)->root, "document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); | 1419 | postCommandf_Root(as_Widget(d)->root, "document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); |
1418 | } | 1420 | } |
1419 | 1421 | ||
@@ -1662,7 +1664,10 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
1662 | break; | 1664 | break; |
1663 | } | 1665 | } |
1664 | case categorySuccess_GmStatusCode: | 1666 | case categorySuccess_GmStatusCode: |
1665 | //reset_SmoothScroll(&d->scrollY); | 1667 | if (d->flags & urlChanged_DocumentWidgetFlag) { |
1668 | /* Keep scroll position when reloading the same page. */ | ||
1669 | reset_SmoothScroll(&d->scrollY); | ||
1670 | } | ||
1666 | reset_GmDocument(d->doc); /* new content incoming */ | 1671 | reset_GmDocument(d->doc); /* new content incoming */ |
1667 | delete_Gempub(d->sourceGempub); | 1672 | delete_Gempub(d->sourceGempub); |
1668 | d->sourceGempub = NULL; | 1673 | d->sourceGempub = NULL; |
@@ -2321,6 +2326,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2321 | if (category_GmStatusCode(status_GmRequest(d->request)) == categorySuccess_GmStatusCode) { | 2326 | if (category_GmStatusCode(status_GmRequest(d->request)) == categorySuccess_GmStatusCode) { |
2322 | init_Anim(&d->scrollY.pos, d->initNormScrollY * size_GmDocument(d->doc).y); /* TODO: unless user already scrolled! */ | 2327 | init_Anim(&d->scrollY.pos, d->initNormScrollY * size_GmDocument(d->doc).y); /* TODO: unless user already scrolled! */ |
2323 | } | 2328 | } |
2329 | d->flags &= ~urlChanged_DocumentWidgetFlag; | ||
2324 | d->state = ready_RequestState; | 2330 | d->state = ready_RequestState; |
2325 | postProcessRequestContent_DocumentWidget_(d, iFalse); | 2331 | postProcessRequestContent_DocumentWidget_(d, iFalse); |
2326 | /* The response may be cached. */ | 2332 | /* The response may be cached. */ |
@@ -4410,9 +4416,16 @@ void deserializeState_DocumentWidget(iDocumentWidget *d, iStream *ins) { | |||
4410 | updateFromHistory_DocumentWidget_(d); | 4416 | updateFromHistory_DocumentWidget_(d); |
4411 | } | 4417 | } |
4412 | 4418 | ||
4419 | static void setUrl_DocumentWidget_(iDocumentWidget *d, const iString *url) { | ||
4420 | if (!equal_String(d->mod.url, url)) { | ||
4421 | d->flags |= urlChanged_DocumentWidgetFlag; | ||
4422 | set_String(d->mod.url, url); | ||
4423 | } | ||
4424 | } | ||
4425 | |||
4413 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { | 4426 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { |
4414 | setLinkNumberMode_DocumentWidget_(d, iFalse); | 4427 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
4415 | set_String(d->mod.url, urlFragmentStripped_String(url)); | 4428 | setUrl_DocumentWidget_(d, urlFragmentStripped_String(url)); |
4416 | /* See if there a username in the URL. */ | 4429 | /* See if there a username in the URL. */ |
4417 | parseUser_DocumentWidget_(d); | 4430 | parseUser_DocumentWidget_(d); |
4418 | if (!isFromCache || !updateFromHistory_DocumentWidget_(d)) { | 4431 | if (!isFromCache || !updateFromHistory_DocumentWidget_(d)) { |
@@ -4423,7 +4436,7 @@ void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBoo | |||
4423 | void setUrlAndSource_DocumentWidget(iDocumentWidget *d, const iString *url, const iString *mime, | 4436 | void setUrlAndSource_DocumentWidget(iDocumentWidget *d, const iString *url, const iString *mime, |
4424 | const iBlock *source) { | 4437 | const iBlock *source) { |
4425 | setLinkNumberMode_DocumentWidget_(d, iFalse); | 4438 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
4426 | set_String(d->mod.url, url); | 4439 | setUrl_DocumentWidget_(d, url); |
4427 | parseUser_DocumentWidget_(d); | 4440 | parseUser_DocumentWidget_(d); |
4428 | iGmResponse *resp = new_GmResponse(); | 4441 | iGmResponse *resp = new_GmResponse(); |
4429 | resp->statusCode = success_GmStatusCode; | 4442 | resp->statusCode = success_GmStatusCode; |