首页 > 解决方案 > 更新 getmaxyx() 返回值 (ncurse / C++)

问题描述

所以,我试图能够在 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++resizencurses

解决方案


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

if(ch = KEY_RESIZE)

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

将其更改为

if(ch == KEY_RESIZE)

并摆脱

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

推荐阅读