如果在 ncurses `doupdate` 中调整终端大小会发生什么?

如果在 ncurses `doupdate` 中调整终端大小会发生什么?

如果需要,ncurses 中的函数doupdate将尝试更新屏幕尺寸:

ncurses/tty/tty_update.c:

if ((SP_PARM->_endwin == ewSuspend)
|| _nc_handle_sigwinch(SP_PARM)) {
/*
 * This is a transparent extension:  XSI does not address it,
 * and applications need not know that ncurses can do it.
 *
 * Check if the terminal size has changed while curses was off
 * (this can happen in an xterm, for example), and resize the
 * ncurses data structures accordingly.
 */
_nc_update_screensize(SP_PARM);
}

我的问题是:

如果调整终端大小会发生什么这项检查已完成,但是实际上有什么内容写入终端吗?如果函数以其新大小写入终端但相信其旧大小,是否会导致程序崩溃或导致其他未定义的行为?

它似乎_nc_flush只是将显示的文本和终端控制字符刷新到输出文件描述符。但我仍然不知道如果存在尺寸问题,可能发生的最糟糕的事情是什么。它是否总是可恢复的,这意味着一旦库找到正确的终端大小,就不会发生崩溃,一切都会再次正常工作?

答案1

同意评论:如果在 ncurses 获得新的/改进的大小之前调整终端的大小,不会发生太大的情况。有些字符可能会被写入“错误”的位置,但由于 ncurses 无法确定实际的位置终端的屏幕上,它不能滥用该信息(例如)超出记录屏幕上内容的数组的限制。

处理的问题SIGWINCH是确保 ncurses 执行“不安全”信号处理程序之外的操作。信号处理程序仅设置 ncurses 可以(安全)检查的变量。

应用程序可以检测SIGWINCH何时wgetch返回KEY_RESIZE。作为返回的副作用KEY_RESIZE(参见笔记在手册页中),ncurses 将通过内部通话clearok(减少用户按某些特殊键强制刷新的需要):

如果clearok被称为TRUE作为参数,下一个调用 wrefresh 使用此窗口将完全清除屏幕并从头开始重新绘制整个屏幕。当屏幕内容是 不确定,或者在某些情况下为了更赏心悦目的视觉效果。如果win论证clearok是全局变量 curscr,下一个调用 wrefresh 与任何窗口都会导致屏幕被清除并从头开始重新绘制。

在实践中,这已经足够好了(对于旨在KEY_RESIZE提醒它们重新绘制 ncurses 无法完成的事情的程序)。这dialog例如,程序就是这样做的(参见源代码

应用程序开发人员可能仍然希望有一个重绘密钥来处理系统消息,例如,使用wall(这可能会使屏幕变得混乱)。

相关内容