From f229e183b3ab5bf9f360349143634d62e7ceacbd Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Mon, 15 Feb 2021 17:47:37 +0200 Subject: Preferences: Saturation levels as percentages --- src/ui/util.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ui/util.c b/src/ui/util.c index b52dea2d..9a98d07b 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -1123,10 +1123,10 @@ iWidget *makePreferences_Widget(void) { addChild_Widget(headings, iClob(makeHeading_Widget("Saturation:"))); iWidget *sats = new_Widget(); /* Saturation levels. */ { - addRadioButton_(sats, "prefs.saturation.3", "Full", "saturation.set arg:100"); - addRadioButton_(sats, "prefs.saturation.2", "Reduced", "saturation.set arg:66"); - addRadioButton_(sats, "prefs.saturation.1", "Minimal", "saturation.set arg:33"); - addRadioButton_(sats, "prefs.saturation.0", "Monochrome", "saturation.set arg:0"); + addRadioButton_(sats, "prefs.saturation.3", "100 %%", "saturation.set arg:100"); + addRadioButton_(sats, "prefs.saturation.2", "66 %%", "saturation.set arg:66"); + addRadioButton_(sats, "prefs.saturation.1", "33 %%", "saturation.set arg:33"); + addRadioButton_(sats, "prefs.saturation.0", "0 %%", "saturation.set arg:0"); } addChildFlags_Widget(values, iClob(sats), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); } -- cgit v1.2.3 From 6b2f1ac9c2109a237efff88c544e729445ad09f8 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Mon, 15 Feb 2021 17:50:11 +0200 Subject: DocumentWidget: Scroll position while resizing Keep the top of the view fixed during horizontal resizing. --- res/about/version.gmi | 3 ++- src/ui/documentwidget.c | 54 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/res/about/version.gmi b/res/about/version.gmi index dfdf2b97..c255e533 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi @@ -12,7 +12,8 @@ * Shift+Insert can be used for pasting clipboard contents into input fields. * Added keybinding (F11) for toggling fullscreen mode. On macOS, the shortcut is ⌃⌘F as before. * Added keybinding for finding text on page. -* Windows: Added a custom window frame to replace the default Windows one. This looks nicer but does not behave exactly like a native window frame. Added a setting to Preferences > Window for switching back to the default frame. +* Scroll position remains fixed while horizontally resizing the window or sidebars. +* Windows: Added a custom window frame to replace the default Windows one. This looks nicer but does not behave exactly like a native window frame. Added a setting to Preferences for switching back to the default frame. * Windows: Fixed a flash of white when the window is first opened. ## 1.1.3 diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 603af076..e0415f6c 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -1113,6 +1113,9 @@ static void scroll_DocumentWidget_(iDocumentWidget *d, int offset) { } static void scrollTo_DocumentWidget_(iDocumentWidget *d, int documentY, iBool centered) { + if (!hasSiteBanner_GmDocument(d->doc)) { + documentY += d->pageMargin * gap_UI; + } init_Anim(&d->scrollY, documentY - (centered ? documentBounds_DocumentWidget_(d).size.y / 2 : lineHeight_Text(paragraph_FontId))); @@ -1538,28 +1541,43 @@ static const int homeRowKeys_[] = { 't', 'y', }; +static void updateDocumentWidthRetainingScrollPosition_DocumentWidget_(iDocumentWidget *d, + iBool keepCenter) { + /* Font changes (i.e., zooming) will keep the view centered, otherwise keep the top + of the visible area fixed. */ + const iGmRun *run = keepCenter ? middleRun_DocumentWidget_(d) : d->firstVisibleRun; + const char * runLoc = (run ? run->text.start : NULL); + int voffset = 0; + if (!keepCenter && run) { + /* Keep the first visible run visible at the same position. */ + /* TODO: First *fully* visible run? */ + voffset = visibleRange_DocumentWidget_(d).start - top_Rect(run->visBounds); + } + setWidth_GmDocument(d->doc, documentWidth_DocumentWidget_(d)); + if (runLoc && !keepCenter) { + run = findRunAtLoc_GmDocument(d->doc, runLoc); + if (run) { + scrollTo_DocumentWidget_(d, + top_Rect(run->visBounds) + + lineHeight_Text(paragraph_FontId) + voffset, + iFalse); + } + } + else if (runLoc && keepCenter) { + run = findRunAtLoc_GmDocument(d->doc, runLoc); + if (run) { + scrollTo_DocumentWidget_(d, mid_Rect(run->bounds).y, iTrue); + } + } +} + static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) { iWidget *w = as_Widget(d); if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "font.changed")) { - const iBool isVerticalOnly = - !argLabel_Command(cmd, "horiz") && argLabel_Command(cmd, "vert"); /* Alt/Option key may be involved in window size changes. */ iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); - if (isVerticalOnly) { - scroll_DocumentWidget_(d, 0); /* prevent overscroll */ - } - else { - const iGmRun *mid = middleRun_DocumentWidget_(d); - const char *midLoc = (mid ? mid->text.start : NULL); - setWidth_GmDocument(d->doc, documentWidth_DocumentWidget_(d)); - scroll_DocumentWidget_(d, 0); - if (midLoc) { - mid = findRunAtLoc_GmDocument(d->doc, midLoc); - if (mid) { - scrollTo_DocumentWidget_(d, mid_Rect(mid->bounds).y, iTrue); - } - } - } + const iBool keepCenter = equal_Command(cmd, "font.changed"); + updateDocumentWidthRetainingScrollPosition_DocumentWidget_(d, keepCenter); updateSideIconBuf_DocumentWidget_(d); updateOutline_DocumentWidget_(d); invalidate_DocumentWidget_(d); @@ -3398,7 +3416,7 @@ iBool isRequestOngoing_DocumentWidget(const iDocumentWidget *d) { } void updateSize_DocumentWidget(iDocumentWidget *d) { - setWidth_GmDocument(d->doc, documentWidth_DocumentWidget_(d)); + updateDocumentWidthRetainingScrollPosition_DocumentWidget_(d, iFalse); resetWideRuns_DocumentWidget_(d); updateSideIconBuf_DocumentWidget_(d); updateOutline_DocumentWidget_(d); -- cgit v1.2.3 From 0d0de1248767931523c93212bbcae4e311929403 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 16 Feb 2021 08:08:40 +0200 Subject: DocumentWidget: Only center normal pages `about:` and error pages are centered as they are "internal" pages. --- src/ui/documentwidget.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index e0415f6c..232b4140 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -133,6 +133,7 @@ enum iDocumentWidgetFlag { showLinkNumbers_DocumentWidgetFlag = iBit(3), setHoverViaKeys_DocumentWidgetFlag = iBit(4), newTabViaHomeKeys_DocumentWidgetFlag = iBit(5), + centerVertically_DocumentWidgetFlag = iBit(6), }; enum iDocumentLinkOrdinalMode { @@ -151,6 +152,7 @@ struct Impl_DocumentWidget { iGmRequest * request; iAtomicInt isRequestUpdated; /* request has new content, need to parse it */ iObjectList * media; + enum iGmStatusCode sourceStatus; iString sourceHeader; iString sourceMime; iBlock sourceContent; /* original content as received, for saving */ @@ -231,6 +233,7 @@ void init_DocumentWidget(iDocumentWidget *d) { init_Array(&d->outline, sizeof(iOutlineItem)); init_Anim(&d->sideOpacity, 0); init_Anim(&d->outlineOpacity, 0); + d->sourceStatus = none_GmStatusCode; init_String(&d->sourceHeader); init_String(&d->sourceMime); init_Block(&d->sourceContent, 0); @@ -332,7 +335,7 @@ static iRect documentBounds_DocumentWidget_(const iDocumentWidget *d) { rect.pos.y += margin; rect.size.y -= margin; } - if (prefs_App()->centerShortDocs) { + if (d->flags & centerVertically_DocumentWidgetFlag) { const iInt2 docSize = size_GmDocument(d->doc); if (docSize.y < rect.size.y) { /* Center vertically if short. There is one empty paragraph line's worth of margin @@ -592,6 +595,10 @@ static iRangecc currentHeading_DocumentWidget_(const iDocumentWidget *d) { } static void updateVisible_DocumentWidget_(iDocumentWidget *d) { + iChangeFlags(d->flags, + centerVertically_DocumentWidgetFlag, + prefs_App()->centerShortDocs || startsWithCase_String(d->mod.url, "about:") || + !isSuccess_GmStatusCode(d->sourceStatus)); const iRangei visRange = visibleRange_DocumentWidget_(d); const iRect bounds = bounds_Widget(as_Widget(d)); setRange_ScrollWidget(d->scroll, (iRangei){ 0, scrollMax_DocumentWidget_(d) }); @@ -1038,6 +1045,7 @@ static iBool updateFromHistory_DocumentWidget_(iDocumentWidget *d) { /* Use the cached response data. */ updateTrust_DocumentWidget_(d, resp); d->sourceTime = resp->when; + d->sourceStatus = success_GmStatusCode; format_String(&d->sourceHeader, "(cached content)"); updateTimestampBuf_DocumentWidget_(d); set_Block(&d->sourceContent, &resp->body); @@ -1195,6 +1203,7 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { updateTrust_DocumentWidget_(d, resp); init_Anim(&d->sideOpacity, 0); format_String(&d->sourceHeader, "%d %s", statusCode, get_GmError(statusCode)->title); + d->sourceStatus = statusCode; switch (category_GmStatusCode(statusCode)) { case categoryInput_GmStatusCode: { iUrl parts; @@ -1576,7 +1585,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "font.changed")) { /* Alt/Option key may be involved in window size changes. */ iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); - const iBool keepCenter = equal_Command(cmd, "font.changed"); + const iBool keepCenter = equal_Command(cmd, "font.changed"); updateDocumentWidthRetainingScrollPosition_DocumentWidget_(d, keepCenter); updateSideIconBuf_DocumentWidget_(d); updateOutline_DocumentWidget_(d); @@ -1599,6 +1608,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) } else if (equal_Command(cmd, "theme.changed") && document_App() == d) { updateTheme_DocumentWidget_(d); + updateVisible_DocumentWidget_(d); updateTrust_DocumentWidget_(d, NULL); updateSideIconBuf_DocumentWidget_(d); invalidate_DocumentWidget_(d); -- cgit v1.2.3 From 180e0add685b16a916292d775b7497e8443048e7 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 16 Feb 2021 08:34:24 +0200 Subject: macOS: Retaining window position vs. zoomed --- src/ui/window.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/ui/window.c b/src/ui/window.c index d6a41d3b..cd813acb 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -1028,7 +1028,14 @@ static void invalidate_Window_(iWindow *d) { } static iBool isNormalPlacement_Window_(const iWindow *d) { - if (snap_Window(d) || d->isDrawFrozen) return iFalse; + if (d->isDrawFrozen) return iFalse; +#if defined (iPlatformApple) + /* Maximized mode is not special on macOS. */ + if (snap_Window(d) == maximized_WindowSnap) { + return iTrue; + } +#endif + if (snap_Window(d)) return iFalse; return !(SDL_GetWindowFlags(d->win) & SDL_WINDOW_MINIMIZED); } -- cgit v1.2.3 From 902ccb3d65db97ad4f8d17279806b0290d7ca332 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 16 Feb 2021 08:50:37 +0200 Subject: Search engine queries via the navbar Any text that doesn't look like a URL is passed onto the configured search URL as a query string. IssueID #157 --- res/about/version.gmi | 2 ++ src/app.c | 17 +++++++++++++++++ src/app.h | 1 + src/gmutil.c | 15 +++++++++++++++ src/gmutil.h | 1 + src/prefs.c | 2 ++ src/prefs.h | 1 + src/ui/util.c | 7 +++++-- src/ui/window.c | 14 ++++++++++---- 9 files changed, 54 insertions(+), 6 deletions(-) diff --git a/res/about/version.gmi b/res/about/version.gmi index c255e533..ba94f7e2 100644 --- a/res/about/version.gmi +++ b/res/about/version.gmi @@ -8,7 +8,9 @@ ## 1.2 * Help is opened on first run instead of the "About Lagrange" page to make it easier to discover important Gemini links like the FAQ. +* Added search engine support: non-URL text entered in the navbar is passed onto the configured search query URL (Preferences > Network). * Short pages are centered vertically on actual page content excluding the top banner. +* Added user preference for aligning all pages to the top of the window. * Shift+Insert can be used for pasting clipboard contents into input fields. * Added keybinding (F11) for toggling fullscreen mode. On macOS, the shortcut is ⌃⌘F as before. * Added keybinding for finding text on page. diff --git a/src/app.c b/src/app.c index 3d3dc6f8..b5eb5688 100644 --- a/src/app.c +++ b/src/app.c @@ -227,6 +227,7 @@ static iString *serializePrefs_App_(const iApp *d) { appendFormat_String(str, "proxy.gopher address:%s\n", cstr_String(&d->prefs.gopherProxy)); appendFormat_String(str, "proxy.http address:%s\n", cstr_String(&d->prefs.httpProxy)); appendFormat_String(str, "downloads path:%s\n", cstr_String(&d->prefs.downloadDir)); + appendFormat_String(str, "searchurl address:%s\n", cstr_String(&d->prefs.searchUrl)); return str; } @@ -937,6 +938,8 @@ static iBool handlePrefsCommands_(iWidget *d, const char *cmd) { isSelected_Widget(findChild_Widget(d, "prefs.ostheme"))); postCommandf_App("decodeurls arg:%d", isSelected_Widget(findChild_Widget(d, "prefs.decodeurls"))); + postCommandf_App("searchurl address:%s", + cstr_String(text_InputWidget(findChild_Widget(d, "prefs.searchurl")))); postCommandf_App("cachesize.set arg:%d", toInt_String(text_InputWidget(findChild_Widget(d, "prefs.cachesize")))); postCommandf_App("proxy.gemini address:%s", @@ -1122,6 +1125,15 @@ iBool willUseProxy_App(const iRangecc scheme) { return schemeProxy_App(scheme) != NULL; } +const iString *searchQueryUrl_App(const iString *queryStringUnescaped) { + iApp *d = &app_; + if (isEmpty_String(&d->prefs.searchUrl)) { + return collectNew_String(); + } + const iString *escaped = urlEncode_String(queryStringUnescaped); + return collectNewFormat_String("%s?%s", cstr_String(&d->prefs.searchUrl), cstr_String(escaped)); +} + iBool handleCommand_App(const char *cmd) { iApp *d = &app_; if (equal_Command(cmd, "config.error")) { @@ -1292,6 +1304,10 @@ iBool handleCommand_App(const char *cmd) { } return iTrue; } + else if (equal_Command(cmd, "searchurl")) { + setCStr_String(&d->prefs.searchUrl, suffixPtr_Command(cmd, "address")); + return iTrue; + } else if (equal_Command(cmd, "proxy.gemini")) { setCStr_String(&d->prefs.geminiProxy, suffixPtr_Command(cmd, "address")); return iTrue; @@ -1474,6 +1490,7 @@ iBool handleCommand_App(const char *cmd) { setText_InputWidget(findChild_Widget(dlg, "prefs.cachesize"), collectNewFormat_String("%d", d->prefs.maxCacheSize)); setToggle_Widget(findChild_Widget(dlg, "prefs.decodeurls"), d->prefs.decodeUserVisibleURLs); + setText_InputWidget(findChild_Widget(dlg, "prefs.searchurl"), &d->prefs.searchUrl); setText_InputWidget(findChild_Widget(dlg, "prefs.proxy.gemini"), &d->prefs.geminiProxy); setText_InputWidget(findChild_Widget(dlg, "prefs.proxy.gopher"), &d->prefs.gopherProxy); setText_InputWidget(findChild_Widget(dlg, "prefs.proxy.http"), &d->prefs.httpProxy); diff --git a/src/app.h b/src/app.h index efaf0a3e..54c60d10 100644 --- a/src/app.h +++ b/src/app.h @@ -75,6 +75,7 @@ iBool forceSoftwareRender_App(void); enum iColorTheme colorTheme_App (void); const iString * schemeProxy_App (iRangecc scheme); iBool willUseProxy_App (const iRangecc scheme); +const iString * searchQueryUrl_App (const iString *queryStringUnescaped); typedef void (*iTickerFunc)(iAny *); diff --git a/src/gmutil.c b/src/gmutil.c index 0e0cccc5..32bf356f 100644 --- a/src/gmutil.c +++ b/src/gmutil.c @@ -272,6 +272,21 @@ const iString *absoluteUrl_String(const iString *d, const iString *urlMaybeRelat return absolute; } +iBool isLikelyUrl_String(const iString *d) { + /* Guess whether a human intends the string to be an URL. This is supposed to be fuzzy; + not completely per-spec: a) begins with a scheme; b) has something that looks like a + hostname */ + iRegExp *pattern = new_RegExp("^([a-z]+:)?//.*|" + "^(//)?([^/?#: ]+)([/?#:].*)$|" + "^(\\w+(\\.\\w+)+|localhost)$", + caseInsensitive_RegExpOption); + iRegExpMatch m; + init_RegExpMatch(&m); + const iBool likelyUrl = matchString_RegExp(pattern, d, &m); + iRelease(pattern); + return likelyUrl; +} + static iBool equalPuny_(const iString *d, iRangecc orig) { if (!endsWith_String(d, "-")) { return iFalse; /* This is a sufficient condition? */ diff --git a/src/gmutil.h b/src/gmutil.h index 1caf2445..26385c02 100644 --- a/src/gmutil.h +++ b/src/gmutil.h @@ -104,6 +104,7 @@ void init_Url (iUrl *, const iString *text); iRangecc urlScheme_String (const iString *); iRangecc urlHost_String (const iString *); const iString * absoluteUrl_String (const iString *, const iString *urlMaybeRelative); +iBool isLikelyUrl_String (const iString *); void punyEncodeUrlHost_String(iString *); void stripDefaultUrlPort_String(iString *); const iString * urlFragmentStripped_String(const iString *); diff --git a/src/prefs.c b/src/prefs.c index a8f34b02..f9186ab3 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -51,9 +51,11 @@ void init_Prefs(iPrefs *d) { init_String(&d->gopherProxy); init_String(&d->httpProxy); init_String(&d->downloadDir); + initCStr_String(&d->searchUrl, "gemini://gus.guru/search"); } void deinit_Prefs(iPrefs *d) { + deinit_String(&d->searchUrl); deinit_String(&d->geminiProxy); deinit_String(&d->gopherProxy); deinit_String(&d->httpProxy); diff --git a/src/prefs.h b/src/prefs.h index dcda695f..1889c338 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -48,6 +48,7 @@ struct Impl_Prefs { iBool hoverLink; iBool smoothScrolling; iBool loadImageInsteadOfScrolling; + iString searchUrl; /* Network */ iBool decodeUserVisibleURLs; int maxCacheSize; /* MB */ diff --git a/src/ui/util.c b/src/ui/util.c index 9a98d07b..553d9078 100644 --- a/src/ui/util.c +++ b/src/ui/util.c @@ -1175,6 +1175,10 @@ iWidget *makePreferences_Widget(void) { } /* Network. */ { appendTwoColumnPage_(tabs, "Network", '5', &headings, &values); + addChild_Widget(headings, iClob(makeHeading_Widget("Search URL:"))); + setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.searchurl"); + addChild_Widget(headings, iClob(makeHeading_Widget("Decode URLs:"))); + addChild_Widget(values, iClob(makeToggle_Widget("prefs.decodeurls"))); addChild_Widget(headings, iClob(makeHeading_Widget("Cache size:"))); iWidget *cacheGroup = new_Widget(); { iInputWidget *cache = new_InputWidget(4); @@ -1183,8 +1187,6 @@ iWidget *makePreferences_Widget(void) { addChildFlags_Widget(cacheGroup, iClob(new_LabelWidget("MB", NULL)), frameless_WidgetFlag); } addChildFlags_Widget(values, iClob(cacheGroup), arrangeHorizontal_WidgetFlag | arrangeSize_WidgetFlag); - addChild_Widget(headings, iClob(makeHeading_Widget("Decode URLs:"))); - addChild_Widget(values, iClob(makeToggle_Widget("prefs.decodeurls"))); makeTwoColumnHeading_("PROXIES", headings, values); addChild_Widget(headings, iClob(makeHeading_Widget("Gemini proxy:"))); setId_Widget(addChild_Widget(values, iClob(new_InputWidget(0))), "prefs.proxy.gemini"); @@ -1201,6 +1203,7 @@ iWidget *makePreferences_Widget(void) { resizeToLargestPage_Widget(tabs); arrange_Widget(dlg); /* Set input field sizes. */ { + expandInputFieldWidth_(findChild_Widget(tabs, "prefs.searchurl")); expandInputFieldWidth_(findChild_Widget(tabs, "prefs.downloads")); expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.gemini")); expandInputFieldWidth_(findChild_Widget(tabs, "prefs.proxy.gopher")); diff --git a/src/ui/window.c b/src/ui/window.c index cd813acb..563d57ae 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -47,6 +47,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include +#include #include #include #include @@ -419,9 +420,14 @@ static iBool handleNavBarCommands_(iWidget *navBar, const char *cmd) { !isFocused_Widget(findWidget_App("lookup"))) { iString *newUrl = copy_String(text_InputWidget(url)); trim_String(newUrl); - postCommandf_App( - "open url:%s", - cstr_String(absoluteUrl_String(&iStringLiteral(""), collect_String(newUrl)))); + if (!isEmpty_String(&prefs_App()->searchUrl) && !isLikelyUrl_String(newUrl)) { + postCommandf_App("open url:%s", cstr_String(searchQueryUrl_App(newUrl))); + } + else { + postCommandf_App( + "open url:%s", + cstr_String(absoluteUrl_String(&iStringLiteral(""), collect_String(newUrl)))); + } return iTrue; } } @@ -1168,7 +1174,7 @@ static iBool handleWindowEvent_Window_(iWindow *d, const SDL_WindowEvent *ev) { //updateRootSize_Window_(d, iTrue); invalidate_Window_(d); d->isMinimized = iFalse; - //printf("restored %d\n", snap_Window(d)); fflush(stdout); + printf("restored %d\n", snap_Window(d)); fflush(stdout); return iTrue; case SDL_WINDOWEVENT_MINIMIZED: d->isMinimized = iTrue; -- cgit v1.2.3 From dd90cda682180f6472aa030d01317f70cc3d7282 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Tue, 16 Feb 2021 22:01:08 +0200 Subject: Updated the_Foundation Fixing Socket connecting. IssueID #43 --- lib/the_Foundation | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/the_Foundation b/lib/the_Foundation index 01f8bfef..6c0fc230 160000 --- a/lib/the_Foundation +++ b/lib/the_Foundation @@ -1 +1 @@ -Subproject commit 01f8bfef11c78aad59ae300ddc1bb9de8ce809b8 +Subproject commit 6c0fc23095a058a5fb1e7e0ded496ff83991ce04 -- cgit v1.2.3