Ncurses,如果我在C中调整终端窗口的大小,则为空屏幕



这是代码:

#include <curses.h>
int main() {
initscr();
curs_set(2);
for(int i=0;i<COLS;i++){ //COLS NUMERO MASSIMO DI COLONNE
mvaddch(0,i,'*');
mvaddch(LINES-1,i,'*'); //LINES NUMERO MASSIMO RIGHE SE PARTO DALL'ULTIMO RIGA = (LINES -1)
}
refresh();
endwin(); 
return 0; 
}

一切都还好,但如果我调整cygwin的窗口大小,屏幕就会变空。我和薄荷糖玩过游戏。

该示例具有误导性:

  • 如果ncurses由于调整大小而清除了屏幕,那么您将有一个getch来阻止程序退出(并捕获KEY_RESIZE)
  • 但是该示例在屏幕上写入一些字符并退出

如果您的终端(如mintty)使用xterm终端描述,它将暂时切换到备用屏幕(写入这些字符的地方),并且在退出ncurses时(按照终端描述中的说明)切换回

正常屏幕切换到备用屏幕/从备用屏幕切换的终端功能是smcuprmcup。您可以使用不同的(或修改过的)终端描述。或者您可以告诉mintty不要切换到备用屏幕。根据其手册页面,它可以在设置对话框中这样做:

备用屏幕(NoAltScreen=false)
使用此设置,可以禁用备用屏幕。

手册指出这些设置对应于菜单项,您可能会发现这比编辑配置文件更简单:

Mintty还向窗口菜单添加了几个项目,可以通过单击程序图标或按Alt+Space来访问这些项目。

两个菜单都有一个条目,该条目指向用于更改mintty配置的选项对话框

ncurses通过三种方法获取窗口大小:

  • 在支持TIOCGWINSZioctl(2)的终端中,通过在initscr(3)调用处获取窗口维度的调用
  • 通过terminfo数据库提供的信息。许多端子类型都有固定的尺寸,线和列的适当值都是从该数据库中获得的
  • 通过获取LINES和COLUMNS环境变量的值

好吧,bash(1)通常会在程序退出时和调用下一个程序之前将这些环境变量值调整为正确的值,如果这对bash(1)可用,但如果您的程序不支持SIGWINCH信号(或不处理它),很可能ncurses库不会知道在程序运行期间窗口大小发生了变化(无论如何,默认情况下,我都没有看到ncurses检测到这一点)。即使在支持它的系统上运行,如果不为该信号安装信号处理程序,ncurses库本身也无法承受窗口尺寸的更改,因为它必须调整stdscr内容的大小,并且可以使用几个标准来处理旧内容和新的可用空间。

我观察到的标准是,ncurses本身不会处理窗口更改(至少在默认情况下,你必须考虑这与ncurses发生的情况相同,它不会检测到是否有另一个进程写入了你的tty,并且屏幕出现混乱)。要处理此问题,您必须为SIGWINCH信号安装一个信号处理程序(当终端尺寸发生变化时,通常从pty主机端向整个进程组发送此信号),并使合适的ioctl(2)到达tty设备以获得新的窗口尺寸,并调用合适的低级别ncurses例程来更改stdsrcstdwin缓冲器的新几何结构,因为这将需要为它们重新分配内存。这意味着你可以自由决定终端上窗口内容的大小,但需要做所有的工作来处理。我有一个程序,在SIGWINCH上,只有exec(2)自己启动,所以它在initscr(3)调用中获得了新的屏幕尺寸。如果您无法自动-exec(2)您的程序,只需深入了解有关如何重置stdscr维度以及正确更改LINSCOLS全局变量的文档即可。(如果我找到关于如何做的文档,我会用合适的信息编辑这个答案。)

注释

我已经运行了你的程序,它按预期运行。。。用星号填充第一行和最后一行。只需在endwin()之前调用getch()即可查看绘制的屏幕。

相关内容

  • 没有找到相关文章

最新更新