【问题标题】:Ncurses not scrolling stdscr, causing abnormal terminal behaviorNcurses 不滚动 stdscr,导致终端行为异常
【发布时间】:2016-11-09 01:11:46
【问题描述】:

在下面的示例中,我接受了一个假定为有效 .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 的示例,而不仅仅是链接回文档

任何想法为什么滚动不起作用,正如我在文档中看到的那样?

【问题讨论】:

  • 如果你提供了一个完整的例子,有人可能会编译它,看看它实际上做了什么。

标签: c++ c++11 scroll terminal ncurses


【解决方案1】:

我认为您误解了这些例程的目的。它们并非旨在为您提供比您更多的终端空间——它们只是一种在显示屏上移动文本的方式。

scrollok() 表示如果您尝试打印太多行以输出,它将使用终端的滚动区域(硬件如果可用,软件如果需要)向上滚动该区域,导致在当前滚动区域的顶部

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    相关资源
    最近更新 更多