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.c68
1 files changed, 53 insertions, 15 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index 048f8ce4..d23e95a6 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -304,7 +304,7 @@ void init_DocumentWidget(iDocumentWidget *d) {
304 iWidget *w = as_Widget(d); 304 iWidget *w = as_Widget(d);
305 init_Widget(w); 305 init_Widget(w);
306 setId_Widget(w, format_CStr("document%03d", ++docEnum_)); 306 setId_Widget(w, format_CStr("document%03d", ++docEnum_));
307 setFlags_Widget(w, hover_WidgetFlag, iTrue); 307 setFlags_Widget(w, hover_WidgetFlag | noBackground_WidgetFlag, iTrue);
308 init_PersistentDocumentState(&d->mod); 308 init_PersistentDocumentState(&d->mod);
309 d->flags = 0; 309 d->flags = 0;
310 d->phoneToolbar = NULL; 310 d->phoneToolbar = NULL;
@@ -1571,6 +1571,43 @@ static void togglePreFold_DocumentWidget_(iDocumentWidget *d, uint16_t preId) {
1571 refresh_Widget(as_Widget(d)); 1571 refresh_Widget(as_Widget(d));
1572} 1572}
1573 1573
1574static iString *makeQueryUrl_DocumentWidget_(const iDocumentWidget *d,
1575 const iString *userEnteredText) {
1576 iString *url = copy_String(d->mod.url);
1577 /* Remove the existing query string. */
1578 const size_t qPos = indexOfCStr_String(url, "?");
1579 if (qPos != iInvalidPos) {
1580 remove_Block(&url->chars, qPos, iInvalidSize);
1581 }
1582 appendCStr_String(url, "?");
1583 append_String(url, collect_String(urlEncode_String(userEnteredText)));
1584 return url;
1585}
1586
1587static void inputQueryValidator_(iInputWidget *input, void *context) {
1588 iDocumentWidget *d = context;
1589 iString *url = makeQueryUrl_DocumentWidget_(d, text_InputWidget(input));
1590 iWidget *dlg = parent_Widget(input);
1591 iLabelWidget *counter = findChild_Widget(dlg, "valueinput.counter");
1592 iAssert(counter);
1593 int avail = 1024 - (int) size_String(url);
1594 setFlags_Widget(findChild_Widget(dlg, "default"), disabled_WidgetFlag, avail < 0);
1595 setEnterKeyEnabled_InputWidget(input, avail >= 0);
1596 int len = length_String(text_InputWidget(input));
1597 if (len > 1024) {
1598 iString *trunc = copy_String(text_InputWidget(input));
1599 truncate_String(trunc, 1024);
1600 setText_InputWidget(input, trunc);
1601 delete_String(trunc);
1602 }
1603 setTextCStr_LabelWidget(counter, format_CStr("%d", avail)); /* Gemini URL maxlen */
1604 setTextColor_LabelWidget(counter,
1605 avail < 0 ? uiTextCaution_ColorId :
1606 avail < 128 ? uiTextStrong_ColorId
1607 : uiTextDim_ColorId);
1608 delete_String(url);
1609}
1610
1574static void checkResponse_DocumentWidget_(iDocumentWidget *d) { 1611static void checkResponse_DocumentWidget_(iDocumentWidget *d) {
1575 if (!d->request) { 1612 if (!d->request) {
1576 return; 1613 return;
@@ -1598,13 +1635,21 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) {
1598 isEmpty_String(&resp->meta) 1635 isEmpty_String(&resp->meta)
1599 ? format_CStr(cstr_Lang("dlg.input.prompt"), cstr_Rangecc(parts.path)) 1636 ? format_CStr(cstr_Lang("dlg.input.prompt"), cstr_Rangecc(parts.path))
1600 : cstr_String(&resp->meta), 1637 : cstr_String(&resp->meta),
1601 uiTextCaution_ColorEscape "${dlg.input.send} \u21d2", 1638 uiTextCaution_ColorEscape "${dlg.input.send}",
1602 format_CStr("!document.input.submit doc:%p", d)); 1639 format_CStr("!document.input.submit doc:%p", d));
1640 setId_Widget(addChildPosFlags_Widget(findChild_Widget(dlg, "dialogbuttons"),
1641 iClob(new_LabelWidget("", NULL)),
1642 front_WidgetAddPos, frameless_WidgetFlag),
1643 "valueinput.counter");
1644 setValidator_InputWidget(findChild_Widget(dlg, "input"), inputQueryValidator_, d);
1603 setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"), 1645 setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"),
1604 statusCode == sensitiveInput_GmStatusCode); 1646 statusCode == sensitiveInput_GmStatusCode);
1605 if (document_App() != d) { 1647 if (document_App() != d) {
1606 postCommandf_App("tabs.switch page:%p", d); 1648 postCommandf_App("tabs.switch page:%p", d);
1607 } 1649 }
1650 else {
1651 updateTheme_DocumentWidget_(d);
1652 }
1608 break; 1653 break;
1609 } 1654 }
1610 case categorySuccess_GmStatusCode: 1655 case categorySuccess_GmStatusCode:
@@ -2229,17 +2274,10 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
2229 return iTrue; 2274 return iTrue;
2230 } 2275 }
2231 else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) { 2276 else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) {
2232 iString *value = suffix_Command(cmd, "value"); 2277 postCommandf_Root(w->root,
2233 set_String(value, collect_String(urlEncode_String(value))); 2278 "open url:%s",
2234 iString *url = collect_String(copy_String(d->mod.url)); 2279 cstrCollect_String(makeQueryUrl_DocumentWidget_
2235 const size_t qPos = indexOfCStr_String(url, "?"); 2280 (d, collect_String(suffix_Command(cmd, "value")))));
2236 if (qPos != iInvalidPos) {
2237 remove_Block(&url->chars, qPos, iInvalidSize);
2238 }
2239 appendCStr_String(url, "?");
2240 append_String(url, value);
2241 postCommandf_Root(w->root, "open url:%s", cstr_String(url));
2242 delete_String(value);
2243 return iTrue; 2281 return iTrue;
2244 } 2282 }
2245 else if (equal_Command(cmd, "valueinput.cancelled") && 2283 else if (equal_Command(cmd, "valueinput.cancelled") &&
@@ -4172,7 +4210,7 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) {
4172 if (width_Rect(bounds) <= 0) { 4210 if (width_Rect(bounds) <= 0) {
4173 return; 4211 return;
4174 } 4212 }
4175 draw_Widget(w); 4213// draw_Widget(w);
4176 if (d->drawBufs->flags & updateTimestampBuf_DrawBufsFlag) { 4214 if (d->drawBufs->flags & updateTimestampBuf_DrawBufsFlag) {
4177 updateTimestampBuf_DocumentWidget_(d); 4215 updateTimestampBuf_DocumentWidget_(d);
4178 } 4216 }
@@ -4250,7 +4288,7 @@ static void draw_DocumentWidget_(const iDocumentWidget *d) {
4250 if (colorTheme_App() == pureWhite_ColorTheme) { 4288 if (colorTheme_App() == pureWhite_ColorTheme) {
4251 drawHLine_Paint(&ctx.paint, topLeft_Rect(bounds), width_Rect(bounds), uiSeparator_ColorId); 4289 drawHLine_Paint(&ctx.paint, topLeft_Rect(bounds), width_Rect(bounds), uiSeparator_ColorId);
4252 } 4290 }
4253 draw_Widget(w); 4291 drawChildren_Widget(w);
4254 /* Alt text. */ 4292 /* Alt text. */
4255 const float altTextOpacity = value_Anim(&d->altTextOpacity) * 6 - 5; 4293 const float altTextOpacity = value_Anim(&d->altTextOpacity) * 6 - 5;
4256 if (d->hoverAltPre && altTextOpacity > 0) { 4294 if (d->hoverAltPre && altTextOpacity > 0) {