我想知道是否可以使用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
如果不可能怎么办?
感谢您的帮助:)
答案 0 :(得分:2)
您似乎对至少两件事感到困惑: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
实际上具有保存的效果,而不是恢复光标位置。
光标位置保存在终端中(实际上,它存储在运行终端仿真器的过程中,可能是xterm
或iterm
或Terminal.app
或CMD.EXE
或其他)并且不会保存在您的过程中。
如果您的终端支持sc
字符串,那么它还支持rc
字符串,您可以将其发送以恢复以前保存的光标位置。同样,rc
字符串不包含光标位置。它是一个字符串,命令终端(或终端仿真器)恢复终端先前保存的光标位置(当您发送sc
字符串时)。
要保存多个光标位置,终端必须支持多个不同的“保存光标”和“恢复光标”命令字符串,但是termcap没有存储多个不同的“保存光标”和“恢复光标”命令字符串。或者您的终端必须将保存的位置视为堆栈,每次收到sc
命令时将光标位置推入堆栈,并在每次收到rc
命令时将其弹出。我怀疑任何现代的,通用的终端模拟器都能做到这一点。
“保存”和“恢复”光标位置的常规方法是在程序中跟踪光标所在的位置,仔细跟踪输出内容的效果(在光标上),而不是依赖在终端上能够保存和恢复光标位置。这就像ncurses这样的库。