GNU/Linux >> Tutoriels Linux >  >> Linux

Obtenir la largeur du terminal en C?

Cet exemple est un peu long, mais je pense que c'est le moyen le plus portable de détecter les dimensions du terminal. Cela gère également les événements de redimensionnement.

Comme le suggèrent tim et rlbond, j'utilise ncurses. Il garantit une grande amélioration de la compatibilité du terminal par rapport à la lecture directe des variables d'environnement.

#include <ncurses.h>
#include <string.h>
#include <signal.h>

// SIGWINCH is called when the window is resized.
void handle_winch(int sig){
  signal(SIGWINCH, SIG_IGN);

  // Reinitialize the window to update data structures.
  endwin();
  initscr();
  refresh();
  clear();

  char tmp[128];
  sprintf(tmp, "%dx%d", COLS, LINES);

  // Approximate the center
  int x = COLS / 2 - strlen(tmp) / 2;
  int y = LINES / 2 - 1;

  mvaddstr(y, x, tmp);
  refresh();

  signal(SIGWINCH, handle_winch);
}

int main(int argc, char *argv[]){
  initscr();
  // COLS/LINES are now set

  signal(SIGWINCH, handle_winch);

  while(getch() != 27){
    /* Nada */
  }

  endwin();

  return(0);
}

Avez-vous pensé à utiliser getenv() ? Il vous permet d'obtenir les variables d'environnement du système qui contiennent les colonnes et les lignes des terminaux.

Alternativement, en utilisant votre méthode, si vous voulez voir ce que le noyau voit comme la taille du terminal (mieux si le terminal est redimensionné), vous devrez utiliser TIOCGWINSZ, par opposition à votre TIOCGSIZE, comme ceci :

struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

et le code complet :

#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>

int main (int argc, char **argv)
{
    struct winsize w;
    ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);

    printf ("lines %d\n", w.ws_row);
    printf ("columns %d\n", w.ws_col);
    return 0;  // make sure your main returns int
}

Linux
  1. Premiers pas avec Zsh

  2. Partez à l'aventure dans votre terminal Linux

  3. | Dans Terminal Command ?

  4. 5 utilisations de la commande mv dans le terminal Linux

  5. Cowsay :amusant dans le terminal Linux

Mon terminal Linux riche en fonctionnalités et minimal

Démarrer avec GnuCash

Pourquoi j'utilise rxvt comme terminal

Comment utiliser Instagram dans le terminal

Téléavertisseurs de terminaux

Borne de dédouanement