summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app.c4
-rw-r--r--src/gmcerts.c16
-rw-r--r--src/ui/certlistwidget.c13
-rw-r--r--src/ui/documentwidget.c9
-rw-r--r--src/ui/root.c78
-rw-r--r--src/ui/sidebarwidget.c59
6 files changed, 107 insertions, 72 deletions
diff --git a/src/app.c b/src/app.c
index 5b2e88bf..587efd00 100644
--- a/src/app.c
+++ b/src/app.c
@@ -3142,6 +3142,7 @@ iBool handleCommand_App(const char *cmd) {
3142 d->certs, 3142 d->certs,
3143 findIdentity_GmCerts(d->certs, collect_Block(hexDecode_Rangecc(range_Command(cmd, "ident")))), 3143 findIdentity_GmCerts(d->certs, collect_Block(hexDecode_Rangecc(range_Command(cmd, "ident")))),
3144 url); 3144 url);
3145 postCommand_App("navigate.reload");
3145 postCommand_App("idents.changed"); 3146 postCommand_App("idents.changed");
3146 return iTrue; 3147 return iTrue;
3147 } 3148 }
@@ -3154,6 +3155,7 @@ iBool handleCommand_App(const char *cmd) {
3154 else { 3155 else {
3155 setUse_GmIdentity(ident, collect_String(suffix_Command(cmd, "url")), iFalse); 3156 setUse_GmIdentity(ident, collect_String(suffix_Command(cmd, "url")), iFalse);
3156 } 3157 }
3158 postCommand_App("navigate.reload");
3157 postCommand_App("idents.changed"); 3159 postCommand_App("idents.changed");
3158 return iTrue; 3160 return iTrue;
3159 } 3161 }
@@ -3164,7 +3166,7 @@ iBool handleCommand_App(const char *cmd) {
3164 const iGmIdentity *cur = identityForUrl_GmCerts(d->certs, docUrl); 3166 const iGmIdentity *cur = identityForUrl_GmCerts(d->certs, docUrl);
3165 iGmIdentity *dst = findIdentity_GmCerts( 3167 iGmIdentity *dst = findIdentity_GmCerts(
3166 d->certs, collect_Block(hexDecode_Rangecc(range_Command(cmd, "fp")))); 3168 d->certs, collect_Block(hexDecode_Rangecc(range_Command(cmd, "fp"))));
3167 if (cur && dst && cur != dst) { 3169 if (dst && cur != dst) {
3168 iString *useUrl = copy_String(findUse_GmIdentity(cur, docUrl)); 3170 iString *useUrl = copy_String(findUse_GmIdentity(cur, docUrl));
3169 if (isEmpty_String(useUrl)) { 3171 if (isEmpty_String(useUrl)) {
3170 useUrl = copy_String(docUrl); 3172 useUrl = copy_String(docUrl);
diff --git a/src/gmcerts.c b/src/gmcerts.c
index 345c36e0..ed4759be 100644
--- a/src/gmcerts.c
+++ b/src/gmcerts.c
@@ -146,6 +146,7 @@ iBool isUsed_GmIdentity(const iGmIdentity *d) {
146} 146}
147 147
148iBool isUsedOn_GmIdentity(const iGmIdentity *d, const iString *url) { 148iBool isUsedOn_GmIdentity(const iGmIdentity *d, const iString *url) {
149#if 0
149 size_t pos = iInvalidPos; 150 size_t pos = iInvalidPos;
150 locate_StringSet(d->useUrls, url, &pos); 151 locate_StringSet(d->useUrls, url, &pos);
151 if (pos < size_StringSet(d->useUrls)) { 152 if (pos < size_StringSet(d->useUrls)) {
@@ -159,6 +160,12 @@ iBool isUsedOn_GmIdentity(const iGmIdentity *d, const iString *url) {
159 return iTrue; 160 return iTrue;
160 } 161 }
161 } 162 }
163#endif
164 iConstForEach(StringSet, i, d->useUrls) {
165 if (startsWithCase_String(url, cstr_String(i.value))) {
166 return iTrue;
167 }
168 }
162 return iFalse; 169 return iFalse;
163} 170}
164 171
@@ -193,7 +200,13 @@ void setUse_GmIdentity(iGmIdentity *d, const iString *url, iBool use) {
193 iAssert(wasInserted); 200 iAssert(wasInserted);
194 } 201 }
195 else { 202 else {
196 remove_StringSet(d->useUrls, url); 203 iForEach(Array, i, &d->useUrls->strings.values) {
204 iString *used = i.value;
205 if (startsWithCase_String(url, cstr_String(used))) {
206 deinit_String(used);
207 remove_ArrayIterator(&i);
208 }
209 }
197 } 210 }
198} 211}
199 212
@@ -202,6 +215,7 @@ void clearUse_GmIdentity(iGmIdentity *d) {
202} 215}
203 216
204const iString *findUse_GmIdentity(const iGmIdentity *d, const iString *url) { 217const iString *findUse_GmIdentity(const iGmIdentity *d, const iString *url) {
218 if (!d) return NULL;
205 iConstForEach(StringSet, using, d->useUrls) { 219 iConstForEach(StringSet, using, d->useUrls) {
206 if (startsWith_String(url, cstr_String(using.value))) { 220 if (startsWith_String(url, cstr_String(using.value))) {
207 return using.value; 221 return using.value;
diff --git a/src/ui/certlistwidget.c b/src/ui/certlistwidget.c
index c67203e3..7c140c19 100644
--- a/src/ui/certlistwidget.c
+++ b/src/ui/certlistwidget.c
@@ -113,7 +113,7 @@ static void updateContextMenu_CertListWidget_(iCertListWidget *d) {
113 iBool usedOnCurrentPage = iFalse; 113 iBool usedOnCurrentPage = iFalse;
114 iConstForEach(StringSet, i, ident->useUrls) { 114 iConstForEach(StringSet, i, ident->useUrls) {
115 const iString *url = i.value; 115 const iString *url = i.value;
116 usedOnCurrentPage |= equalCase_String(docUrl, url); 116 usedOnCurrentPage |= startsWithCase_String(docUrl, cstr_String(url));
117 iRangecc urlStr = range_String(url); 117 iRangecc urlStr = range_String(url);
118 if (startsWith_Rangecc(urlStr, "gemini://")) { 118 if (startsWith_Rangecc(urlStr, "gemini://")) {
119 urlStr.start += 9; /* omit the default scheme */ 119 urlStr.start += 9; /* omit the default scheme */
@@ -128,6 +128,9 @@ static void updateContextMenu_CertListWidget_(iCertListWidget *d) {
128 if (!usedOnCurrentPage) { 128 if (!usedOnCurrentPage) {
129 remove_Array(items, 1); 129 remove_Array(items, 1);
130 } 130 }
131 else {
132 remove_Array(items, 0);
133 }
131 } 134 }
132 destroy_Widget(d->menu); 135 destroy_Widget(d->menu);
133 d->menu = makeMenu_Widget(as_Widget(d), data_Array(items), size_Array(items)); 136 d->menu = makeMenu_Widget(as_Widget(d), data_Array(items), size_Array(items));
@@ -166,8 +169,8 @@ static iBool processEvent_CertListWidget_(iCertListWidget *d, const SDL_Event *e
166 return iTrue; 169 return iTrue;
167 } 170 }
168 else if (isCommand_Widget(w, ev, "ident.use")) { 171 else if (isCommand_Widget(w, ev, "ident.use")) {
169 iGmIdentity * ident = menuIdentity_CertListWidget_(d); 172 iGmIdentity *ident = menuIdentity_CertListWidget_(d);
170 const iString *tabUrl = url_DocumentWidget(document_App()); 173 const iString *tabUrl = urlQueryStripped_String(url_DocumentWidget(document_App()));
171 if (ident) { 174 if (ident) {
172 if (argLabel_Command(cmd, "clear")) { 175 if (argLabel_Command(cmd, "clear")) {
173 clearUse_GmIdentity(ident); 176 clearUse_GmIdentity(ident);
@@ -388,7 +391,6 @@ void init_CertListWidget(iCertListWidget *d) {
388 init_ListWidget(&d->list); 391 init_ListWidget(&d->list);
389 setId_Widget(w, "certlist"); 392 setId_Widget(w, "certlist");
390 setBackgroundColor_Widget(w, none_ColorId); 393 setBackgroundColor_Widget(w, none_ColorId);
391 setItemHeight_ListWidget(&d->list, 3.5f * lineHeight_Text(default_FontId));
392 d->itemFonts[0] = uiContent_FontId; 394 d->itemFonts[0] = uiContent_FontId;
393 d->itemFonts[1] = uiContentBold_FontId; 395 d->itemFonts[1] = uiContentBold_FontId;
394#if defined (iPlatformMobile) 396#if defined (iPlatformMobile)
@@ -397,6 +399,7 @@ void init_CertListWidget(iCertListWidget *d) {
397 d->itemFonts[1] = uiLabelBigBold_FontId; 399 d->itemFonts[1] = uiLabelBigBold_FontId;
398 } 400 }
399#endif 401#endif
402 updateItemHeight_CertListWidget(d);
400 d->menu = NULL; 403 d->menu = NULL;
401 d->contextItem = NULL; 404 d->contextItem = NULL;
402 d->contextIndex = iInvalidPos; 405 d->contextIndex = iInvalidPos;
@@ -443,7 +446,7 @@ iBool updateItems_CertListWidget(iCertListWidget *d) {
443 cstr_String(&ident->notes)); 446 cstr_String(&ident->notes));
444 } 447 }
445 item->listItem.isSelected = isActive; 448 item->listItem.isSelected = isActive;
446 if (isUsedOnDomain_GmIdentity(ident, tabHost)) { 449 if (!isActive && isUsedOnDomain_GmIdentity(ident, tabHost)) {
447 item->indent = 1; /* will be highlighted */ 450 item->indent = 1; /* will be highlighted */
448 } 451 }
449 addItem_ListWidget(&d->list, item); 452 addItem_ListWidget(&d->list, item);
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index 3fb8498b..95286566 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -1289,8 +1289,13 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode
1289 if (category_GmStatusCode(code) == categoryClientCertificate_GmStatus) { 1289 if (category_GmStatusCode(code) == categoryClientCertificate_GmStatus) {
1290 makeFooterButtons_DocumentWidget_( 1290 makeFooterButtons_DocumentWidget_(
1291 d, 1291 d,
1292 (iMenuItem[]){ { leftHalf_Icon " ${menu.show.identities}", '4', KMOD_PRIMARY, "sidebar.mode arg:3 show:1" }, 1292 (iMenuItem[]){
1293 { person_Icon " ${menu.identity.new}", newIdentity_KeyShortcut, "ident.new" } }, 1293 { leftHalf_Icon " ${menu.show.identities}",
1294 '4',
1295 KMOD_PRIMARY,
1296 deviceType_App() == desktop_AppDeviceType ? "sidebar.mode arg:3 show:1"
1297 : "preferences idents:1" },
1298 { person_Icon " ${menu.identity.new}", newIdentity_KeyShortcut, "ident.new" } },
1294 2); 1299 2);
1295 } 1300 }
1296 /* Make a new document for the error page.*/ 1301 /* Make a new document for the error page.*/
diff --git a/src/ui/root.c b/src/ui/root.c
index 5df4b36f..f722df94 100644
--- a/src/ui/root.c
+++ b/src/ui/root.c
@@ -344,41 +344,47 @@ static iBool handleRootCommands_(iWidget *root, const char *cmd) {
344 if (ident) { 344 if (ident) {
345 str = copy_String(name_GmIdentity(ident)); 345 str = copy_String(name_GmIdentity(ident));
346 if (!isEmpty_String(&ident->notes)) { 346 if (!isEmpty_String(&ident->notes)) {
347 appendFormat_String(str, "\n%s%s", escape_Color(uiAnnotation_ColorId), 347 appendFormat_String(str, "\n\x1b[0m" uiHeading_ColorEscape "%s", cstr_String(&ident->notes));
348 cstr_String(&ident->notes));
349 } 348 }
350 } 349 }
351 pushBackN_Array( 350 pushBack_Array(
352 &items, 351 &items,
353 (iMenuItem[]){ { format_CStr("///" uiHeading_ColorEscape "%s", 352 &(iMenuItem){ format_CStr("```" uiHeading_ColorEscape "\x1b[1m%s",
354 str ? cstr_String(str) : "${menu.identity.notactive}") }, 353 str ? cstr_String(str) : "${menu.identity.notactive}") });
355 { "---" } }, 354 if (ident && isUsedOn_GmIdentity(ident, docUrl)) {
356 2); 355 pushBack_Array(&items,
356 &(iMenuItem){ close_Icon " ${ident.stopuse}",
357 0,
358 0,
359 format_CStr("ident.signout ident:%s url:%s",
360 cstr_String(fp),
361 cstr_String(docUrl)) });
362 }
363 pushBack_Array(&items, &(iMenuItem){ "---" });
357 delete_String(str); 364 delete_String(str);
358 /* Alternate identities. */ 365 /* Alternate identities. */
359 if (ident) { 366 const iString *site = collectNewRange_String(urlRoot_String(docUrl));
360 const iString *site = collectNewRange_String(urlRoot_String(docUrl)); 367 iBool haveAlts = iFalse;
361 iBool haveAlts = iFalse; 368 iConstForEach(StringArray, i, strings_SiteSpec(site, usedIdentities_SiteSpecKey)) {
362 iConstForEach(StringArray, i, strings_SiteSpec(site, usedIdentities_SiteSpecKey)) { 369 if (!fp || !equal_String(i.value, fp)) {
363 if (!equal_String(i.value, fp)) { 370 const iBlock *otherFp = collect_Block(hexDecode_Rangecc(range_String(i.value)));
364 const iBlock *otherFp = collect_Block(hexDecode_Rangecc(range_String(i.value))); 371 const iGmIdentity *other = findIdentity_GmCerts(certs_App(), otherFp);
365 const iGmIdentity *other = findIdentity_GmCerts(certs_App(), otherFp); 372 if (other && other != ident) {
366 if (other) { 373 pushBack_Array(
367 pushBack_Array( 374 &items,
368 &items, 375 &(iMenuItem){
369 &(iMenuItem){ 376 format_CStr(translateCStr_Lang("\U0001f816 ${ident.switch}"),
370 format_CStr(translateCStr_Lang("\U0001f816 ${ident.switch}"), 377 format_CStr("\x1b[1m%s",
371 cstr_String(name_GmIdentity(other))), 378 cstr_String(name_GmIdentity(other)))),
372 0, 379 0,
373 0, 380 0,
374 format_CStr("ident.switch fp:%s", cstr_String(i.value)) }); 381 format_CStr("ident.switch fp:%s", cstr_String(i.value)) });
375 haveAlts = iTrue; 382 haveAlts = iTrue;
376 }
377 } 383 }
378 } 384 }
379 if (haveAlts) { 385 }
380 pushBack_Array(&items, &(iMenuItem){ "---" }); 386 if (haveAlts) {
381 } 387 pushBack_Array(&items, &(iMenuItem){ "---" });
382 } 388 }
383 iSidebarWidget *sidebar = findWidget_App("sidebar"); 389 iSidebarWidget *sidebar = findWidget_App("sidebar");
384 pushBackN_Array( 390 pushBackN_Array(
@@ -388,14 +394,14 @@ static iBool handleRootCommands_(iWidget *root, const char *cmd) {
388 { "${menu.identity.import}", SDLK_i, KMOD_PRIMARY | KMOD_SHIFT, "ident.import" }, 394 { "${menu.identity.import}", SDLK_i, KMOD_PRIMARY | KMOD_SHIFT, "ident.import" },
389 { "---" } }, 3); 395 { "---" } }, 3);
390 if (deviceType_App() == desktop_AppDeviceType) { 396 if (deviceType_App() == desktop_AppDeviceType) {
391 pushBack_Array(&items, &(iMenuItem) 397 pushBack_Array(&items,
392 { isVisible_Widget(sidebar) && mode_SidebarWidget(sidebar) == identities_SidebarMode 398 &(iMenuItem){ isVisible_Widget(sidebar) && mode_SidebarWidget(sidebar) ==
393 ? leftHalf_Icon " ${menu.hide.identities}" 399 identities_SidebarMode
394 : leftHalf_Icon " ${menu.show.identities}", 400 ? leftHalf_Icon " ${menu.hide.identities}"
395 0, 401 : leftHalf_Icon " ${menu.show.identities}",
396 0, 402 0,
397 //deviceType_App() == phone_AppDeviceType ? "toolbar.showident" 403 0,
398 "sidebar.mode arg:3 toggle:1" }); 404 "sidebar.mode arg:3 toggle:1" });
399 } 405 }
400 else { 406 else {
401 pushBack_Array(&items, &(iMenuItem){ gear_Icon " ${menu.identities}", 0, 0, 407 pushBack_Array(&items, &(iMenuItem){ gear_Icon " ${menu.identities}", 0, 0,
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 9b94f4d9..13fc33b1 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -591,6 +591,9 @@ iBool setMode_SidebarWidget(iSidebarWidget *d, enum iSidebarMode mode) {
591 if (d->mode == mode) { 591 if (d->mode == mode) {
592 return iFalse; 592 return iFalse;
593 } 593 }
594 if (mode == identities_SidebarMode && deviceType_App() != desktop_AppDeviceType) {
595 return iFalse; /* Identities are in Settings. */
596 }
594 if (d->mode >= 0 && d->mode < max_SidebarMode) { 597 if (d->mode >= 0 && d->mode < max_SidebarMode) {
595 d->modeScroll[d->mode] = scrollPos_ListWidget(list_SidebarWidget_(d)); /* saved for later */ 598 d->modeScroll[d->mode] = scrollPos_ListWidget(list_SidebarWidget_(d)); /* saved for later */
596 } 599 }
@@ -705,33 +708,34 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
705 d->certList = NULL; 708 d->certList = NULL;
706 d->actions = NULL; 709 d->actions = NULL;
707 d->closedFolders = new_IntSet(); 710 d->closedFolders = new_IntSet();
708 /* On a phone, the right sidebar is used exclusively for Identities. */ 711 /* On a phone, the right sidebar is not used. */
709 const iBool isPhone = deviceType_App() == phone_AppDeviceType; 712 const iBool isPhone = deviceType_App() == phone_AppDeviceType;
710 if (!isPhone || d->side == left_SidebarSide) { 713 //if (!isPhone || d->side == left_SidebarSide) {
711 iWidget *buttons = new_Widget(); 714 iWidget *buttons = new_Widget();
712 setId_Widget(buttons, "buttons"); 715 setId_Widget(buttons, "buttons");
713 setDrawBufferEnabled_Widget(buttons, iTrue); 716 setDrawBufferEnabled_Widget(buttons, iTrue);
714 for (int i = 0; i < max_SidebarMode; i++) { 717 for (int i = 0; i < max_SidebarMode; i++) {
715 if (i == identities_SidebarMode && deviceType_App() != desktop_AppDeviceType) { 718 if (i == identities_SidebarMode && deviceType_App() != desktop_AppDeviceType) {
716 /* On mobile, identities are managed via Settings. */ 719 /* On mobile, identities are managed via Settings. */
717 continue; 720 continue;
718 } 721 }
719 d->modeButtons[i] = addChildFlags_Widget( 722 d->modeButtons[i] = addChildFlags_Widget(
720 buttons, 723 buttons,
721 iClob(new_LabelWidget( 724 iClob(new_LabelWidget(
722 tightModeLabels_[i], 725 tightModeLabels_[i],
723 format_CStr("%s.mode arg:%d", cstr_String(id_Widget(w)), i))), 726 format_CStr("%s.mode arg:%d", cstr_String(id_Widget(w)), i))),
724 frameless_WidgetFlag | noBackground_WidgetFlag); 727 frameless_WidgetFlag | noBackground_WidgetFlag);
725 }
726 setButtonFont_SidebarWidget(d, isPhone ? uiLabelBig_FontId : uiLabel_FontId);
727 addChildFlags_Widget(vdiv,
728 iClob(buttons),
729 arrangeHorizontal_WidgetFlag |
730 resizeWidthOfChildren_WidgetFlag |
731 arrangeHeight_WidgetFlag | resizeToParentWidth_WidgetFlag); // |
732// drawBackgroundToHorizontalSafeArea_WidgetFlag);
733 setBackgroundColor_Widget(buttons, uiBackgroundSidebar_ColorId);
734 } 728 }
729 setButtonFont_SidebarWidget(d, isPhone ? uiLabelBig_FontId : uiLabel_FontId);
730 addChildFlags_Widget(vdiv,
731 iClob(buttons),
732 arrangeHorizontal_WidgetFlag |
733 resizeWidthOfChildren_WidgetFlag |
734 arrangeHeight_WidgetFlag | resizeToParentWidth_WidgetFlag); // |
735// drawBackgroundToHorizontalSafeArea_WidgetFlag);
736 setBackgroundColor_Widget(buttons, uiBackgroundSidebar_ColorId);
737// }
738#if 0
735 else { 739 else {
736 iLabelWidget *heading = new_LabelWidget(person_Icon " ${sidebar.identities}", NULL); 740 iLabelWidget *heading = new_LabelWidget(person_Icon " ${sidebar.identities}", NULL);
737 checkIcon_LabelWidget(heading); 741 checkIcon_LabelWidget(heading);
@@ -742,6 +746,7 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
742 drawBackgroundToHorizontalSafeArea_WidgetFlag), 746 drawBackgroundToHorizontalSafeArea_WidgetFlag),
743 uiLabelLargeBold_FontId); 747 uiLabelLargeBold_FontId);
744 } 748 }
749#endif
745 iWidget *content = new_Widget(); 750 iWidget *content = new_Widget();
746 setFlags_Widget(content, resizeChildren_WidgetFlag, iTrue); 751 setFlags_Widget(content, resizeChildren_WidgetFlag, iTrue);
747 iWidget *listAndActions = makeVDiv_Widget(); 752 iWidget *listAndActions = makeVDiv_Widget();
@@ -771,8 +776,8 @@ void init_SidebarWidget(iSidebarWidget *d, enum iSidebarSide side) {
771 addChildFlags_Widget(content, iClob(d->blank), resizeChildren_WidgetFlag); 776 addChildFlags_Widget(content, iClob(d->blank), resizeChildren_WidgetFlag);
772 addChildFlags_Widget(vdiv, iClob(content), expand_WidgetFlag); 777 addChildFlags_Widget(vdiv, iClob(content), expand_WidgetFlag);
773 setMode_SidebarWidget(d, 778 setMode_SidebarWidget(d,
774 deviceType_App() == phone_AppDeviceType && d->side == right_SidebarSide ? 779 /*deviceType_App() == phone_AppDeviceType && d->side == right_SidebarSide ?
775 identities_SidebarMode : bookmarks_SidebarMode); 780 identities_SidebarMode :*/ bookmarks_SidebarMode);
776 d->resizer = 781 d->resizer =
777 addChildFlags_Widget(w, 782 addChildFlags_Widget(w,
778 iClob(new_Widget()), 783 iClob(new_Widget()),