Lines Matching +full:input +full:- +full:sel
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2021-2024 Alfonso Sabato Siciliano
66 unsigned int xcursor; /* position in fieldcols [0 - fieldcols-1] */
87 int sel; /* selected item in pritem, can be -1 */ member
105 RETURN_FMTERROR("item %u [0-%u] fieldlen = 0", in build_privateform()
108 RETURN_FMTERROR("item %u [0-%u] maxvaluelen = 0", in build_privateform()
111 f->nitems = nitems; in build_privateform()
115 if (conf->form.securembch != NULL) { in build_privateform()
116 mbchsize = mblen(conf->form.securembch, MB_LEN_MAX); in build_privateform()
117 if (mbtowc(&f->securewch, conf->form.securembch, mbchsize) < 0) in build_privateform()
120 } else if (conf->form.securech != '\0') { in build_privateform()
121 f->securewch = btowc(conf->form.securech); in build_privateform()
124 f->securewch = L' '; in build_privateform()
128 f->pritems = malloc(f->nitems * sizeof(struct privateitem)); in build_privateform()
129 if (f->pritems == NULL) in build_privateform()
131 f->hasbottomdesc = false; in build_privateform()
132 f->h = f->w = f->minviewrows = 0; in build_privateform()
133 for (i = 0; i < f->nitems; i++) { in build_privateform()
134 item = &f->pritems[i]; in build_privateform()
135 item->label = CHECK_STR(items[i].label); in build_privateform()
136 item->ylabel = items[i].ylabel; in build_privateform()
137 item->xlabel = items[i].xlabel; in build_privateform()
138 item->yfield = items[i].yfield; in build_privateform()
139 item->xfield = items[i].xfield; in build_privateform()
140 item->secure = items[i].flags & BSDDIALOG_FIELDHIDDEN; in build_privateform()
141 item->readonly = items[i].flags & BSDDIALOG_FIELDREADONLY; in build_privateform()
142 item->fieldnocolor = items[i].flags & BSDDIALOG_FIELDNOCOLOR; in build_privateform()
143 item->extendfield = items[i].flags & BSDDIALOG_FIELDEXTEND; in build_privateform()
144 item->fieldonebyte = items[i].flags & in build_privateform()
146 item->cursorend = items[i].flags & BSDDIALOG_FIELDCURSOREND; in build_privateform()
147 item->bottomdesc = CHECK_STR(items[i].bottomdesc); in build_privateform()
149 f->hasbottomdesc = true; in build_privateform()
150 if (item->readonly || (item->secure && !insecurecursor)) in build_privateform()
151 item->cursor = false; in build_privateform()
153 item->cursor = true; in build_privateform()
155 item->maxletters = items[i].maxvaluelen; in build_privateform()
156 item->privwbuf = calloc(item->maxletters + 1, sizeof(wchar_t)); in build_privateform()
157 if (item->privwbuf == NULL) in build_privateform()
159 memset(item->privwbuf, 0, item->maxletters + 1); in build_privateform()
160 item->pubwbuf = calloc(item->maxletters + 1, sizeof(wchar_t)); in build_privateform()
161 if (item->pubwbuf == NULL) in build_privateform()
163 memset(item->pubwbuf, 0, item->maxletters + 1); in build_privateform()
167 wcsncpy(item->privwbuf, winit, item->maxletters); in build_privateform()
168 wcsncpy(item->pubwbuf, winit, item->maxletters); in build_privateform()
170 item->nletters = wcslen(item->pubwbuf); in build_privateform()
171 if (item->secure) { in build_privateform()
172 for (j = 0; j < item->nletters; j++) in build_privateform()
173 item->pubwbuf[j] = f->securewch; in build_privateform()
176 item->fieldcols = items[i].fieldlen; in build_privateform()
177 item->xposdraw = 0; in build_privateform()
178 item->xcursor = 0; in build_privateform()
179 item->pos = 0; in build_privateform()
182 f->h = MAX(f->h, item->ylabel); in build_privateform()
183 f->h = MAX(f->h, item->yfield); in build_privateform()
184 f->w = MAX(f->w, item->xlabel + strcols(item->label)); in build_privateform()
185 f->w = MAX(f->w, item->xfield + item->fieldcols); in build_privateform()
187 itemybeg = MIN(item->ylabel, item->yfield); in build_privateform()
188 itemxbeg = MIN(item->xlabel, item->xfield); in build_privateform()
190 tmp = MIN(item->ylabel, item->yfield); in build_privateform()
192 tmp = MIN(item->xlabel, item->xfield); in build_privateform()
195 tmp = abs((int)item->ylabel - (int)item->yfield); in build_privateform()
196 f->minviewrows = MAX(f->minviewrows, tmp); in build_privateform()
198 if (f->nitems > 0) { in build_privateform()
199 f->h = f->h + 1 - itemybeg; in build_privateform()
200 f->w -= itemxbeg; in build_privateform()
201 f->minviewrows += 1; in build_privateform()
203 f->wmin = f->w; in build_privateform()
204 for (i = 0; i < f->nitems; i++) { in build_privateform()
205 f->pritems[i].ylabel -= itemybeg; in build_privateform()
206 f->pritems[i].yfield -= itemybeg; in build_privateform()
207 f->pritems[i].xlabel -= itemxbeg; in build_privateform()
208 f->pritems[i].xfield -= itemxbeg; in build_privateform()
223 if (item->pos == 0 && item->xcursor == 0) in fieldctl()
227 item->pos = 0; in fieldctl()
228 item->xcursor = 0; in fieldctl()
229 item->xposdraw = 0; in fieldctl()
236 if (item->pos == 0) in fieldctl()
238 /* check redundant by item->pos == 0 because of 'while' below */ in fieldctl()
239 if (item->xcursor == 0 && item->xposdraw == 0) in fieldctl()
243 item->pos -= 1; in fieldctl()
244 width = wcwidth(item->pubwbuf[item->pos]); in fieldctl()
245 if (((int)item->xcursor) - width < 0) { in fieldctl()
246 item->xcursor = 0; in fieldctl()
247 item->xposdraw -= 1; in fieldctl()
249 item->xcursor -= width; in fieldctl()
252 if (item->xposdraw == 0) in fieldctl()
254 if (item->xcursor >= item->fieldcols / 2) in fieldctl()
256 if (wcwidth(item->pubwbuf[item->xposdraw - 1]) + in fieldctl()
257 item->xcursor + width > item->fieldcols) in fieldctl()
260 item->xposdraw -= 1; in fieldctl()
261 item->xcursor += in fieldctl()
262 wcwidth(item->pubwbuf[item->xposdraw]); in fieldctl()
266 if (item->nletters == 0) in fieldctl()
268 if (item->pos == item->nletters) in fieldctl()
272 for (i = item->pos; i < item->nletters; i++) { in fieldctl()
273 item->privwbuf[i] = item->privwbuf[i+1]; in fieldctl()
274 item->pubwbuf[i] = item->pubwbuf[i+1]; in fieldctl()
276 item->nletters -= 1; in fieldctl()
277 item->privwbuf[i] = L'\0'; in fieldctl()
278 item->pubwbuf[i] = L'\0'; in fieldctl()
281 if (item->pos + 1 == item->maxletters) in fieldctl()
283 if (item->pos == item->nletters) in fieldctl()
287 oldwidth = wcwidth(item->pubwbuf[item->pos]); in fieldctl()
288 item->pos += 1; in fieldctl()
289 if (item->pos == item->nletters) { /* empty column */ in fieldctl()
292 nextwidth = wcwidth(item->pubwbuf[item->pos]); in fieldctl()
294 if (item->xcursor + oldwidth + nextwidth - 1 >= item->fieldcols) { in fieldctl()
296 item->xposdraw = item->pos; in fieldctl()
297 while (item->xposdraw != 0) { in fieldctl()
298 cols += wcwidth(item->pubwbuf[item->xposdraw - 1]); in fieldctl()
299 if (cols > (int)item->fieldcols) in fieldctl()
301 item->xposdraw -= 1; in fieldctl()
303 item->xcursor = 0; in fieldctl()
304 for (i = item->xposdraw; i < item->pos ; i++) in fieldctl()
305 item->xcursor += wcwidth(item->pubwbuf[i]); in fieldctl()
308 item->xcursor += oldwidth; in fieldctl()
321 if (item->nletters >= item->maxletters) in insertch()
324 for (i = (int)item->nletters - 1; i >= (int)item->pos; i--) { in insertch()
325 item->privwbuf[i+1] = item->privwbuf[i]; in insertch()
326 item->pubwbuf[i+1] = item->pubwbuf[i]; in insertch()
329 item->privwbuf[item->pos] = wch; in insertch()
330 item->pubwbuf[item->pos] = item->secure ? securewch : wch; in insertch()
331 item->nletters += 1; in insertch()
332 item->privwbuf[item->nletters] = L'\0'; in insertch()
333 item->pubwbuf[item->nletters] = L'\0'; in insertch()
363 for (i = 0; i < f->nitems; i++) { in return_values()
364 if (conf->form.value_wchar) in return_values()
365 items[i].value = (char*)wcsdup(f->pritems[i].privwbuf); in return_values()
367 items[i].value = alloc_wstomb(f->pritems[i].privwbuf); in return_values()
381 f->sel = -1; in set_first_with_default()
382 if (focusitem != NULL && *focusitem >=0 && *focusitem < (int)f->nitems) in set_first_with_default()
383 if (f->pritems[*focusitem].readonly == false) { in set_first_with_default()
384 f->sel = *focusitem; in set_first_with_default()
387 for (i = 0 ; i < f->nitems; i++) in set_first_with_default()
388 if (f->pritems[i].readonly == false) { in set_first_with_default()
389 f->sel = i; in set_first_with_default()
409 for (i = nitems - 1; i >= 0 ; i--) in lastitem()
421 for (i = curritem - 1; i >= 0; i--) in previtem()
425 for (i = nitems - 1; i > curritem - 1; i--) in previtem()
452 selected = d->bs.curr; in redrawbuttons()
454 d->bs.curr = -1; in redrawbuttons()
455 d->bs.shortcut = shortcut; in redrawbuttons()
457 d->bs.curr = selected; in redrawbuttons()
467 item = &f->pritems[idx]; in drawitem()
470 wattron(f->pad, t.dialog.color); in drawitem()
471 mvwaddstr(f->pad, item->ylabel, item->xlabel, item->label); in drawitem()
472 wattroff(f->pad, t.dialog.color); in drawitem()
475 if (item->readonly) in drawitem()
477 else if (item->fieldnocolor) in drawitem()
481 wattron(f->pad, color); in drawitem()
482 mvwhline(f->pad, item->yfield, item->xfield, ' ', item->fieldcols); in drawitem()
484 cols = wcwidth(item->pubwbuf[item->xposdraw]); in drawitem()
485 while (cols <= item->fieldcols && in drawitem()
486 item->xposdraw + n < wcslen(item->pubwbuf)) { in drawitem()
488 cols += wcwidth(item->pubwbuf[item->xposdraw + n]); in drawitem()
491 mvwaddnwstr(f->pad, item->yfield, item->xfield, in drawitem()
492 &item->pubwbuf[item->xposdraw], n); in drawitem()
493 wattroff(f->pad, color); in drawitem()
496 if (f->hasbottomdesc) { in drawitem()
497 move(SCREENLINES - 1, 2); in drawitem()
499 if (item->bottomdesc != NULL && focus) { in drawitem()
501 addstr(item->bottomdesc); in drawitem()
508 curs_set((focus && item->cursor) ? 1 : 0); in drawitem()
509 wmove(f->pad, item->yfield, item->xfield + item->xcursor); in drawitem()
523 prefresh((f)->pad, (f)->y, 0, (f)->ys, (f)->xs, (f)->ye, (f)->xe); \
525 prefresh((f)->pad, (f)->y, 0, (f)->ys, (f)->xs, (f)->ye, (f)->xe); \
532 getmaxyx(f->box, h, w); in update_formbox()
533 draw_borders(conf, f->box, LOWERED); in update_formbox()
535 if (f->viewrows < f->h) { in update_formbox()
536 wattron(f->box, t.dialog.arrowcolor); in update_formbox()
537 if (f->y > 0) in update_formbox()
538 mvwhline(f->box, 0, (w / 2) - 2, UARROW(conf), 5); in update_formbox()
540 if (f->y + f->viewrows < f->h) in update_formbox()
541 mvwhline(f->box, h-1, (w / 2) - 2, DARROW(conf), 5); in update_formbox()
542 wattroff(f->box, t.dialog.arrowcolor); in update_formbox()
550 yup = MIN(item->ylabel, item->yfield); in curriteminview()
551 ydown = MAX(item->ylabel, item->yfield); in curriteminview()
554 if (f->y > yup && f->y > 0) in curriteminview()
555 f->y = yup; in curriteminview()
556 if ((int)(f->y + f->viewrows) - 1 < (int)ydown) in curriteminview()
557 f->y = ydown - f->viewrows + 1; in curriteminview()
559 if (f->y > 0 && (f->h - f->y) < f->viewrows) in curriteminview()
560 f->y = f->h - f->viewrows; in curriteminview()
567 if (set_widget_size(d->conf, d->rows, d->cols, &d->h, &d->w) != 0) in form_size_position()
571 hform = (int) f->viewrows; in form_size_position()
572 if (f->viewrows == BSDDIALOG_AUTOSIZE) in form_size_position()
573 hform = MAX(f->h, f->minviewrows); in form_size_position()
576 if (set_widget_autosize(d->conf, d->rows, d->cols, &d->h, &d->w, in form_size_position()
577 d->text, &htext, &d->bs, hform, f->w + 4) != 0) in form_size_position()
580 if (d->h - BORDERS - htext - HBUTTONS < 2 + (int)f->minviewrows) { in form_size_position()
581 f->viewrows = f->minviewrows; /* for widget_checksize() */ in form_size_position()
582 } else if (f->viewrows == BSDDIALOG_AUTOSIZE) { in form_size_position()
583 f->viewrows = MIN(d->h - BORDERS - htext - HBUTTONS, hform) - 2; in form_size_position()
584 f->viewrows = MAX(f->viewrows, f->minviewrows); in form_size_position()
586 f->viewrows = MIN(d->h - BORDERS - htext - HBUTTONS, hform) - 2; in form_size_position()
590 if (f->viewrows < f->minviewrows) in form_size_position()
592 f->viewrows, f->minviewrows); in form_size_position()
593 if (widget_checksize(d->h, d->w, &d->bs, in form_size_position()
594 2 /* borders */ + f->minviewrows, f->w + 4) != 0) in form_size_position()
597 if (set_widget_position(d->conf, &d->y, &d->x, d->h, d->w) != 0) in form_size_position()
608 if (d->built) { in form_redraw()
612 f->viewrows = f->formheight; in form_redraw()
613 f->w = f->wmin; in form_redraw()
618 if (d->built) in form_redraw()
620 TEXTPAD(d, 2 /* box borders */ + f->viewrows + HBUTTONS); in form_redraw()
622 update_box(d->conf, f->box, d->y + d->h - 5 - f->viewrows, d->x + 2, in form_redraw()
623 f->viewrows + 2, d->w - 4, LOWERED); in form_redraw()
625 for (i = 0; i < f->nitems; i++) { in form_redraw()
626 fieldctl(&f->pritems[i], MOVE_CURSOR_BEGIN); in form_redraw()
627 if (f->pritems[i].extendfield) { in form_redraw()
628 f->w = d->w - 6; in form_redraw()
629 f->pritems[i].fieldcols = f->w - f->pritems[i].xfield; in form_redraw()
631 if (f->pritems[i].cursorend) in form_redraw()
632 fieldctl(&f->pritems[i], MOVE_CURSOR_END); in form_redraw()
635 wresize(f->pad, f->h, f->w); in form_redraw()
636 for (i = 0; i < f->nitems; i++) in form_redraw()
639 f->ys = d->y + d->h - 5 - f->viewrows + 1; in form_redraw()
640 f->ye = d->y + d->h - 5 ; in form_redraw()
641 if ((int)f->w >= d->w - 6) { /* left */ in form_redraw()
642 f->xs = d->x + 3; in form_redraw()
643 f->xe = f->xs + d->w - 7; in form_redraw()
645 f->xs = d->x + 3 + (d->w - 6)/2 - f->w/2; in form_redraw()
646 f->xe = f->xs + d->w - 5; in form_redraw()
649 if (f->sel != -1) { /* at least 1 writable item */ in form_redraw()
651 d->conf->button.always_active || !focusinform, in form_redraw()
653 wnoutrefresh(d->widget); in form_redraw()
654 curriteminview(f, &f->pritems[f->sel]); in form_redraw()
655 update_formbox(d->conf, f); in form_redraw()
656 wnoutrefresh(f->box); in form_redraw()
657 DRAWITEM_TRICK(f, f->sel, focusinform); in form_redraw()
658 } else if (f->sel == -1 && f->nitems > 0) { /* all read only */ in form_redraw()
660 wnoutrefresh(d->widget); in form_redraw()
661 update_formbox(d->conf, f); in form_redraw()
662 wnoutrefresh(f->box); in form_redraw()
665 wnoutrefresh(f->box); in form_redraw()
680 wint_t input; in bsddialog_form() local
700 if (form.sel != -1) { in bsddialog_form()
703 item = &form.pritems[form.sel]; in bsddialog_form()
717 if ((wchtype = get_wch(&input)) == ERR) in bsddialog_form()
719 switch(input) { in bsddialog_form()
722 if (focusinform && conf->button.always_active == false) in bsddialog_form()
728 if (conf->key.enable_esc) { in bsddialog_form()
741 if (form.sel != -1) { in bsddialog_form()
752 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
754 d.bs.curr--; in bsddialog_form()
757 } else if (form.sel != -1) { in bsddialog_form()
764 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
765 } else if (d.bs.curr < (int) d.bs.nbuttons - 1) { in bsddialog_form()
769 } else if (form.sel != -1) { in bsddialog_form()
777 form.sel); in bsddialog_form()
778 changeitem = form.sel != next; in bsddialog_form()
779 } else if (form.sel != -1) { in bsddialog_form()
791 form.sel); in bsddialog_form()
792 changeitem = form.sel != next; in bsddialog_form()
798 changeitem = form.sel != next; in bsddialog_form()
804 changeitem = form.sel != next; in bsddialog_form()
813 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
819 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
825 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
831 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
834 if (conf->key.f1_file == NULL && in bsddialog_form()
835 conf->key.f1_message == NULL) in bsddialog_form()
854 if (item->fieldonebyte && wctob(input) == EOF) in bsddialog_form()
861 if (insertch(item, input, form.securewch)) { in bsddialog_form()
867 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
870 if (shortcut_buttons(input, &d.bs)) { in bsddialog_form()
884 conf->button.always_active || !focusinform, in bsddialog_form()
887 DRAWITEM_TRICK(&form, form.sel, focusinform); in bsddialog_form()
892 DRAWITEM_TRICK(&form, form.sel, false); in bsddialog_form()
893 form.sel = next; in bsddialog_form()
894 item = &form.pritems[form.sel]; in bsddialog_form()
898 DRAWITEM_TRICK(&form, form.sel, true); in bsddialog_form()
909 *focusitem = form.sel; in bsddialog_form()
911 if (form.hasbottomdesc && conf->clear) { in bsddialog_form()
912 move(SCREENLINES - 1, 2); in bsddialog_form()