簡體   English   中英

如何使用termcap獲取C程序中的光標位置,而不寫字符?

[英]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 ) 分隔。 有關EOFEOL更多信息,請參閱特殊字符。 這意味着在輸入整行或接收到信號之前, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM