[英]How to get the cursor position in a C program using termcap, without writing a character?
我想知道如何在我的程序中獲取光標位置 (x, y),而不在屏幕上寫任何東西,也不會一直跟蹤它。
我找到了一種使用此函數獲取其位置的方法(我在這里不檢查讀取、寫入等的返回來編寫有關此主題的較小代碼,但我在我的程序中執行此操作):
void get_cursor_position(int *col, int *rows)
{
int a = 0;
int i = 0;
char buf[4];
write(1, "\033[6n", 4); // string asking for the cursor position
read(1, buf, 4);
while (buf[i])
{
if (buf[i] >= 48 && buf[i] <= 57)
{
if (a == 0)
*rows = atoi(&buf[i]) - 1;
else
*col = atoi(&buf[i]) - 1;
a++;
}
i++;
}
}
這個函數給了我准確的光標位置(*rows = y,*col = x),但它寫在屏幕上。
如何在不在屏幕上寫任何東西的情況下獲得光標位置?
(如果光標位於打印的字符之一上,它將覆蓋它。)
應該在發送轉義序列之前和之后切換回聲嗎?
這是一個學校項目,所以我只能使用termcap,我不能使用ncurses函數,唯一允許的函數是tputs、tgoto、tgetstr、tgetnum、tgetflag。
有幾個問題:
規范模式被緩沖(見下文)
read
是在標准輸出的文件描述符上完成的(這可能會起作用——有時——但不要指望它)
read
未讀取足夠的字符以獲得典型響應
響應將有兩個十進制整數,用分號分隔;
響應將有一個最終字符(如果read
實際上要求足夠的字符,這將成為一個問題......)
進一步閱讀:
在規范模式輸入處理中,終端輸入以行為單位進行處理。 一行由換行符 (
NL
)、文件結束符 (EOF
) 或行結束符 (EOL
) 分隔。 有關EOF
和EOL
更多信息,請參閱特殊字符。 這意味着在輸入整行或接收到信號之前,read
請求不會返回。 此外,無論在 read() 調用中請求多少字節,最多返回一行。 然而,沒有必要一次閱讀整行; 可以在 read() 中請求任意數量的字節,甚至是一個字節,而不會丟失信息。
CSI Ps n Device Status Report (DSR). Ps = 5 -> Status Report. Result ("OK") is CSI 0 n Ps = 6 -> Report Cursor Position (CPR) [row;column]. Result is CSI r ; c R
也就是說,您的程序應該准備好讀取Escape [
后跟兩個十進制整數(其長度沒有固定限制)和另外兩個字符;
和R
。
順便說一下, termcap本身對您的解決方案幾乎沒有作用。 雖然 ncurses 在終端數據庫中定義了一些相關功能:
# u9 terminal enquire string (equiv. to ANSI/ECMA-48 DA)
# u8 terminal answerback description
# u7 cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6)
# u6 cursor position report (equiv. to ANSI/ECMA-48 CPR)
很少有程序使用它們,無論如何您會發現在 termcap 應用程序中使用光標位置報告是很困難的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.