summaryrefslogtreecommitdiff
path: root/src/ui/inputwidget.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-05-12 13:39:52 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-05-12 13:39:52 +0300
commit9a51c0d0a17b9270542fef133040a02868bbaea9 (patch)
treefdbc5a60b171d2618e3bb9391a568f3fa80fce0e /src/ui/inputwidget.c
parent8e2126cae79e8182562d1796b61fefc8ba74f4b8 (diff)
DocumentWidget: Input query length validation
Enforce the maximum length of 1024 bytes for Gemini URLs. The input query prompt shows how many bytes are remaining.
Diffstat (limited to 'src/ui/inputwidget.c')
-rw-r--r--src/ui/inputwidget.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/ui/inputwidget.c b/src/ui/inputwidget.c
index 72f9f706..38d025b9 100644
--- a/src/ui/inputwidget.c
+++ b/src/ui/inputwidget.c
@@ -75,6 +75,7 @@ enum iInputWidgetFlag {
75 isMarking_InputWidgetFlag = iBit(7), 75 isMarking_InputWidgetFlag = iBit(7),
76 markWords_InputWidgetFlag = iBit(8), 76 markWords_InputWidgetFlag = iBit(8),
77 needUpdateBuffer_InputWidgetFlag = iBit(9), 77 needUpdateBuffer_InputWidgetFlag = iBit(9),
78 enterKeyEnabled_InputWidgetFlag = iBit(10),
78}; 79};
79 80
80/*----------------------------------------------------------------------------------------------*/ 81/*----------------------------------------------------------------------------------------------*/
@@ -124,6 +125,8 @@ struct Impl_InputWidget {
124 int cursorVis; 125 int cursorVis;
125 uint32_t timer; 126 uint32_t timer;
126 iTextBuf * buffered; 127 iTextBuf * buffered;
128 iInputWidgetValidatorFunc validator;
129 void * validatorContext;
127}; 130};
128 131
129iDefineObjectConstructionArgs(InputWidget, (size_t maxLen), maxLen) 132iDefineObjectConstructionArgs(InputWidget, (size_t maxLen), maxLen)
@@ -295,6 +298,8 @@ static void updateLinesAndResize_InputWidget_(iInputWidget *d) {
295void init_InputWidget(iInputWidget *d, size_t maxLen) { 298void init_InputWidget(iInputWidget *d, size_t maxLen) {
296 iWidget *w = &d->widget; 299 iWidget *w = &d->widget;
297 init_Widget(w); 300 init_Widget(w);
301 d->validator = NULL;
302 d->validatorContext = NULL;
298 setFlags_Widget(w, focusable_WidgetFlag | hover_WidgetFlag | touchDrag_WidgetFlag, iTrue); 303 setFlags_Widget(w, focusable_WidgetFlag | hover_WidgetFlag | touchDrag_WidgetFlag, iTrue);
299#if defined (iPlatformMobile) 304#if defined (iPlatformMobile)
300 setFlags_Widget(w, extraPadding_WidgetFlag, iTrue); 305 setFlags_Widget(w, extraPadding_WidgetFlag, iTrue);
@@ -312,7 +317,7 @@ void init_InputWidget(iInputWidget *d, size_t maxLen) {
312 d->lastCursor = 0; 317 d->lastCursor = 0;
313 d->cursorLine = 0; 318 d->cursorLine = 0;
314 d->verticalMoveX = -1; /* TODO: Use this. */ 319 d->verticalMoveX = -1; /* TODO: Use this. */
315 d->inFlags = eatEscape_InputWidgetFlag; 320 d->inFlags = eatEscape_InputWidgetFlag | enterKeyEnabled_InputWidgetFlag;
316 iZap(d->mark); 321 iZap(d->mark);
317 setMaxLen_InputWidget(d, maxLen); 322 setMaxLen_InputWidget(d, maxLen);
318 d->maxLayoutLines = iInvalidSize; 323 d->maxLayoutLines = iInvalidSize;
@@ -423,6 +428,15 @@ void setMaxLayoutLines_InputWidget(iInputWidget *d, size_t maxLayoutLines) {
423 updateMetrics_InputWidget_(d); 428 updateMetrics_InputWidget_(d);
424} 429}
425 430
431void setValidator_InputWidget(iInputWidget *d, iInputWidgetValidatorFunc validator, void *context) {
432 d->validator = validator;
433 d->validatorContext = context;
434}
435
436void setEnterKeyEnabled_InputWidget(iInputWidget *d, iBool enterKeyEnabled) {
437 iChangeFlags(d->inFlags, enterKeyEnabled_InputWidgetFlag, enterKeyEnabled);
438}
439
426void setHint_InputWidget(iInputWidget *d, const char *hintText) { 440void setHint_InputWidget(iInputWidget *d, const char *hintText) {
427 /* Keep original for retranslations. */ 441 /* Keep original for retranslations. */
428 setCStr_String(&d->srcHint, hintText); 442 setCStr_String(&d->srcHint, hintText);
@@ -715,6 +729,9 @@ static iRanges mark_InputWidget_(const iInputWidget *d) {
715} 729}
716 730
717static void contentsWereChanged_InputWidget_(iInputWidget *d) { 731static void contentsWereChanged_InputWidget_(iInputWidget *d) {
732 if (d->validator) {
733 d->validator(d, d->validatorContext); /* this may change the contents */
734 }
718 updateLinesAndResize_InputWidget_(d); 735 updateLinesAndResize_InputWidget_(d);
719 if (d->inFlags & notifyEdits_InputWidgetFlag) { 736 if (d->inFlags & notifyEdits_InputWidgetFlag) {
720 postCommand_Widget(d, "input.edited id:%s", cstr_String(id_Widget(constAs_Widget(d)))); 737 postCommand_Widget(d, "input.edited id:%s", cstr_String(id_Widget(constAs_Widget(d))));
@@ -1068,8 +1085,10 @@ static iBool processEvent_InputWidget_(iInputWidget *d, const SDL_Event *ev) {
1068 contentsWereChanged_InputWidget_(d); 1085 contentsWereChanged_InputWidget_(d);
1069 return iTrue; 1086 return iTrue;
1070 } 1087 }
1071 d->inFlags |= enterPressed_InputWidgetFlag; 1088 if (d->inFlags & enterKeyEnabled_InputWidgetFlag) {
1072 setFocus_Widget(NULL); 1089 d->inFlags |= enterPressed_InputWidgetFlag;
1090 setFocus_Widget(NULL);
1091 }
1073 return iTrue; 1092 return iTrue;
1074 case SDLK_ESCAPE: 1093 case SDLK_ESCAPE:
1075 end_InputWidget(d, iFalse); 1094 end_InputWidget(d, iFalse);