2012-03-21 14 views
4

私のコンソールベースのLinux C++アプリケーションでは、端末のサイズ(行+列)と現在のカーソル位置を取得したいと思います。後者の場合、ANSIコードを使用することができますが、正しく解析する方法がわかりません。また、私はウィンドウのサイズを取得する方法が表示されません?Linux端末でのカーソル位置と端末サイズの取得

他の理由から、現在、ncursesに切り替えることはできません。

+0

このソリューションを見ましたか? http://stackoverflow.com/a/1022961/522150これとhttp://stackoverflow.com/a/1023006/522150。彼らは端末の行と列の問題をうまく解決します。 – nemesisfixx

答えて

2

サイズを取得する古い方法は、libtermcapでtermcapでした。新しいものはterminfo(+ lib)です。 これを抽象化したライブラリ(および他のすべての端末関連のもの)を使い、(n)cursesのような端末出力ライブラリを使用することをお勧めします。

これは他のUnixシステムでも動作します。

1

サイズを取得するには、TIOCGWINSZioctl()を呼び出してください。私のコードの例:

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をサポートしているわけではないので、カーソル位置を照会することに頼るのではなく、最初の端末アドレス指定を絶対的な方法で実行し、 。

+0

tt-> outfdとは何ですか?それはエラーがあります。 – user2029077

+0

端末に書き込むためのファイル記述子。可能性が高いSTDOUT – LeoNerd

関連する問題