🖥️

ターミナルの幅と高さに関するメモ書き

2020/10/10に公開

ターミナルの幅と高さを得る

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");
  }
}

動作イメージ


参考

Discussion