Я прочитал window(3NCURSES)
справочную страницу, но я не могу полностью понять, что на самом деле делает функция mvwin()
и что происходит с ее подоконами.
Приведенный ниже код создает окно с заголовком "«Окно» и рамку, он также создает подокно, которое используется для печати позиции y, x без повреждения границы родительского окна.Затем он перемещает родительское окно в новое место, но результат не тот, который я ожидал:
После перемещения окна контур границы окна + текст не стирается автоматическив старом месте.
После перемещения, запись текста в подокно, выводит его в старом и новом месте.
Послепереместить, родительское окно имеет новые координаты y, x, но подокно все еще показывает старые координаты.
У меня нет большого опыта работы с ncurses, и, возможно, я что-то упустил,но это поведение совершенно нелогично.Если мне нужно вручную стереть окна в старом месте и вручную переместить все подокна, то это сводит на нет преимущество использования ncurses.Я ожидал, что ncurses автоматически обработает эти низкоуровневые детали.
Насколько я понимаю, под окнами было то, что они используются для разделения одного большого окна на меньшие непересекающиеся области.Поэтому, когда родительское окно перемещается или обновляется, все его подокна должны перемещаться или обновляться автоматически.Это правильно?
#include <assert.h>
#include <ncurses.h>
#include <unistd.h>
int main()
{
WINDOW *win, *swin;
int lines, cols, y, x;
initscr();
keypad(stdscr, TRUE);
noecho();
// Create window
lines = 10; cols = 40;
y = 5; x = 5;
win = newwin(lines, cols, y, x);
assert(win != NULL);
// Create window border
box(win, 0, 0);
mvwprintw(win, 0, 2, " Window ");
// Create subwindow
swin = subwin(win, lines-2, cols-2, y+1, x+1);
assert(swin != NULL);
// Print window and subwindow y,x
mvwprintw(swin, 0, 0, "win y,x=%d,%d swin y,x=%d,%d\n",
getbegy(win), getbegx(win), getbegy(swin), getbegx(swin));
// Refresh
wnoutrefresh(stdscr);
wnoutrefresh(win);
wnoutrefresh(swin);
doupdate();
sleep(2);
// Move window
y = 20; x = 40;
mvwin(win, y, x);
mvwprintw(swin, 0, 0, "win y,x=%d,%d swin y,x=%d,%d\n",
getbegy(win), getbegx(win), getbegy(swin), getbegx(swin));
// Refresh
wnoutrefresh(stdscr);
wnoutrefresh(win);
wnoutrefresh(swin);
doupdate();
wgetch(swin);
endwin();
return 0;
}