🖥️
ターミナルの幅と高さに関するメモ書き
ターミナルの幅と高さを得る
ioctl(2) に TIOCGWINSZ
を渡してウィンドウサイズを得ることができる。
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(void)
{
struct winsize ws;
if (~ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)) {
printf("(%d, %d)\n", ws.ws_col, ws.ws_row); // (幅, 高さ)
}
else {
perror("ioctl");
}
return 0;
}
端末の幅と高さが変わったことを知る
シグナル SIGWINCH
を拾えばよい。
(signal(2) の使用は非推奨っぽいね)
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
static void winch_handler(int);
int main(int argc, char *argv[])
{
struct winsize ws;
struct sigaction act;
winch_handler(0); // 初回表示
act.sa_handler = winch_handler;
sigemptyset(&act.sa_mask);
act.sa_flags= SA_RESTART;
if (sigaction(SIGWINCH, &act, NULL) < 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
while (1) {
sleep(1);
}
return 0;
}
void winch_handler(int sig)
{
struct winsize ws;
if (~ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)) {
printf("(%d, %d)\n", ws.ws_col, ws.ws_row); // (幅, 高さ)
}
else {
perror("ioctl");
}
}
参考
- Man page of TTY_IOCTL
- ターミナルの幅をC言語で取得 - Qiita
Discussion