【发布时间】: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 作为窗口管理器。如果您需要任何其他相关信息,请问我。感谢您的帮助!
【问题讨论】: