ncurses: wgetch не может правильно читать после перемещения / изменения размера окна

Я с трудом пытаюсь получить wgetch читать данные из окна после перемещения и изменения размера.

После ввода я перемещаю окно вверх и увеличиваю его высоту на 1. Затем я очищаю окно и записываю в него данные. Проблема в том, когда я делаю wgetch (или же mvwgetch) он помещает курсор ввода в предыдущую позицию, прежде чем я переместил окно вверх.

Вот мой код:

#include <ncurses.h>

int main() {
WINDOW *win=initscr();
int y,x,i=1;
getmaxyx(win, y, x);

//creates a sub windows 1 col high
WINDOW *child=derwin(win, i, x, y-i, 0);

//doc says to touch before refresh
touchwin(win);

//print to child
waddstr(child, "hello");
wrefresh(child);
wrefresh(win);

noecho();
while(wgetch(child)!='q') {
++i;
mvderwin(child, y-i, 0);
wresize(child, i, x);
touchwin(win);

wclear(child);

waddstr(child,"hello");
wrefresh(child);
wrefresh(win);
}
delwin(child);
delwin(win);
endwin();
}

Здесь слово «привет» движется вверх, как и ожидалось, однако курсор ввода находится не в том месте. С помощью mvwgetch все еще вызывает ту же проблему. cbreak(), noecho() а также scrollok(child) также, кажется, не помогает.

Спасибо

РЕДАКТИРОВАТЬ: обновленная версия лучше отображает проблему http://liveworkspace.org/code/31DruQ$ 0

2

Решение

Вы должны поймать SIGWINCH, этот сигнал отправляется при изменении размера терминала. Сделайте endwin (), refresh (), а затем перекрасьте ваши окна. Положение курсора относительно окон, а не фактический размер терминала. Размер окна не изменяется автоматически.

Редактировать: Да, вы на самом деле изменяете размеры окна, а не терминала. В этом случае, прежде всего, сделайте обновление для дочернего объекта LAST, курсор, показанный на экране, является одним из обновлений, которые произошли в последний раз.

Поместите рамку вокруг ваших подокон и убедитесь, что они действительно меняются / перемещаются правильно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector