Ncurses 不滚动 stdscr,导致终端行为异常

Ncurses not scrolling stdscr, causing abnormal terminal behavior

本文关键字:终端 异常 滚动 stdscr Ncurses      更新时间:2023-10-16

在下面的示例中,我采用一个假定为有效.txt文件的命令行 arg,并将其输出到 function.cpp 中的屏幕。它可以很好地读取和输出 - 即使内容比终端高度长。但是滚动不起作用,Ncurses 文档要么不存在,要么很糟糕。
总结:我可以运行下面的代码,但它只会破坏终端,我必须强制退出。

void printFile(char fileName[]) {
  string line;
  string cantOpen = "Unable to open file.";
  int key;
  ifstream file;       //Stream to read from
  file.open(fileName); //Specify file to open/read
  initscr();
  scrollok(stdscr, TRUE);  //These lines are the ones I think are causing issues
  idlok(stdscr, TRUE);     //<<<
  keypad(stdscr, TRUE);    //<<<
  if(file.is_open()) {
    while(getline(file, line)) {  //Read file and output it (working fine)
      addstr(line.c_str());
      addch('n');
      refresh();
    }
    file.close();
  } else {
    addstr(cantOpen.c_str());  //Inform user file wasn't opened
    refresh();
  }
  key = getch();
  if(key == KEY_SF) {            //Scroll down
    wscrl(stdscr, 1);
  } else if(key == KEY_SR) {     //Scroll up
    wscrl(stdscr, -1);
  } else if(key == KEY_ENTER) {  //Enter to exit
    endwin();
  }
}  

我尝试过的事情:

  • 使用 scrl(stdscr, x) 而不是 wscrl(...)
  • 不检查要执行向上或向下或退出的特定击键
  • 尝试查找滚动 stdscr 的任何示例,这些示例不仅链接回文档

任何想法为什么滚动不像我在文档中看到的那样工作?

我认为您误解了这些例程的目的。它们不是为了给你比你更多的终端空间而设计的——它们只是一种在显示屏上移动文本的方式。

scrollok()意味着,如果您尝试打印太多行以输出,它将使用终端的滚动区域(硬件,如果可用,软件,如有必要)向上滚动该区域,从而导致当前滚动区域顶部的数据丢失

wscrl()的工作方式类似,导致滚动区域中的文本向上或向下滚动,导致数据丢失并用空白填充"新行"。

滚动后,必须将文本写入新区域。

希望这有帮助。