使用ncurses调整终端和滚动问题的大小

ubu*_*ano 6 c linux ncurses

我使用ncurses库在C编程(这是第一次),我有两个问题.我在ubuntu上使用默认终端(gnome终端).

1)我需要调整终端的大小.我使用了resizeter()和resize_term(),但是它们都失败了.

2)我使用scrollok()函数,问题是我丢失了滚动的行(当我回到wscrl()时,有空白行).

#include <ncurses.h>

int main() {

WINDOW *win, *win2;

int i;
char c;

initscr();
cbreak();
noecho();

win=newwin(8,20,1,1);
box(win,0,0);
win2=newwin(6,18,2,2);
scrollok(win2,1);
wrefresh(win);
wrefresh(win);

for(i=0;i<15;i++){
    c=wgetch(win2);
    if(c=='u'){
        wscrl(win2,-1);
        wrefresh(win2);
    }
    else{
        wprintw(win2,"%c\n",c);
        wrefresh(win2);
    }
}

delwin(win);
delwin(win2);
endwin();

return 0;
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 6

  1. 您无法从ncurses调整终端窗口的大小.您提到的功能调整了curses绘制的终端窗口部分的大小.当用户从应用程序外部调整窗口大小时(可能使用鼠标),您的想法是捕获SIGWINCH信号并resizeterm在处理程序中调用.

  2. 这是预期的行为,尽管在ncurses和Unix标准/ POSIX中记录不足.NetBSD的curses文档明确说明了这一点:

    如果n为正,则stdscr 向上滚动. n条线从顶部丢失stdscr,n条空白线插入底部.如果 n为负,则stdscr向下滚动. Ñ空行被插入在顶部stdscrÑ线从底部丢失.

    因此,您必须手动保存输入并在滚动时重新打印.


Tho*_*key 5

POSIX 不涵盖这种情况,因为curses 文档不是POSIX 的一部分。Open Group 恰好维护以下两者的文档:

正如 手册页中所述resizeterm,您不应从信号处理程序中调用该函数,因为它调用“不安全”函数。“不安全”函数的主题在多个地方进行了讨论;gcc文档中的内容就可以作为开始。

关于文档,@larsmans 似乎引用了scroll(3),但没有引用 ncurses 和“POSIX”的类似链接。物有所值:

  • ncurses(似乎解决了 NetBSD 特有的问题)
  • X/Open(必然更通用,因为它旨在涵盖不同的实现)

回到OP的问题:

  1. 示例程序没有显示OP对resizetermnor的使用resize_term。没有说明,但大概 OP 调整了终端窗口的大小,并且程序没有响应。的手册页resizeterm非常清楚,ncurses 不会导致终端调整大小。为此(在某些终端上),可以使用(实用程序)-s选项。如果成功,则会调整终端的大小,然后发送一个. ncurses 有一个预定义的信号处理程序,但在应用程序级别,处理是推荐的方式。ncurses-examples中有几个程序可以执行此操作。resizextermSIGWINCHKEY_RESIZE
  2. 将窗口中的行向上移动必然会将一些行移出窗口。这意味着行将被移入窗口替换那些离开的行。“窗口”就是:有限大小的数据视图。对于不同尺寸的视图,建议开发人员使用“pad”(参见手册页)。滚动手册页中的注释提到了空白(替换线)颜色的一些问题。由应用程序决定是否将替换项留空或用应用程序的数据填充。Curses 不会自动执行此操作(即使对于 pad 也不会)。