Я с трудом пытаюсь получить 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
Вы должны поймать SIGWINCH, этот сигнал отправляется при изменении размера терминала. Сделайте endwin (), refresh (), а затем перекрасьте ваши окна. Положение курсора относительно окон, а не фактический размер терминала. Размер окна не изменяется автоматически.
Редактировать: Да, вы на самом деле изменяете размеры окна, а не терминала. В этом случае, прежде всего, сделайте обновление для дочернего объекта LAST, курсор, показанный на экране, является одним из обновлений, которые произошли в последний раз.
Поместите рамку вокруг ваших подокон и убедитесь, что они действительно меняются / перемещаются правильно.
Других решений пока нет …