【问题标题】:Update getmaxyx() return values (ncurse / C++)更新 getmaxyx() 返回值 (ncurse / C++)
【发布时间】:2021-10-18 02:12:00
【问题描述】:

所以,我正在尝试使用 C++ 中的 ncurse 正确调整控制台窗口的大小。当窗口调整大小时,我已经能够捕捉到,问题是我不是 100% 确定在那之后我应该如何进行。假设我的 main 函数中有这个循环(在初始化 ncurse 和那些东西之后......):

while(ch = getch())
{
        if(ch == KEY_RESIZE)
        {
            DoSometing();
        }
}

正如我所说,该示例中的 DoSomething 被调用。但是如果我尝试使用 ncurse 的函数来获取窗口的新大小

getmaxyx(stdscr, yMax, xMax);

我一遍又一遍地得到相同的值(初始值)。我猜那是因为当我执行 initscr() 时,窗口大小存储在某个地方,这就是 getmaxyx 函数提供的值。我尝试过调用 endwin() 和再次调用 initscr() 来恢复这些值,但这似乎不起作用,getmaxyx 返回的值是固定的。

在寻找替代解决方案后,我使用其他一些库解决了这个问题。这是一个小例子,实际上可以按我的意愿工作:

#include <cstdlib>
#include <ncurses.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    initscr();

    noecho();
    box(stdscr, 0, 0);

    struct winsize w;
    int ch, x, y;
    
    while(ch = getch())
    {
        if(ch == KEY_RESIZE)
        {            
            ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
            resize_term(w.ws_row, w.ws_col);
            clear();
            box(stdscr, 0, 0);
        }
        refresh();
    }

    
}

问题是我在使用这个新库时有点担心可移植性(我不完全确定,因为我还没有开始测试,但我知道 ncurse 程序可以移植到 Windows)。

如果我现在做的没问题或者我应该以任何其他方式做,我真的很感激任何关于如何在不使用任何其他库(如果可能的话)的情况下在 ncurse 中执行此操作的信息。任何正确方向的提示都是我正在寻找的:)

我正在使用 Arch Linux(有点菜鸟)和 qtile 作为窗口管理器。如果您需要任何其他相关信息,请问我。感谢您的帮助!

【问题讨论】:

    标签: c++ resize ncurses


    【解决方案1】:

    这导致示例产生虚假结果:

    if(ch = KEY_RESIZE)
    

    因为它总是正确的(不是比较,而是赋值)。 “某事”没有做任何有用的事情,因为条件不正确。

    改成

    if(ch == KEY_RESIZE)
    

    摆脱

            ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
            resize_term(w.ws_row, w.ws_col);
    

    【讨论】:

    • 是的,我对 if(ch == KEY_RESIZE) 错误不好。但是,摆脱你所说的并不能解决问题。我想要实现的是,当用户调整终端大小时,主窗口(stdscr)会更新它的大小。我提供的代码就是这样做的,但是如果我删除这两行,它将无法正确更新。
    猜你喜欢
    • 2021-02-09
    • 2013-04-20
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多