【问题标题】:ncurses child window not keeping fixed widthncurses 子窗口不保持固定宽度
【发布时间】:2018-10-14 08:43:06
【问题描述】:

我有一个 ncurses 程序,有多个子窗口充当列。每个子窗口都有固定的宽度和父终端窗口的高度。

但是我发现,如果终端的宽度减小,那么其中一个窗口会失去其固定宽度,并且似乎会“溢出”其先前设置的边界,使用终端的整个剩余宽度。

这很难解释,所以我制作了一个快速 gif 来显示问题:

这是我在上面使用的代码:

#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;
}

这是另一个屏幕截图,显示了我实际程序中的问题。左边的终端是正确的,右边的是调整窗口大小并触发此问题后的结果:

当终端调整为小宽度时,如何防止窗口失去其固定宽度?

【问题讨论】:

  • 您的程序必须检查KEY_RESIZE 并使用wresize 来调整您想要的窗口。

标签: c terminal ncurses


【解决方案1】:

您可以使用 pads,而不是使用 windows。 Windows 受限于屏幕大小,而 pad 则不受限制。

当 ncurses 获得 SIGWINCH 时,它会调整 stdscrstdscr 中包含的所有内容的大小,根据需要缩小这些 窗口 以适应新的屏幕尺寸,或者(如果它们的边距匹配旧的屏幕尺寸),增加它们的尺寸。那是自动的。您的程序可以检查 getch 返回的 KEY_RESIZE 并调用 wresize 更改窗口大小(并重绘其内容)。

如果您使用了 pads,则不会调整它们的大小(pads 通过调用者可以调整的视口显示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多