FreeBSD 13.0-RELEASE から入った新規の tcgetwinsize でウィンドウの大きさを取得する2021年03月19日 11時53分29秒

FreeBSD 13.0-RELEASE から tcgetwinsize と tcsetwinsize が入った。これらの関数は新しい terminos の標準関数の様だ。

以前からウィンドウの大崎が変更された時に、SIGWINCH シグナルが渡されていた。この関数が出来る以前は sysctl でウィンドウの大きさを取得する必要があった。

#include <signal.h> // signal
#include <termios.h> // tcgetwinsize
#include <unistd.h> // write
#include <stdio.h> // sprintf, gets_s
#include <string.h> // strlen

void size( int signo )
{   
    char buf[ 1024 ];
    struct winsize wsize;

    tcgetwinsize( STDERR_FILENO, &wsize );
    sprintf(buf, "row=%d, col=%d\n", wsize.ws_row, wsize.ws_col );
    write( STDOUT_FILENO, buf, strlen( buf ) );
}

int main()
{   
    char c;
    signal( SIGWINCH, size );
    gets_s( &c, 1 );
}
プログラムをコンパイル、実行してから xterm の大きさを変えて出てきた出力。
% cc tcgetwinsize.c
% ./a.out
row=25, col=88
row=25, col=87
row=25, col=86
row=25, col=85
row=25, col=84
row=26, col=83
row=26, col=82
row=26, col=81

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/03/19/9358501/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。