ncurses дочернее окно не сохраняет фиксированную ширину - PullRequest
0 голосов
/ 04 мая 2018

У меня есть программа ncurses с несколькими дочерними окнами, действующими как столбцы. Каждое дочернее окно имеет фиксированную ширину и высоту окна родительского терминала.

Однако я обнаружил, что если ширина терминала уменьшается, то одно из окон теряет свою фиксированную ширину и, кажется, «переполняет» свои ранее установленные границы, используя всю оставшуюся ширину терминала.

Это сложно объяснить, поэтому я сделал небольшой гиф, показывающий проблему: pls help

Это код, который я использовал для вышеупомянутого:

#include <ncurses.h>

int main() {
    WINDOW * winA, * winB;
    int i = 0, width = 30;

    initscr();

    // Suppress stdout
    noecho();

    // Enable keypad
    keypad(stdscr, true);

    // interrupt, quit, suspend, and flow control characters are all passed through uninterpreted
    raw();

    winA = newwin(0, width, 0, 0);
    winB = newwin(0, width, 0, width);

    timeout(50);

    while(getch() != 'q') {
        i = width * getmaxy(stdscr);

        werase(winA);
        werase(winB);

        while (i--) {
            waddstr(winA, "0");
            waddstr(winB, "1");
        }

        wnoutrefresh(stdscr);
        wnoutrefresh(winA);
        wnoutrefresh(winB);
        doupdate();
    }

    endwin();

    return 0;
}

Вот еще один скриншот, показывающий проблему в моей настоящей программе. Терминал слева правильный, тот, что справа показывает результат после изменения размера окна и вызова этой проблемы:

enter image description here

Как я могу предотвратить потерю окон фиксированной ширины при изменении размера терминала на небольшую ширину?

1 Ответ

0 голосов
/ 04 мая 2018

Вместо того, чтобы использовать windows для всего, вы можете использовать пэды . Окна ограничены размером экрана, а планшеты - нет.

Когда ncurses получает SIGWINCH, оно изменяет размер stdscr и все, что содержится в stdscr, сжимая эти окна по мере необходимости, чтобы соответствовать новому размеру экрана, или (если их поля совпадают старые размеры экрана), увеличивая их размер. Это автоматически. Ваша программа может проверить KEY_RESIZE, возвращаемую getch и вызвать wresize, чтобы изменить размеры окна (и перерисовать их содержимое).

Если вы использовали пэды , их размер не изменяется ( пэды отображаются через окно просмотра, которое может настроить вызывающий абонент).

...