LINUX.ORG.RU

Ncurses не обрабатывает Esc-последовательности

 ,


0

1

Всем привет, пишу интерфейс на Ncurses для программы на C. Надо выводить окна в консоли с полем ввода строки. Строка вводится, но не обрабатываются Esc-последовательности (ввод, стрелки, etc). Код приведён, в нём функция StartUi инициализирует терминал и готовит его к работе (рисует рамку), а AskString запрашивает строку. Подскажите, что делать.

WINDOW *term, *mainwin;
unsigned int termx, termy;
void StartUi(){
    setlocale(LC_CTYPE, "ru_RU.UTF8");
    term = initscr();
    cbreak();
    noecho();
    termx = getmaxx(term);
    termy = getmaxy(term);
    mainwin = newwin(termy-2, termx-2, 1, 1);
    border(0, 0, 0, 0, 0, 0, 0, 0);
    mvaddstr(0, 2, "<qyu 0.001>");
    move(1,1);
    refresh();
};char *AskString(char *req){
    int *input, buffer;
    unsigned int reqlen, inplen;
    PANEL *dialogp;
    WINDOW *dialogw;
    echo();
    input=0;
    for(reqlen=0;*(reqlen+req);reqlen++);
    dialogw = newwin(3, 4+reqlen, 4, 10);
    keypad(dialogw, TRUE);
    wborder(dialogw, 0, 0, 0, 0, 0, 0, 0, 0);
    dialogp = new_panel(dialogw);
    mvwaddstr(dialogw, 0, 2, req);
    mvwchgat(dialogw, 1, 2, reqlen, A_REVERSE, 0, 0);
    wrefresh(dialogw);echo();
    for(inplen=0;;){
        inplen++;
        input = realloc(input, sizeof(int)*inplen);
        wmove(dialogw, 1, inplen);
        buffer = wgetch(dialogw);
        *(input+inplen-1) = buffer;
        wrefresh(dialogw);
        switch(buffer){
            case KEY_ENTER:
                noecho();
                del_panel(dialogp);
                delwin(dialogw);
                return input;
            break;
            case KEY_BACKSPACE:
                inplen--;
                *(input+inplen-1) = 0;
            break;
            case KEY_LEFT:
                inplen--;
            break;
        };
    };
};

пишу интерфейс на Ncurses для программы на C

Больше на Си++ похоже (== код похож на дерьмо какое-то).

Deleted ()

man читал ? вот и следуй ему..

Most programs would additionally use the sequence:

           nonl();
           intrflush(stdscr, FALSE);
           keypad(stdscr, TRUE);

MKuznetsov ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.