diff options
Diffstat (limited to 'src/ui/inputwidget.c')
-rw-r--r-- | src/ui/inputwidget.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c index 04d3ff69..699ed184 100644 --- a/src/ui/inputwidget.c +++ b/src/ui/inputwidget.c | |||
@@ -200,9 +200,33 @@ void setMode_InputWidget(iInputWidget *d, enum iInputMode mode) { | |||
200 | d->mode = mode; | 200 | d->mode = mode; |
201 | } | 201 | } |
202 | 202 | ||
203 | static void restoreDefaultScheme_(iString *url) { | ||
204 | iUrl parts; | ||
205 | init_Url(&parts, url); | ||
206 | if (isEmpty_Range(&parts.scheme) && startsWith_String(url, "//")) { | ||
207 | prependCStr_String(url, "gemini:"); | ||
208 | } | ||
209 | } | ||
210 | |||
211 | static const iString *omitDefaultScheme_(iString *url) { | ||
212 | if (startsWithCase_String(url, "gemini://")) { | ||
213 | remove_Block(&url->chars, 0, 7); | ||
214 | } | ||
215 | return url; | ||
216 | } | ||
217 | |||
218 | static iString *utf32toUtf8_InputWidget_(const iInputWidget *d) { | ||
219 | return newUnicodeN_String(constData_Array(&d->text), size_Array(&d->text)); | ||
220 | } | ||
221 | |||
203 | const iString *text_InputWidget(const iInputWidget *d) { | 222 | const iString *text_InputWidget(const iInputWidget *d) { |
204 | if (d) { | 223 | if (d) { |
205 | return collect_String(newUnicodeN_String(constData_Array(&d->text), size_Array(&d->text))); | 224 | iString *text = collect_String(utf32toUtf8_InputWidget_(d)); |
225 | if (d->inFlags & isUrl_InputWidgetFlag) { | ||
226 | /* Add the "gemini" scheme back if one is omitted. */ | ||
227 | restoreDefaultScheme_(text); | ||
228 | } | ||
229 | return text; | ||
206 | } | 230 | } |
207 | return collectNew_String(); | 231 | return collectNew_String(); |
208 | } | 232 | } |
@@ -262,7 +286,7 @@ static void updateBuffered_InputWidget_(iInputWidget *d) { | |||
262 | if (d->inFlags & isUrl_InputWidgetFlag) { | 286 | if (d->inFlags & isUrl_InputWidgetFlag) { |
263 | /* Highlight the host name. */ | 287 | /* Highlight the host name. */ |
264 | iUrl parts; | 288 | iUrl parts; |
265 | const iString *text = text_InputWidget(d); | 289 | const iString *text = collect_String(utf32toUtf8_InputWidget_(d)); |
266 | init_Url(&parts, text); | 290 | init_Url(&parts, text); |
267 | if (!isEmpty_Range(&parts.host)) { | 291 | if (!isEmpty_Range(&parts.host)) { |
268 | bufText = new_String(); | 292 | bufText = new_String(); |
@@ -292,11 +316,9 @@ void setText_InputWidget(iInputWidget *d, const iString *text) { | |||
292 | punyEncodeUrlHost_String(enc); | 316 | punyEncodeUrlHost_String(enc); |
293 | text = enc; | 317 | text = enc; |
294 | } | 318 | } |
295 | /* Omit the default (Gemini) scheme if the window is narrow. */ | 319 | /* Omit the default (Gemini) scheme if there isn't much space. */ |
296 | if (isNarrow_Window(get_Window()) && startsWithCase_String(text, "gemini:")) { | 320 | if (isNarrow_Window(get_Window())) { // flags_Widget(as_Widget(d)) & tight_WidgetFlag) { |
297 | iString *shortened = collect_String(copy_String(text)); | 321 | text = omitDefaultScheme_(collect_String(copy_String(text))); |
298 | remove_Block(&shortened->chars, 0, 7); | ||
299 | text = shortened; | ||
300 | } | 322 | } |
301 | } | 323 | } |
302 | clearUndo_InputWidget_(d); | 324 | clearUndo_InputWidget_(d); |
@@ -674,6 +696,12 @@ static iBool processEvent_InputWidget_(iInputWidget *d, const SDL_Event *ev) { | |||
674 | else if (isMetricsChange_UserEvent(ev)) { | 696 | else if (isMetricsChange_UserEvent(ev)) { |
675 | updateMetrics_InputWidget_(d); | 697 | updateMetrics_InputWidget_(d); |
676 | } | 698 | } |
699 | else if (isResize_UserEvent(ev)) { | ||
700 | if (d->inFlags & isUrl_InputWidgetFlag) { | ||
701 | /* Restore/omit the default scheme if necessary. */ | ||
702 | setText_InputWidget(d, text_InputWidget(d)); | ||
703 | } | ||
704 | } | ||
677 | else if (isFocused_Widget(d) && isCommand_UserEvent(ev, "copy")) { | 705 | else if (isFocused_Widget(d) && isCommand_UserEvent(ev, "copy")) { |
678 | copy_InputWidget_(d, iFalse); | 706 | copy_InputWidget_(d, iFalse); |
679 | return iTrue; | 707 | return iTrue; |