5

画面に何も書き込まず、常に追跡せずに、プログラムでカーソル位置 (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) を提供しますが、画面に書き込みます。

画面に何も書かずにカーソル位置を取得するにはどうすればよいですか?
(カーソルが印刷された文字の 1 つにある場合、それは上書きされます。)
エスケープ シーケンスの送信前と送信後にエコーを切り替える必要がありますか?

これは学校のプロジェクトなので、termcap しか使えません。ncurses 関数は使えません。使用できる関数は、tputs、tgoto、tgetstr、tgetnum、tgetflag だけです。

4

1 に答える 1