NCurses getstr () с подвижным курсором? - PullRequest
3 голосов
/ 22 февраля 2011

Я хочу прочитать, используя ввод, используя getstr () в NCurses.Тем не менее, когда я использую клавиши со стрелками, он печатает коды клавиш вместо фактического перемещения курсора.Как я могу заставить его двигаться влево или вправо, чтобы я мог редактировать текст, прежде чем он будет передан в буфер?

1 Ответ

3 голосов
/ 08 марта 2011

Curses не интерпретирует клавиши со стрелками для ввода.Единственное, что вы получаете, это то, что KEY_LEFT служит клавишей возврата, когда установлен режим клавиатуры.Но, к счастью, это не так уж сложно написать свою собственную замену gettr.Для меня работает следующее:

#include <ctype.h>
#include <string.h>
#include <ncurses.h>

static void
readline(char *buffer, int buflen)
/* Read up to buflen-1 characters into `buffer`.
 * A terminating '\0' character is added after the input.  */
{
  int old_curs = curs_set(1);
  int pos = 0;
  int len = 0;
  int x, y;

  getyx(stdscr, y, x);
  for (;;) {
    int c;

    buffer[len] = ' ';
    mvaddnstr(y, x, buffer, len+1);
    move(y, x+pos);
    c = getch();

    if (c == KEY_ENTER || c == '\n' || c == '\r') {
      break;
    } else if (isprint(c)) {
      if (pos < buflen-1) {
        memmove(buffer+pos+1, buffer+pos, len-pos);
        buffer[pos++] = c;
        len += 1;
      } else {
        beep();
      }
    } else if (c == KEY_LEFT) {
      if (pos > 0) pos -= 1; else beep();
    } else if (c == KEY_RIGHT) {
      if (pos < len) pos += 1; else beep();
    } else if (c == KEY_BACKSPACE) {
      if (pos > 0) {
        memmove(buffer+pos-1, buffer+pos, len-pos);
        pos -= 1;
        len -= 1;
      } else {
        beep();
      }
    } else if (c == KEY_DC) {
      if (pos < len) {
        memmove(buffer+pos, buffer+pos+1, len-pos-1);
        len -= 1;
      } else {
        beep();
      }
    } else {
      beep();
    }
  }
  buffer[len] = '\0';
  if (old_curs != ERR) curs_set(old_curs);
}

Чтобы это работало, вам нужно включить перемещение клавиатуры и режим cbreak, а также отключить режим эха:

cbreak();
noecho();
keypad(stdscr, TRUE);

Надеюсь, это поможет
Йохен

...