ncurses的终端大小调整和滚动问题
我正在使用ncurses库用C编程(这是第一次),我有两个问题。我在ubuntu上使用默认终端(gnome终端) 1) 我需要调整终端的大小。我使用了resizeter()和resize_term(),但它们失败了 2) 我使用scrollok()函数,问题是我丢失了滚动的行(当我使用wscrl()返回时,有空行)ncurses的终端大小调整和滚动问题,c,linux,ncurses,C,Linux,Ncurses,我正在使用ncurses库用C编程(这是第一次),我有两个问题。我在ubuntu上使用默认终端(gnome终端) 1) 我需要调整终端的大小。我使用了resizeter()和resize_term(),但它们失败了 2) 我使用scrollok()函数,问题是我丢失了滚动的行(当我使用wscrl()返回时,有空行) #包括 int main(){ 窗口*win,*win2; int i; 字符c; initscr(); cbreak(); noecho(); win=newwin(8,20,1,
#包括
int main(){
窗口*win,*win2;
int i;
字符c;
initscr();
cbreak();
noecho();
win=newwin(8,20,1,1);
盒子(赢,0,0);
win2=newwin(6,18,2,2);
scrollok(win2,1);
雷弗斯(赢);
雷弗斯(赢);
对于(i=0;i
您无法从ncurses调整终端窗口的大小。您提到的函数可以调整被诅咒绘制的终端窗口部分的大小。其思想是当用户从应用程序外部调整窗口大小时(可能使用鼠标),您捕捉SIGWINCH
信号并在处理程序中调用resizeterm
这是预期的行为,尽管在ncurses和Unix标准/POSIX中没有很好的记录。请明确说明:
如果n为正,则stdscr
向上滚动。n行丢失
从stdscr
顶部和n空白处
在底部插入行。如果
n为负数,然后向下滚动stdscr
。n空行为
插入到stdscr的顶部
和
n行从底部丢失
因此,您必须手动保存输入,并在滚动时重新打印
不能从ncurses调整终端窗口的大小,但可以调整系统调用的终端的大小
#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
WINDOW *ventana1;
system("resize -s 30 80");
initscr();
start_color();
ventana1 = newwin(15, 50, 0, 0);
init_pair(1,COLOR_YELLOW,COLOR_BLUE);
init_pair(2,COLOR_BLUE, COLOR_YELLOW);
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 20 60");
wbkgd(ventana1,COLOR_PAIR(2));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 35 85");
system("clear");
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
delwin(ventana1);
endwin();
system("resize -s 25 75");
}
#包括
#包括
int main(int argc,char*argv[]){
窗户*ventana1;
系统(“调整大小-s 30 80”);
initscr();
启动颜色();
ventana1=newwin(15,50,0,0);
初始对(1,颜色为黄色,颜色为蓝色);
初始对(2,颜色为蓝色,颜色为黄色);
wbkgd(ventana1,颜色对(1));
wprintw(ventana1,“POLLO”);
Wrenesh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
系统(“调整大小-S2060”);
wbkgd(ventana1,颜色对(2));
wprintw(ventana1,“POLLO”);
Wrenesh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
系统(“调整大小-s 35 85”);
系统(“清除”);
wbkgd(ventana1,颜色对(1));
wprintw(ventana1,“POLLO”);
Wrenesh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
德尔温(文塔纳1);
endwin();
系统(“调整大小-s 25 75”);
}
POSIX不包括这种情况,因为curses文档不是POSIX的一部分。Open Group碰巧维护了以下两个方面的文档:
- (概述)
- (文件)
- (又名“POSIX”)
- (请注意,
SIGWINCH
不存在)
如的手册页所述,您不应该从信号处理程序中调用该函数,因为它调用“不安全”函数。在几个地方讨论了“不安全”函数的主题;在gcc中,这可以作为一个开始
关于文档,@larsmans似乎引用了ncurses和“POSIX”的可比链接,但没有引用
- (似乎解决了暗示为NetBSD独有的问题)
- (必须更一般,因为它旨在涵盖不同的实现)
回到OP的问题:
示例程序没有显示OP对resizeterm
的使用,也没有显示resize\u term
的使用。没有说明,但可能OP调整了终端窗口的大小,程序没有响应。resizeterm
的手册页足够清晰,ncurses不会导致终端调整大小。因此(在某些终端上),可以使用(的实用程序)的-s
选项。如果成功,将调整终端的大小,从而发送信号。
ncurses有一个预定义的信号处理程序,但是在应用程序级别,建议使用处理KEY\u RESIZE
的方法。有几个程序可以实现这一点
将窗口中的行向上移动必然会将一些行移出窗口。这意味着将行移到窗口中以替换已离开的行。“窗口”只是一个有限大小的数据视图。对于不同大小的视图,建议开发人员使用“焊盘”(请参阅)。滚动手册页面中的注释提到了空白颜色(替换行)的一些问题。是否保留空白替换项或使用应用程序的数据填充替换项取决于应用程序。诅咒不会自动执行此操作(即使对于焊盘也是如此)
我想你的意思是调整终端的大小,而不是调整外壳的大小。大多数终端不允许转义序列来调整它们的大小,因为这对用户来说是非常烦人的。@R..Bah,至少调整终端模拟器的大小不会像调整物理终端的大小那样烦人。@R..larsmans:是的,我的意思是终端(bash就是外壳)…我更正了。@larsmans:2)我编辑了最初的帖子,放了一个简单的代码。谢谢。我已经知道了,我希望有另一个解决方案…所以,我将手动保存输入。关于第一个问题,我将根据终端窗口大小调整ncurses窗口的大小,或者我将使用转义序列调整终端窗口的大小。这个答案有几个问题(请参阅我的评论)。
#include <ncurses.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
WINDOW *ventana1;
system("resize -s 30 80");
initscr();
start_color();
ventana1 = newwin(15, 50, 0, 0);
init_pair(1,COLOR_YELLOW,COLOR_BLUE);
init_pair(2,COLOR_BLUE, COLOR_YELLOW);
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 20 60");
wbkgd(ventana1,COLOR_PAIR(2));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
system("resize -s 35 85");
system("clear");
wbkgd(ventana1,COLOR_PAIR(1));
wprintw(ventana1, "POLLO");
wrefresh(ventana1);
wgetch(ventana1);
wgetch(ventana1);
delwin(ventana1);
endwin();
system("resize -s 25 75");
}