summaryrefslogtreecommitdiff
path: root/src/ui/documentwidget.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-04-28 14:02:20 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-04-28 14:02:20 +0300
commit408597bd4f71a13a511b6af33601dff0be2ed317 (patch)
tree44f6b776ddab24bb5d1b18179872546125c3d679 /src/ui/documentwidget.c
parent852689943bfbbbb933ba617cb0a971f82923a2f3 (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.c51
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");