私のコンソールベースのLinux C++アプリケーションでは、端末のサイズ(行+列)と現在のカーソル位置を取得したいと思います。後者の場合、ANSIコードを使用することができますが、正しく解析する方法がわかりません。また、私はウィンドウのサイズを取得する方法が表示されません?Linux端末でのカーソル位置と端末サイズの取得
他の理由から、現在、ncursesに切り替えることはできません。
私のコンソールベースのLinux C++アプリケーションでは、端末のサイズ(行+列)と現在のカーソル位置を取得したいと思います。後者の場合、ANSIコードを使用することができますが、正しく解析する方法がわかりません。また、私はウィンドウのサイズを取得する方法が表示されません?Linux端末でのカーソル位置と端末サイズの取得
他の理由から、現在、ncursesに切り替えることはできません。
サイズを取得する古い方法は、libtermcapでtermcapでした。新しいものはterminfo(+ lib)です。 これを抽象化したライブラリ(および他のすべての端末関連のもの)を使い、(n)cursesのような端末出力ライブラリを使用することをお勧めします。
これは他のUnixシステムでも動作します。
サイズを取得するには、TIOCGWINSZ
ioctl()
を呼び出してください。私のコードの例:
struct winsize ws = { 0, 0, 0, 0 };
if(ioctl(tt->outfd, TIOCGWINSZ, &ws) == -1)
return;
/* ws.ws_row and ws.ws_col now give the size */
あなたが最初にそれをやってみたいし、再度ウィンドウの変更の通知SIGWINCH
信号の受信後になります。
カーソル位置を取得するのは少し難しいです。一部の端末ではDSRからの回答がここに私の(1ベース)第62行、1列目に言って、CSI Rに来るDSR 6(デバイスのステータスレポート)
$ echo -ne "\e[6n"; cat -v
^[[62;1R
ことによってそれを照会できます。
しかし、すべての端末がDSR 6をサポートしているわけではないので、カーソル位置を照会することに頼るのではなく、最初の端末アドレス指定を絶対的な方法で実行し、 。
tt-> outfdとは何ですか?それはエラーがあります。 – user2029077
端末に書き込むためのファイル記述子。可能性が高いSTDOUT – LeoNerd
このソリューションを見ましたか? http://stackoverflow.com/a/1022961/522150これとhttp://stackoverflow.com/a/1023006/522150。彼らは端末の行と列の問題をうまく解決します。 – nemesisfixx