"Ncurses终端尺寸"

24

我如何找到ncurses应用程序的终端宽度和高度?


@DylanJ,不需要将答案放在问题中,特别是一旦你接受了答案。 - paxdiablo
5个回答

28

1
另外,不要忘记一些操作系统具有SIGWINCH,当终端大小调整时,您的进程将接收到该信号。 - asveikau
initscr()将清除屏幕。有没有办法可以获取终端大小而不清除屏幕? - jiandingzhe
1
不确定这是正确的,因为 yx 不是指针,因此函数不会将任何内容复制到它们中。从 mkssoftware.com : "getbegyx() 和 getmaxyx() 宏存储了指定窗口的当前起始坐标和大小。" - Karim Manaouil
4
正如您引用的那样,这些都是宏定义,因此 yx 不需要成为指针。该宏直接作用于给定的变量,不需要复制赋值或指针。 - Shelby Oldfield

17

ncurses应用程序通常处理SIGWINCH信号,并使用ioctlTIOCGWINSZ来获取系统对屏幕大小的概念。这可能会被环境变量LINESCOLUMNS覆盖(请参见use_env)。

鉴于此,当wgetch返回KEY_RESIZE(响应于SIGWINCH)以给出代表整个终端的stdscr的大小时,ncurses全局变量LINESCOLS 就会被更新。

您当然可以使用getmaxxgetmaxygetmaxyx来获取一个或两个窗口的 x 和 y 坐标轴的限制。只有最后一个是标准的(且可移植的)。

进一步阅读:


3

我正在使用以下代码:

struct winsize size;
if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0)
    printf("TIOCGWINSZ error");
printf("%d rows, %d columns\n", size.ws_row, size.ws_col);

1
这不是很符合ncurses的风格。 - einpoklum
是的,我曾经使用过...直到我尝试重定向或使用像Netbeans这样的IDE时...在这些情况下,文件描述符必须更改(如果从stdin重定向,请使用STDOUT_FILENO;并且在使用IDE进行调试/步进时,必须打开“输出”窗口)。 - Hurukan Imperial Stepper

1

在initscr()之后,变量COLS、LINES会被初始化为屏幕大小。

来源: NCURSES编程指南

我不确定它们是否会在调整大小时更新。


1

使用 SCR_HSCR_W 怎么样?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接