将REQ_NEXT_CHAR限制为ncurses表单字段中的内容长度

问题描述 投票:0回答:1

[允许以ncurses编辑表单字段时,我还希望使用箭头键移动光标。哪个工作很棒。

但是,当按下KEY_RIGHT时,我叫form_driver(form, REQ_NEXT_CHAR);,它允许光标移到字段内容的末尾。这是我(几乎)最小的工作示例。

#include <stdio.h>
#include <curses.h>
#include <form.h>



int main(void) {
    FIELD *fields[2] = {NULL};
    FORM *form;
    int ch, cont, err;


    initscr();
    cbreak();
    noecho();
    curs_set(1);
    keypad(stdscr, TRUE);

    fields[0] = new_field(1, 10, 0, 0, 0, 0);
    set_field_back(fields[0], A_UNDERLINE);
    field_opts_off(fields[0], O_AUTOSKIP);
    field_opts_off(fields[0], O_NULLOK);
    field_opts_off(fields[0], O_PASSOK);
    set_field_type(fields[0], TYPE_ALNUM, 1);
    form = new_form(fields);
    post_form(form);

    cont = 1;
    while (cont) {
        ch = getch();

        switch (ch) {
        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_LINE);
            break;
        case KEY_END:
            form_driver(form, REQ_END_LINE);
            break;
        case KEY_BACKSPACE:
            form_driver(form, REQ_DEL_PREV);
            break;
        case KEY_DC:
            form_driver(form, REQ_DEL_CHAR);
            break;
        case KEY_ENTER:
        case '\n':
            err = form_driver(form, REQ_VALIDATION);
            if (err == E_OK)
                cont = 0;
            break;
        default:
            form_driver(form, ch);
            break;
        }
    }

    unpost_form(form);
    endwin();
    printf("entered: %s\n", field_buffer(fields[0], 0));

    free_form(form);
    free_field(fields[0]);
    return 0;
}

如何将REQ_NEXT_CHAR的光标移动限制为该字段的实际内容?

c ncurses
1个回答
0
投票

我个人是通过:]计算字段的有效长度。

leneff=strlen(suppr_espaces(field_buffer(field[iet2],0),0));

其中suppr_espaces是以下函数:

// ==== suppr_espaces ====== suppress spaces in the end of a string =====
char *  suppr_espaces(char * chan,char cara) // the last space is replaced by
{  char *ptc=chan; size_t len,len0;          //.. the char cara 
     len0=len=strlen(ptc); 
     while(len>0 && ptc[--len]==' ')
        ptc[len]='\0';
     if (len && ++len<len0) ptc[len]=cara;
return chan; 
}   // fin de la fonction suppr_espaces

然后,您可以将光标的位置与变量leneff进行比较,以使光标不会移动到字段实际内容的右侧

© www.soinside.com 2019 - 2024. All rights reserved.