Проблема с возвратом в библиотеку Curses

Я пытаюсь реализовать удаление символов в простом окне, использующем библиотеку Curses.

По сути, окно создается со следующим кодом для границы:

box(local_win, 0 , 0); // Set the border of the window to the default border style.

а позже, когда я продолжаю обрабатывать backspace, я делаю это с помощью следующего кода:

initscr();
cbreak();
keypad(window, TRUE);
int ch; // The character pressed by the user.

while((ch = wgetch(window)) != EOF)
{
   switch(ch)
   {
      case KEY_BACKSPACE: // Handle the backspace.
      {
         wdelch(window); // Delete the character at the position in the window.

         wrefresh(window);
         refresh();
      }
   }
}

Несмотря на то, что он удаляет символы, в конечном итоге он вытягивает правую вертикальную полосу за границу, создавая тем самым дыру в границе. Я делаю что-то не так или это случай, когда мне придется вручную вставлять пробел после каждого удаления, чтобы сохранить границу в исходном месте.

Спасибо за любую помощь в этом!


person Kris H.    schedule 29.11.2012    source источник


Ответы (3)


Да, вам нужно повторно вставить пробел непосредственно перед вертикальной чертой или (я не уверен, возможно ли это) настроить область прокрутки, которая меньше полной ширины терминала.

person R.. GitHub STOP HELPING ICE    schedule 29.11.2012
comment
Спасибо, сейчас попробую реализовать и отпишусь о результатах. - person Kris H.; 29.11.2012

Вероятно, вы хотели стереть, а не удалить символ.

person LeoNerd    schedule 29.11.2012
comment
Хмммм, на самом деле это хорошая идея, я рассмотрю это решение, так как я отвлекся и так и не удосужился попробовать вставить пробел. - person Kris H.; 29.11.2012
comment
Я только что попробовал это, но оказалось, что curses (без использования ncurses) или, по крайней мере, реализация, которая у меня есть, не включает функцию erasewchar(WIN *w), которая мне нужна, поскольку это удаление происходит в окне. Любые другие альтернативы? - person Kris H.; 29.11.2012

Вместо того, чтобы пытаться восстановить окно, обычная практика в curses заключается в создании дополнительных окон. Например, можно создать окно, в котором рисуется box, и создать подокно этого (меньшего, чем блок), в котором рисуется и обновляется текст.

Вот пример программы (с использованием derwin):

#include <stdlib.h>
#include <curses.h>
#include <locale.h>

int
main(void)
{
    int ch;
    WINDOW *frame;
    WINDOW *display;
    int xf, yf;

    setlocale(LC_ALL, "");
    initscr();
    cbreak();
    noecho();

    frame = newwin(LINES - 5, COLS - 10, 2, 2);
    box(frame, 0, 0);
    wrefresh(frame);

    getmaxyx(frame, yf, xf);
    display = derwin(frame, yf - 2, xf - 2, 1, 1);

    keypad(display, TRUE);

    while ((ch = wgetch(display)) != ERR) {
        switch (ch) {
        case '\b':
        case KEY_BACKSPACE:
            getyx(display, yf, xf);
            if (wmove(display, yf, xf - 1) != ERR) {
                wdelch(display);
            }
            break;
        default:
            waddch(display, (chtype) ch);
            break;
        }
    }
    endwin();
    return EXIT_SUCCESS;
}
person Thomas Dickey    schedule 19.04.2015