【问题标题】:Is it possible to save several cursor positions using termcaps, to be able to restore them later?是否可以使用 termcaps 保存多个光标位置,以便以后恢复它们?
【发布时间】:2017-05-13 03:14:13
【问题描述】:

我想知道是否可以使用 termcaps 保存多个光标位置,以便以后能够恢复它们?

例如:

char *c_pos_1 = tgetstr("sc", NULL); //save cursor position at position 1

后面的代码

char *c_pos_2 = tgetstr("sc", NULL);

后面的代码

char *c_pos_3 = tgetstr("sc", NULL);

后面的代码

tputs(c_pos_2, 1, my_out); // restoring cursor at c_pos_2

以及后面的代码

tputs(c_pos_1, 1, my_out); //restoring cursor at c_pos_1

如果不可能怎么办?

感谢您的帮助:)

【问题讨论】:

  • 为什么不使用像 ncurses 这样更舒服的东西?
  • 这是一个学校项目,我们只能使用termcaps
  • ncurses 使用 termcap
  • 是的,但我只能使用函数 tgoto、tgetstr、tgetnum、tgetflag 和 tputs。不幸的是没有别的。

标签: c termcap


【解决方案1】:

您似乎对至少两件事感到困惑:c_pos_1 的内容,以及谁负责存储光标位置。

char *c_pos_1 = tgetstr("sc", NULL);

c_pos_1 中的内容无论如何都不是光标位置的表示。如果终端支持保存光标位置,那么c_pos_1 指向一个字符串,你可以发送给终端要求终端保存光标位置。换句话说,你的代码

tputs(c_pos_1, 1, my_out); // restoring cursor at c_pos_2

实际上具有保存,而不是恢复光标位置的效果。

光标位置保存在终端中(实际上,它保存在运行终端模拟器的进程中,可能是xtermitermTerminal.appCMD.EXE 或其他),并且不会保存在您的进程中.

如果您的终端支持sc 字符串,那么它也支持rc 字符串,您可以发送它来恢复之前保存的光标位置。同样,rc 字符串不包含光标位置。它是一个字符串,用于命令您的终端(或终端仿真器)恢复终端先前保存的光标位置(当您向其发送 sc 字符串时)。

要保存多个光标位置,您的终端必须支持多个不同的“保存光标”和“恢复光标”命令字符串,但 termcap 没有存储多个不同的“保存光标”和“恢复光标”命令字符串.或者您的终端必须将保存的位置视为堆栈,每次收到sc 命令时将光标位置推入堆栈,并在每次收到rc 命令时弹出它。我怀疑任何现代的通用终端模拟器都能做到这一点。

“保存”和“恢复”光标位置的常规方法是在您的程序中跟踪光标所在的位置,方法是仔细跟踪您输出的所有内容(在光标上)的影响,而不是依赖在终端上能够保存和恢复光标位置。这就是像 ncurses 这样的库所做的。

【讨论】:

  • 非常感谢您的完整回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2017-12-10
  • 2019-08-17
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多