当用户按下Ctrl-L或Ctrl-R时,我不明白用于重绘屏幕的功能。使用clearok()
,redrawwin()
或wrefresh()
与curscr
作为参数之间的区别是什么?来自OpenBSD手册页:
如果以TRUE作为参数调用clearok,则使用此窗口调用wrefresh将完全清除屏幕并从头开始重绘整个屏幕。当屏幕内容不确定时,或者在某些情况下获得更令人愉悦的视觉效果时,这非常有用。如果clearok的win参数是全局变量curscr,则使用任何窗口调用wrefresh会导致屏幕被清除并从头开始重新绘制。
...
如果wrefresh的win参数是全局变量curscr,则会立即清除屏幕并从头开始重新绘制。
...
wredrawln例程指示诅咒某些屏幕行已损坏,应该在将任何内容写入之前将其丢弃。它触及指示的线条(标记它们已更改)。例程redrawwin()触及整个窗口。
答案 0 :(得分:7)
"OpenBSD manpages"为ncurses。键绑定是无关紧要的。
您已经问过三个特征:
但那些是不同的:
clearok()
一起,你并没有告诉诅咒你已经忘记了屏幕上的内容,但是说最好清除它(并且诅咒会这样做),但是redrawwin()
不是重新绘制整个屏幕,而是窗口。如果您的应用程序模仿面板库,使某些窗口重叠并希望将一个模糊的窗口“提升”在其他窗口之上,则您的应用程序可能会这样做。最后,curscr
告诉curses绕过正常的打印顺序到窗口或stdscr
,然后将stdscr
的更改应用到 newscr
,并将 newscr
和 curscr
之间的差异应用于 curscr
即可。就诅咒而言, curscr
包含放在物理屏幕上的内容。因此,当您修改 curscr
时,curses会在要求刷新后立即更新物理屏幕。对于它的价值, curscr
功能早于ncurses,但我必须指向source-code才能显示。虽然在changelog entry from 1995中提到了这一点:
<强>
src/curses/resizwin.c
强>: 刷新curscr以强制在ncurses中更新屏幕
答案 1 :(得分:0)
通常在按下Ctrl + L或Ctrl + R时发生的事情是你的shell或正在使用的程序的问题,在这种情况下,程序将发送一个字符序列,你的终端将在(终端)清除你的时候插入屏幕。
如何获得此序列:
#include <curses.h>
#include <term.h>
#include <termios.h>
#include <sys/ioctl.h>
void init_term(void)
{
static struct termios term_new;
setupterm(NULL, 1, NULL);
ioctl(0, TCGETS, &term_new);
}
int main(void)
{
// init the ncurses
init_term();
// get the sequence for "clear" command then print it
printf("%s", tigetstr("clear"));
// and flush the buffer
fflush(stdout);
return (0);
}