From c58985ed3105ff7fc29fc0d53ba81ba55882e05e Mon Sep 17 00:00:00 2001

From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= jaakko.keranen@iki.fi

Date: Sun, 21 Nov 2021 14:35:32 +0200

Subject: [PATCH 1/1] Site-specific Titan upload identity

The identity to be used for uploads is now in sitespec.ini, so it applies to an entire site root. This should match actual use cases better than having URL-specific identities.

Also fixed an issue with native menus. Replacing the items with new ones was not implemented.

IssueID #379


res/about/version.gmi | 2 ++

src/gmcerts.c | 6 +++++

src/sitespec.c | 51 +++++++++++++++++++++++++++++++++++++++++--

src/sitespec.h | 9 ++++++--

src/ui/uploadwidget.c | 45 ++++++++++++++++++++++++++++----------

src/ui/util.c | 50 ++++++++++++++++++++++++++----------------

src/ui/util.h | 1 +

7 files changed, 129 insertions(+), 35 deletions(-)

diff --git a/res/about/version.gmi b/res/about/version.gmi

index 020373e4..b5750c8c 100644

--- a/res/about/version.gmi

+++ b/res/about/version.gmi

@@ -8,6 +8,8 @@

1.8.3

+* Titan upload identity is remembered as a site-specific setting. It is no longer affected by selections in the Identities sidebar.

+* macOS: Fixed updating items in native menus, e.g., upload identity selection.

1.8.2

diff --git a/src/gmcerts.c b/src/gmcerts.c

index 36fd7d55..f95fea7d 100644

--- a/src/gmcerts.c

+++ b/src/gmcerts.c

@@ -295,6 +295,9 @@ static void loadIdentities_GmCerts_(iGmCerts *d) {

}

iGmIdentity *findIdentity_GmCerts(iGmCerts *d, const iBlock *fingerprint) {

 iForEach(PtrArray, i, &d->idents) {

     iGmIdentity *ident = i.ptr;

     if (cmp_Block(fingerprint, &ident->fingerprint) == 0) { /* TODO: could use a hash */

@@ -549,6 +552,9 @@ const iGmIdentity *constIdentity_GmCerts(const iGmCerts *d, unsigned int id) {

}

const iGmIdentity *identityForUrl_GmCerts(const iGmCerts *d, const iString *url) {

 lock_Mutex(d->mtx);

 const iGmIdentity *found = NULL;

 iConstForEach(PtrArray, i, &d->idents) {

diff --git a/src/sitespec.c b/src/sitespec.c

index 0332af2d..6f4546f0 100644

--- a/src/sitespec.c

+++ b/src/sitespec.c

@@ -33,17 +33,19 @@ iDeclareObjectConstruction(SiteParams)

struct Impl_SiteParams {

 iObject  object;

 uint16_t titanPort;

 int      dismissWarnings;

 /* TODO: theme seed, style settings */

};

void init_SiteParams(iSiteParams *d) {

 d->dismissWarnings = 0;

}

void deinit_SiteParams(iSiteParams *d) {

}

iDefineClass(SiteParams)

@@ -122,6 +124,9 @@ static void handleIniKeyValue_SiteSpec_(void *context, const iString *table, con

 if (!cmp_String(key, "titanPort")) {

     d->loadParams->titanPort = number_TomlValue(value);

 }

 else if (!cmp_String(key, "dismissWarnings") && value->type == int64_TomlType) {

     d->loadParams->dismissWarnings = value->value.int64;

 }

@@ -152,6 +157,10 @@ static void save_SiteSpec_(iSiteSpec *d) {

         if (params->titanPort) {

             appendFormat_String(buf, "titanPort = %u\n", params->titanPort);

         }

         if (params->dismissWarnings) {

             appendFormat_String(buf, "dismissWarnings = 0x%x\n", params->dismissWarnings);

         }

@@ -205,6 +214,30 @@ void setValue_SiteSpec(const iString *site, enum iSiteSpecKey key, int value) {

 }

}

+void setValueString_SiteSpec(const iString *site, enum iSiteSpecKey key, const iString *value) {

+}

int value_SiteSpec(const iString *site, enum iSiteSpecKey key) {

 iSiteSpec *d = &siteSpec_;

 const iSiteParams *params = constValue_StringHash(&d->sites, collect_String(lower_String(site)));

@@ -220,3 +253,17 @@ int value_SiteSpec(const iString *site, enum iSiteSpecKey key) {

         return 0;

 }    

}

+const iString *valueString_SiteSpec(const iString *site, enum iSiteSpecKey key) {

+}

diff --git a/src/sitespec.h b/src/sitespec.h

index 6b64f073..5adaeb8c 100644

--- a/src/sitespec.h

+++ b/src/sitespec.h

@@ -28,11 +28,16 @@ iDeclareType(SiteSpec)

enum iSiteSpecKey {

 titanPort_SiteSpecKey,

 dismissWarnings_SiteSpecKey,

};

void init_SiteSpec (const char *saveDir);

void deinit_SiteSpec (void);

-void setValue_SiteSpec (const iString site, enum iSiteSpecKey key, int value); / changes saved immediately */

-int value_SiteSpec (const iString *site, enum iSiteSpecKey key);

+/* changes saved immediately */

+void setValue_SiteSpec (const iString *site, enum iSiteSpecKey key, int value);

+void setValueString_SiteSpec (const iString *site, enum iSiteSpecKey key, const iString *value);

+int value_SiteSpec (const iString *site, enum iSiteSpecKey key);

+const iString * valueString_SiteSpec (const iString *site, enum iSiteSpecKey key);

diff --git a/src/ui/uploadwidget.c b/src/ui/uploadwidget.c

index 90df1958..bad00071 100644

--- a/src/ui/uploadwidget.c

+++ b/src/ui/uploadwidget.c

@@ -45,7 +45,7 @@ iDefineObjectConstruction(UploadWidget)

enum iUploadIdentity {

 none_UploadIdentity,

 dropdown_UploadIdentity,

};

@@ -104,9 +104,16 @@ static void updateInputMaxHeight_UploadWidget_(iUploadWidget *d) {

                                 (avail - inputPos.y) / lineHeight_Text(font_InputWidget(d->input))));

}

+static const iGmIdentity *titanIdentityForUrl_(const iString *url) {

+}

static const iArray *makeIdentityItems_UploadWidget_(const iUploadWidget *d) {

 iArray *items = collectNew_Array(sizeof(iMenuItem));

 pushBack_Array(items,

                &(iMenuItem){ format_CStr("${dlg.upload.id.default} (%s)",

                                          urlId ? cstr_String(name_GmIdentity(urlId))

@@ -147,7 +154,7 @@ void init_UploadWidget(iUploadWidget *d) {

 d->request = NULL;

 init_String(&d->filePath);

 d->fileSize = 0;

 init_Block(&d->idFingerprint, 0);

 const iMenuItem actions[] = {

     { "${upload.port}", 0, 0, "upload.setport" },

@@ -289,16 +296,22 @@ void deinit_UploadWidget(iUploadWidget *d) {

static void remakeIdentityItems_UploadWidget_(iUploadWidget *d) {

 iWidget *dropMenu = findChild_Widget(findChild_Widget(as_Widget(d), "upload.id"), "menu");

 const iArray *items = makeIdentityItems_UploadWidget_(d);

}

static void updateIdentityDropdown_UploadWidget_(iUploadWidget *d) {

 updateDropdownSelection_LabelWidget(

     findChild_Widget(as_Widget(d), "upload.id"),

     d->idMode == none_UploadIdentity ? " arg:0"

         ? " arg:1"

         : format_CStr(" fp:%s", cstrCollect_String(hexEncode_Block(&d->idFingerprint))));

}

@@ -422,7 +435,7 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) {

     }

     else if (arg_Command(cmd)) {

         clear_Block(&d->idFingerprint);

     }

     else {

         clear_Block(&d->idFingerprint);

@@ -452,19 +465,27 @@ static iBool processEvent_UploadWidget_(iUploadWidget *d, const SDL_Event *ev) {

     setSendProgressFunc_GmRequest(d->request, updateProgress_UploadWidget_);

     setUserData_Object(d->request, d);

     setUrl_GmRequest(d->request, &d->url);

     switch (d->idMode) {

         case none_UploadIdentity:

             signOut_GmCerts(certs_App(), url_GmRequest(d->request));

             break;

         case dropdown_UploadIdentity: {

             iGmIdentity *ident = findIdentity_GmCerts(certs_App(), &d->idFingerprint);

             break;

         }

     }

     if (isText) {

         /* Uploading text. */

diff --git a/src/ui/util.c b/src/ui/util.c

index 2624bf2b..0a9dde0c 100644

--- a/src/ui/util.c

+++ b/src/ui/util.c

@@ -809,14 +809,27 @@ static void deleteMenuItems_(iArray *items) {

 delete_Array(items);

}

-iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) {

+void releaseNativeMenu_Widget(iWidget *d) {

#if defined (iHaveNativeContextMenus)

+#else

+#endif

+}

+void setNativeMenuItems_Widget(iWidget *menu, const iMenuItem *items, size_t n) {

+#if defined (iHaveNativeContextMenus)

 setUserData_Object(menu, deepCopyMenuItems_(menu, items, n));

 /* Keyboard shortcuts still need to triggerable via the menu, although the items don't exist. */ {

     for (size_t i = 0; i < n; i++) {

         const iMenuItem *item = &items[i];

         if (item->key) {

@@ -824,6 +837,17 @@ iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) {

         }

     }

 }

+#endif

+}

+iWidget *makeMenu_Widget(iWidget *parent, const iMenuItem *items, size_t n) {

+#if defined (iHaveNativeContextMenus)

#else

 /* Non-native custom popup menu. This may still be displayed inside a separate window. */

 setDrawBufferEnabled_Widget(menu, iTrue);

@@ -990,18 +1014,6 @@ iLocalDef iBool isUsingMenuPopupWindows_(void) {

#endif

}

-void releaseNativeMenu_Widget(iWidget *d) {

-#if defined (iHaveNativeContextMenus)

-#else

-#endif

-}

void openMenuFlags_Widget(iWidget *d, iInt2 windowCoord, int menuOpenFlags) {

 const iBool postCommands = (menuOpenFlags & postCommands_MenuOpenFlags) != 0;

#if defined (iHaveNativeContextMenus)

@@ -1263,8 +1275,8 @@ void updateDropdownSelection_LabelWidget(iLabelWidget *dropButton, const char *s

     iMenuItem *item = findNativeMenuItem_Widget(menu, selectedCommand);

     if (item) {

         setSelected_NativeMenuItem(item, iTrue);

     }

     return;

 }

diff --git a/src/ui/util.h b/src/ui/util.h

index cf96dfe4..52b3a692 100644

--- a/src/ui/util.h

+++ b/src/ui/util.h

@@ -249,6 +249,7 @@ void setMenuItemDisabled_Widget (iWidget *menu, const char *comm

void setMenuItemDisabledByIndex_Widget(iWidget *menu, size_t index, iBool disable);

void setMenuItemLabel_Widget (iWidget *menu, const char *command, const char *newLabel);

void setMenuItemLabelByIndex_Widget (iWidget *menu, size_t index, const char *newLabel);

+void setNativeMenuItems_Widget (iWidget *, const iMenuItem *items, size_t n);

int checkContextMenu_Widget (iWidget *, const SDL_Event ev); / see macro below */

--

2.25.1

Proxy Information
Original URL
gemini://git.skyjake.fi/lagrange/work%2Fv1.7/patch/c58985ed3105ff7fc29fc0d53ba81ba55882e05e.patch
Status Code
Success (20)
Meta
text/plain
Capsule Response Time
269.897751 milliseconds
Gemini-to-HTML Time
4.840143 milliseconds

This content has been proxied by September (3851b).