Перемещение окон в ncurses - PullRequest
0 голосов
/ 23 ноября 2018

Я прочитал window(3NCURSES) справочную страницу, но я не могу полностью понять, что на самом деле делает функция mvwin() и что происходит с ее подоконами.

Приведенный ниже код создает окно с заголовком "«Окно» и рамку, он также создает подокно, которое используется для печати позиции y, x без повреждения границы родительского окна.Затем он перемещает родительское окно в новое место, но результат не тот, который я ожидал:

  1. После перемещения окна контур границы окна + текст не стирается автоматическив старом месте.

  2. После перемещения, запись текста в подокно, выводит его в старом и новом месте.

  3. Послепереместить, родительское окно имеет новые координаты 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;
}

1 Ответ

0 голосов
/ 24 ноября 2018

Очевидно, нет: быстрая проверка с Solaris 10 дает такое же поведение.Вы можете найти сценарий, в котором ncurses отличается непреднамеренно, но это не один из них. FAQ подчеркивает совместимость:

расширения (отклонения от проклятий SVr4) разрешены, только если они не изменяют документированное / наблюдаемое поведение API.

Страница справочника Solaris не дает четкого представления об этом, поскольку единственное упоминание о подокнах касается перемещения им :

Процедура mvwin() перемещает окно так, чтобы верхний левый угол находился в положении (x, y) .Если перемещение приведет к тому, что окно будет за пределами экрана, это ошибка, и окно не будет перемещено.Перемещение подокон разрешено, но его следует избегать.

Исходный код Solaris говорит об этом: он ничего не делает с подоконами.Некоторые, протестировавшие некоторое время назад ( начало 2006 ) в ответ на комментарий пользователя о различиях, указали, что ncurses неправильно пытается скопировать подокна.Эта часть ifdef'd out (так как слишком интересно просто удалить).Поскольку mvwin осталось немногое, фактический код довольно похож.

X / Open описание mvwin слишком краткое и расплывчатое, чтобы его можно было использовать.

...