#define _XOPEN_SOURCE 600 #define _XOPEN_SOURCE_EXTENDED #include #include #include #include #define TRY_MULTIBYTE 1 int main() { FIELD * fields[2]; FORM * form; WINDOW * outer; WINDOW * inner; int rows; int cols; int done; setlocale(LC_ALL, ""); initscr(); keypad(stdscr, TRUE); nonl(); cbreak(); noecho(); fields[0] = new_field(1, 20, 0, 1, 0, 0); fields[1] = NULL; form = new_form(fields); scale_form(form, &rows, &cols); outer = newwin(rows + 2, cols + 2, (LINES - rows) / 2, (COLS - cols) / 2); inner = derwin(outer, rows, cols, 1, 1); box(outer, 0, 0); keypad(outer, TRUE); set_form_win(form, outer); set_form_sub(form, inner); post_form(form); wrefresh(outer); done = 0; while (done == 0) { int i; wint_t ch = 0; char buf[20]; #if TRY_MULTIBYTE int n; int j; #endif i = get_wch(&ch); snprintf(buf, sizeof(buf), "i: %d; ch: %lu ", i, (unsigned long) ch); mvaddstr(LINES - 1, 0, buf); refresh(); switch (i) { case OK: switch (ch) { case '\r': case '\n': form_driver(form, REQ_VALIDATION); done = KEY_ENTER; break; case '\x03': /* Ctrl + C */ case '\x1b': /* Esc */ done = KEY_CANCEL; break; case '\x08': /* Ctrl + H */ if (form_driver(form, REQ_PREV_CHAR) == E_OK) { form_driver(form, REQ_DEL_CHAR); } break; case '\x15': /* Ctrl + U */ while (form_driver(form, REQ_PREV_CHAR) == E_OK) { form_driver(form, REQ_DEL_CHAR); } break; case 0: beep(); break; default: #if TRY_MULTIBYTE n = wctomb(buf, ch); for (j = 0; j < n; ++j) { if ((i = form_driver(form, buf[j])) != E_OK) { snprintf(buf, sizeof(buf), "driver: %d (%d/%d)", i, j, n); break; } } #else i = form_driver(form, ch); snprintf(buf, sizeof(buf), "driver: %d", i); #endif mvaddstr(LINES - 1, 40, buf); refresh(); break; } break; case KEY_CODE_YES: switch (ch) { case KEY_ENTER: form_driver(form, REQ_VALIDATION); done = KEY_ENTER; break; case KEY_CANCEL: case KEY_BREAK: case KEY_EXIT: done = KEY_CANCEL; break; case KEY_DC: form_driver(form, REQ_DEL_CHAR); break; case KEY_BACKSPACE: if (form_driver(form, REQ_PREV_CHAR) == E_OK) { form_driver(form, REQ_DEL_CHAR); } break; case KEY_LEFT: form_driver(form, REQ_PREV_CHAR); break; case KEY_RIGHT: form_driver(form, REQ_NEXT_CHAR); break; case KEY_HOME: form_driver(form, REQ_BEG_FIELD); break; case KEY_END: form_driver(form, REQ_END_FIELD); break; default: form_driver(form, ch); break; } break; case ERR: done = KEY_CANCEL; break; } wrefresh(outer); } delwin(inner); delwin(outer); free_form(form); free_field(fields[0]); endwin(); return 0; }