c++ - 更新 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 作为窗口管理器。如果您需要任何其他相关信息,请问我。谢谢您的帮助!
解决方案
这导致示例产生虚假结果:
if(ch = KEY_RESIZE)
因为它总是正确的(不是比较,而是分配)。“某事”没有做任何有用的事情,因为条件不正确。
将其更改为
if(ch == KEY_RESIZE)
并摆脱
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
resize_term(w.ws_row, w.ws_col);
推荐阅读
- android - ScrollView中的WebView在一直向上滑动React Native Android时调用refreshControl
- c++ - 当鼠标离开 QListView 时,ListViewItem 卡在鼠标悬停状态
- c++ - 频繁(每 5 秒)更新/维护文件/矢量镜像的最有效方式?
- node.js - 仅当摘要通过时才传递流
- youtube-data-api - 通过 api 获取 YouTube 订阅者国家和城市
- shiny - 更新多个相关输入
- asp.net-core-2.0 - asp.net core 2.0 特定版本 appsettings
- r - 在一张图表上放置两个维恩图
- image - 无法在 tizen 中显示 SVG 图像
- vue.js - 彩色应用栏完全是白色的 Vuetify