diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-04-28 14:02:20 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-04-28 14:02:20 +0300 |
commit | 408597bd4f71a13a511b6af33601dff0be2ed317 (patch) | |
tree | 44f6b776ddab24bb5d1b18179872546125c3d679 /src/ui/documentwidget.c | |
parent | 852689943bfbbbb933ba617cb0a971f82923a2f3 (diff) |
Working on multiple UI roots
Various refactorings and fixes to handle root-global and window-global state, root-specific palettes, and proper coordinate system changes (e.g., when opening menus).
UI events are posted and handled in the context of a specific root.
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r-- | src/ui/documentwidget.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 79678f56..2f20958f 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -1234,7 +1234,10 @@ static void fetch_DocumentWidget_(iDocumentWidget *d) { | |||
1234 | iRelease(d->request); | 1234 | iRelease(d->request); |
1235 | d->request = NULL; | 1235 | d->request = NULL; |
1236 | } | 1236 | } |
1237 | postCommandf_App("document.request.started doc:%p url:%s", d, cstr_String(d->mod.url)); | 1237 | postCommandf_Root(as_Widget(d)->root, |
1238 | "document.request.started doc:%p url:%s", | ||
1239 | d, | ||
1240 | cstr_String(d->mod.url)); | ||
1238 | clear_ObjectList(d->media); | 1241 | clear_ObjectList(d->media); |
1239 | d->certFlags = 0; | 1242 | d->certFlags = 0; |
1240 | setLinkNumberMode_DocumentWidget_(d, iFalse); | 1243 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
@@ -1318,7 +1321,7 @@ static iBool updateFromHistory_DocumentWidget_(iDocumentWidget *d) { | |||
1318 | updateVisible_DocumentWidget_(d); | 1321 | updateVisible_DocumentWidget_(d); |
1319 | moveSpan_SmoothScroll(&d->scrollY, 0, 0); /* clamp position to new max */ | 1322 | moveSpan_SmoothScroll(&d->scrollY, 0, 0); /* clamp position to new max */ |
1320 | cacheDocumentGlyphs_DocumentWidget_(d); | 1323 | cacheDocumentGlyphs_DocumentWidget_(d); |
1321 | postCommandf_App("document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); | 1324 | postCommandf_Root(as_Widget(d)->root, "document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); |
1322 | return iTrue; | 1325 | return iTrue; |
1323 | } | 1326 | } |
1324 | else if (!isEmpty_String(d->mod.url)) { | 1327 | else if (!isEmpty_String(d->mod.url)) { |
@@ -1391,7 +1394,7 @@ static void scrollToHeading_DocumentWidget_(iDocumentWidget *d, const char *head | |||
1391 | iConstForEach(Array, h, headings_GmDocument(d->doc)) { | 1394 | iConstForEach(Array, h, headings_GmDocument(d->doc)) { |
1392 | const iGmHeading *head = h.value; | 1395 | const iGmHeading *head = h.value; |
1393 | if (startsWithCase_Rangecc(head->text, heading)) { | 1396 | if (startsWithCase_Rangecc(head->text, heading)) { |
1394 | postCommandf_App("document.goto loc:%p", head->text.start); | 1397 | postCommandf_Root(as_Widget(d)->root, "document.goto loc:%p", head->text.start); |
1395 | break; | 1398 | break; |
1396 | } | 1399 | } |
1397 | } | 1400 | } |
@@ -1514,7 +1517,7 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { | |||
1514 | cstr_Rangecc(urlScheme_String(d->mod.url)))) { | 1517 | cstr_Rangecc(urlScheme_String(d->mod.url)))) { |
1515 | /* Redirects with the same scheme are automatic. */ | 1518 | /* Redirects with the same scheme are automatic. */ |
1516 | visitUrl_Visited(visited_App(), d->mod.url, transient_VisitedUrlFlag); | 1519 | visitUrl_Visited(visited_App(), d->mod.url, transient_VisitedUrlFlag); |
1517 | postCommandf_App( | 1520 | postCommandf_Root(as_Widget(d)->root, |
1518 | "open doc:%p redirect:%d url:%s", d, d->redirectCount + 1, cstr_String(dstUrl)); | 1521 | "open doc:%p redirect:%d url:%s", d, d->redirectCount + 1, cstr_String(dstUrl)); |
1519 | } | 1522 | } |
1520 | else { | 1523 | else { |
@@ -2037,7 +2040,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2037 | if (!isEmpty_Block(d->certFingerprint) && !isEmpty_Range(&host)) { | 2040 | if (!isEmpty_Block(d->certFingerprint) && !isEmpty_Range(&host)) { |
2038 | setTrusted_GmCerts(certs_App(), host, d->certFingerprint, &d->certExpiry); | 2041 | setTrusted_GmCerts(certs_App(), host, d->certFingerprint, &d->certExpiry); |
2039 | d->certFlags |= trusted_GmCertFlag; | 2042 | d->certFlags |= trusted_GmCertFlag; |
2040 | postCommand_App("document.info"); | 2043 | postCommand_Widget(w, "document.info"); |
2041 | updateTrust_DocumentWidget_(d, NULL); | 2044 | updateTrust_DocumentWidget_(d, NULL); |
2042 | redoLayout_GmDocument(d->doc); | 2045 | redoLayout_GmDocument(d->doc); |
2043 | invalidate_DocumentWidget_(d); | 2046 | invalidate_DocumentWidget_(d); |
@@ -2065,7 +2068,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2065 | SDL_SetClipboardText(cstr_String(copied)); | 2068 | SDL_SetClipboardText(cstr_String(copied)); |
2066 | delete_String(copied); | 2069 | delete_String(copied); |
2067 | if (flags_Widget(w) & touchDrag_WidgetFlag) { | 2070 | if (flags_Widget(w) & touchDrag_WidgetFlag) { |
2068 | postCommand_App("document.select arg:0"); | 2071 | postCommand_Widget(w, "document.select arg:0"); |
2069 | } | 2072 | } |
2070 | return iTrue; | 2073 | return iTrue; |
2071 | } | 2074 | } |
@@ -2102,13 +2105,13 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2102 | } | 2105 | } |
2103 | appendCStr_String(url, "?"); | 2106 | appendCStr_String(url, "?"); |
2104 | append_String(url, value); | 2107 | append_String(url, value); |
2105 | postCommandf_App("open url:%s", cstr_String(url)); | 2108 | postCommandf_Root(w->root, "open url:%s", cstr_String(url)); |
2106 | delete_String(value); | 2109 | delete_String(value); |
2107 | return iTrue; | 2110 | return iTrue; |
2108 | } | 2111 | } |
2109 | else if (equal_Command(cmd, "valueinput.cancelled") && | 2112 | else if (equal_Command(cmd, "valueinput.cancelled") && |
2110 | equal_Rangecc(range_Command(cmd, "id"), "document.input.submit") && document_App() == d) { | 2113 | equal_Rangecc(range_Command(cmd, "id"), "document.input.submit") && document_App() == d) { |
2111 | postCommand_App("navigate.back"); | 2114 | postCommand_Root(get_Root(), "navigate.back"); |
2112 | return iTrue; | 2115 | return iTrue; |
2113 | } | 2116 | } |
2114 | else if (equalWidget_Command(cmd, w, "document.request.updated") && | 2117 | else if (equalWidget_Command(cmd, w, "document.request.updated") && |
@@ -2149,7 +2152,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2149 | iReleasePtr(&d->request); | 2152 | iReleasePtr(&d->request); |
2150 | updateVisible_DocumentWidget_(d); | 2153 | updateVisible_DocumentWidget_(d); |
2151 | d->drawBufs->flags |= updateSideBuf_DrawBufsFlag; | 2154 | d->drawBufs->flags |= updateSideBuf_DrawBufsFlag; |
2152 | postCommandf_App("document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); | 2155 | postCommandf_Root(w->root, "document.changed doc:%p url:%s", d, cstr_String(d->mod.url)); |
2153 | /* Check for a pending goto. */ | 2156 | /* Check for a pending goto. */ |
2154 | if (!isEmpty_String(&d->pendingGotoHeading)) { | 2157 | if (!isEmpty_String(&d->pendingGotoHeading)) { |
2155 | scrollToHeading_DocumentWidget_(d, cstr_String(&d->pendingGotoHeading)); | 2158 | scrollToHeading_DocumentWidget_(d, cstr_String(&d->pendingGotoHeading)); |
@@ -2193,12 +2196,12 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2193 | } | 2196 | } |
2194 | else if (equal_Command(cmd, "document.stop") && document_App() == d) { | 2197 | else if (equal_Command(cmd, "document.stop") && document_App() == d) { |
2195 | if (d->request) { | 2198 | if (d->request) { |
2196 | postCommandf_App( | 2199 | postCommandf_Root(w->root, |
2197 | "document.request.cancelled doc:%p url:%s", d, cstr_String(d->mod.url)); | 2200 | "document.request.cancelled doc:%p url:%s", d, cstr_String(d->mod.url)); |
2198 | iReleasePtr(&d->request); | 2201 | iReleasePtr(&d->request); |
2199 | if (d->state != ready_RequestState) { | 2202 | if (d->state != ready_RequestState) { |
2200 | d->state = ready_RequestState; | 2203 | d->state = ready_RequestState; |
2201 | postCommand_App("navigate.back"); | 2204 | postCommand_Root(w->root, "navigate.back"); |
2202 | } | 2205 | } |
2203 | updateFetchProgress_DocumentWidget_(d); | 2206 | updateFetchProgress_DocumentWidget_(d); |
2204 | return iTrue; | 2207 | return iTrue; |
@@ -2267,7 +2270,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2267 | } | 2270 | } |
2268 | else if (equal_Command(cmd, "navigate.back") && document_App() == d) { | 2271 | else if (equal_Command(cmd, "navigate.back") && document_App() == d) { |
2269 | if (d->request) { | 2272 | if (d->request) { |
2270 | postCommandf_App( | 2273 | postCommandf_Root(w->root, |
2271 | "document.request.cancelled doc:%p url:%s", d, cstr_String(d->mod.url)); | 2274 | "document.request.cancelled doc:%p url:%s", d, cstr_String(d->mod.url)); |
2272 | iReleasePtr(&d->request); | 2275 | iReleasePtr(&d->request); |
2273 | updateFetchProgress_DocumentWidget_(d); | 2276 | updateFetchProgress_DocumentWidget_(d); |
@@ -2291,14 +2294,14 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2291 | if (parts.path.end[-1] == '/') break; | 2294 | if (parts.path.end[-1] == '/') break; |
2292 | parts.path.end--; | 2295 | parts.path.end--; |
2293 | } | 2296 | } |
2294 | postCommandf_App( | 2297 | postCommandf_Root(w->root, |
2295 | "open url:%s", | 2298 | "open url:%s", |
2296 | cstr_Rangecc((iRangecc){ constBegin_String(d->mod.url), parts.path.end })); | 2299 | cstr_Rangecc((iRangecc){ constBegin_String(d->mod.url), parts.path.end })); |
2297 | } | 2300 | } |
2298 | return iTrue; | 2301 | return iTrue; |
2299 | } | 2302 | } |
2300 | else if (equal_Command(cmd, "navigate.root") && document_App() == d) { | 2303 | else if (equal_Command(cmd, "navigate.root") && document_App() == d) { |
2301 | postCommandf_App("open url:%s/", cstr_Rangecc(urlRoot_String(d->mod.url))); | 2304 | postCommandf_Root(w->root, "open url:%s/", cstr_Rangecc(urlRoot_String(d->mod.url))); |
2302 | return iTrue; | 2305 | return iTrue; |
2303 | } | 2306 | } |
2304 | else if (equalWidget_Command(cmd, w, "scroll.moved")) { | 2307 | else if (equalWidget_Command(cmd, w, "scroll.moved")) { |
@@ -2390,7 +2393,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2390 | } | 2393 | } |
2391 | } | 2394 | } |
2392 | if (flags_Widget(w) & touchDrag_WidgetFlag) { | 2395 | if (flags_Widget(w) & touchDrag_WidgetFlag) { |
2393 | postCommand_App("document.select arg:0"); /* we can't handle both at the same time */ | 2396 | postCommand_Root(w->root, "document.select arg:0"); /* we can't handle both at the same time */ |
2394 | } | 2397 | } |
2395 | invalidateWideRunsWithNonzeroOffset_DocumentWidget_(d); /* markers don't support offsets */ | 2398 | invalidateWideRunsWithNonzeroOffset_DocumentWidget_(d); /* markers don't support offsets */ |
2396 | resetWideRuns_DocumentWidget_(d); | 2399 | resetWideRuns_DocumentWidget_(d); |
@@ -2593,8 +2596,7 @@ static iBool processMediaEvents_DocumentWidget_(iDocumentWidget *d, const SDL_Ev | |||
2593 | { cstrCollect_String(metadataLabel_Player(plr)), 0, 0, NULL }, | 2596 | { cstrCollect_String(metadataLabel_Player(plr)), 0, 0, NULL }, |
2594 | }, | 2597 | }, |
2595 | 1); | 2598 | 1); |
2596 | openMenu_Widget(d->playerMenu, | 2599 | openMenu_Widget(d->playerMenu, bottomLeft_Rect(ui.menuRect)); |
2597 | localCoord_Widget(constAs_Widget(d), bottomLeft_Rect(ui.menuRect))); | ||
2598 | return iTrue; | 2600 | return iTrue; |
2599 | } | 2601 | } |
2600 | } | 2602 | } |
@@ -2699,7 +2701,8 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2699 | d->hoverLink = run; | 2701 | d->hoverLink = run; |
2700 | } | 2702 | } |
2701 | else { | 2703 | else { |
2702 | postCommandf_App("open newtab:%d url:%s", | 2704 | postCommandf_Root(w->root, |
2705 | "open newtab:%d url:%s", | ||
2703 | d->ordinalMode == | 2706 | d->ordinalMode == |
2704 | numbersAndAlphabet_DocumentLinkOrdinalMode | 2707 | numbersAndAlphabet_DocumentLinkOrdinalMode |
2705 | ? openTabMode_Sym(modState_Keys()) | 2708 | ? openTabMode_Sym(modState_Keys()) |
@@ -2813,15 +2816,15 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2813 | } | 2816 | } |
2814 | if (ev->type == SDL_MOUSEBUTTONDOWN) { | 2817 | if (ev->type == SDL_MOUSEBUTTONDOWN) { |
2815 | if (ev->button.button == SDL_BUTTON_X1) { | 2818 | if (ev->button.button == SDL_BUTTON_X1) { |
2816 | postCommand_App("navigate.back"); | 2819 | postCommand_Root(w->root, "navigate.back"); |
2817 | return iTrue; | 2820 | return iTrue; |
2818 | } | 2821 | } |
2819 | if (ev->button.button == SDL_BUTTON_X2) { | 2822 | if (ev->button.button == SDL_BUTTON_X2) { |
2820 | postCommand_App("navigate.forward"); | 2823 | postCommand_Root(w->root, "navigate.forward"); |
2821 | return iTrue; | 2824 | return iTrue; |
2822 | } | 2825 | } |
2823 | if (ev->button.button == SDL_BUTTON_MIDDLE && d->hoverLink) { | 2826 | if (ev->button.button == SDL_BUTTON_MIDDLE && d->hoverLink) { |
2824 | postCommandf_App("open newtab:%d url:%s", | 2827 | postCommandf_Root(w->root, "open newtab:%d url:%s", |
2825 | modState_Keys() & KMOD_SHIFT ? 1 : 2, | 2828 | modState_Keys() & KMOD_SHIFT ? 1 : 2, |
2826 | cstr_String(linkUrl_GmDocument(d->doc, d->hoverLink->linkId))); | 2829 | cstr_String(linkUrl_GmDocument(d->doc, d->hoverLink->linkId))); |
2827 | return iTrue; | 2830 | return iTrue; |
@@ -2967,7 +2970,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2967 | }, | 2970 | }, |
2968 | 3); | 2971 | 3); |
2969 | #endif | 2972 | #endif |
2970 | postCommand_App("document.select arg:1"); | 2973 | postCommand_Root(w->root, "document.select arg:1"); |
2971 | return iTrue; | 2974 | return iTrue; |
2972 | } | 2975 | } |
2973 | d->menu = makeMenu_Widget(w, data_Array(&items), size_Array(&items)); | 2976 | d->menu = makeMenu_Widget(w, data_Array(&items), size_Array(&items)); |
@@ -3188,7 +3191,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
3188 | refresh_Widget(w); | 3191 | refresh_Widget(w); |
3189 | } | 3192 | } |
3190 | else if (linkFlags & supportedProtocol_GmLinkFlag) { | 3193 | else if (linkFlags & supportedProtocol_GmLinkFlag) { |
3191 | postCommandf_App("open newtab:%d url:%s", | 3194 | postCommandf_Root(w->root, "open newtab:%d url:%s", |
3192 | openTabMode_Sym(modState_Keys()), | 3195 | openTabMode_Sym(modState_Keys()), |
3193 | cstr_String(absoluteUrl_String( | 3196 | cstr_String(absoluteUrl_String( |
3194 | d->mod.url, linkUrl_GmDocument(d->doc, linkId)))); | 3197 | d->mod.url, linkUrl_GmDocument(d->doc, linkId)))); |
@@ -3221,7 +3224,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
3221 | if (bannerType_DocumentWidget_(d) == certificateWarning_GmDocumentBanner && | 3224 | if (bannerType_DocumentWidget_(d) == certificateWarning_GmDocumentBanner && |
3222 | pos_Click(&d->click).y - top_Rect(banRect) > | 3225 | pos_Click(&d->click).y - top_Rect(banRect) > |
3223 | lineHeight_Text(banner_FontId) * 2) { | 3226 | lineHeight_Text(banner_FontId) * 2) { |
3224 | postCommand_App("document.info"); | 3227 | postCommand_Widget(d, "document.info"); |
3225 | } | 3228 | } |
3226 | else { | 3229 | else { |
3227 | postCommand_Widget(d, "navigate.root"); | 3230 | postCommand_Widget(d, "navigate.root"); |