Ncurses form.h, но как на самом деле использовать ввод? - PullRequest
0 голосов
/ 31 октября 2019

Итак, я возился с form.h из ncurses, это здорово, меню работает. Но чего-то не хватает. Что именно я делаю с данными, которые были введены? Я искал Интернет в поисках какой-либо формы примера, и ни в одной из ссылок я не могу найти никого, кто использует данные формы для чего-либо. Конечно, у нас есть отличный способ ввода текста в поля формы, но затем мы уничтожаем данные, освобождая форму, а затем поля, а затем мы даже не трогаем. Мы определенно не используем его ни для чего.

Как именно я могу использовать поля? Мы говорим field_buffer?

#include <form.h>

int main() {
    FIELD *field[4];
    FORM  *my_form;
    int ch;

    /* Initialize curses */
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    /* Initialize the fields */
    field[0] = new_field(1, 30, 1, 25, 0, 0);
    field[1] = new_field(1, 30, 3, 25, 0, 0);
    field[2] = new_field(1, 30, 4, 25, 0, 0);
    field[3] = new_field(1, 30, 5, 25, 0, 0);


    /* Set field options */

    for (int i = 0; i < 4; i++)
    {
        set_field_back(field[i], A_UNDERLINE);
        field_opts_off(field[i], O_AUTOSKIP);
    }


    /* Create the form and post it */
    my_form = new_form(field);
    post_form(my_form);
    refresh();

    mvprintw(0, 20, "");
    mvprintw(1, 10, "1:");
    mvprintw(2, 20, "");
    mvprintw(3, 10, "2:");
    mvprintw(4, 10, "3:");
    mvprintw(5, 10, "4:");
    mvprintw(6, 10, "Send (F1)");
    refresh();

    form_driver(my_form, REQ_FIRST_FIELD);

    /* Loop through to get user requests */
    while((ch = getch()) != KEY_F(1))
    {   switch(ch)
        {   case KEY_DOWN:
                /* Go to next field */
                form_driver(my_form, REQ_NEXT_FIELD);
                form_driver(my_form, REQ_END_LINE);
                break;
            case KEY_UP:
                /* Go to previous field */
                form_driver(my_form, REQ_PREV_FIELD);
                form_driver(my_form, REQ_END_LINE);
                break;
            case KEY_BACKSPACE:
                /* Delete last character */
                form_driver(my_form, REQ_DEL_PREV);
                break;
            case KEY_DC:
                /* Delete contents of field */
                form_driver(my_form, REQ_CLR_FIELD);
                break;
            case KEY_ENTER:
                form_driver(my_form, REQ_NEXT_FIELD);
                form_driver(my_form, REQ_END_LINE);
                break;
            default:
                /* If this is a normal character, it gets */
                /* Printed                */    
                form_driver(my_form, ch);
                break;
        }
    }
    form_driver(my_form, REQ_VALIDATION);
    for (int i = 0; i < 4; i++)
    {
        mvprintw(7+i, 20, field_buffer(field[i], 0)); // is this even workable?
    }
    /* Un post form and free the memory */
    unpost_form(my_form);
    free_form(my_form);
    for (int i = 0; i < 4; i++)
    {
        free_field(field[i]);
    }

    endwin();
    return 0;
}
...