GNU/Linux >> Tutoriales Linux >  >> Linux

Obteniendo ancho de terminal en C?

Este ejemplo es un poco largo, pero creo que es la forma más portátil de detectar las dimensiones del terminal. Esto también maneja eventos de cambio de tamaño.

Como sugieren tim y rlbond, estoy usando ncurses. Garantiza una gran mejora en la compatibilidad de terminales en comparación con la lectura directa de variables de entorno.

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

¿Has considerado usar getenv() ? Le permite obtener las variables de entorno del sistema que contienen las columnas y líneas de los terminales.

Alternativamente, usando su método, si desea ver lo que el kernel ve como el tamaño de la terminal (mejor en caso de que se cambie el tamaño de la terminal), necesitará usar TIOCGWINSZ, en lugar de su TIOCGSIZE, así:

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

y el código completo:

#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. Comenzando con Zsh

  2. Embárcate en una aventura en tu terminal Linux

  3. Cowsay:diversión en la terminal de Linux

  4. Detectar en C si se envía a una terminal

  5. Ocultar entrada de contraseña en la terminal

Mi terminal Linux mínimo y rico en funciones

Primeros pasos con GnuCash

Por qué uso rxvt como mi terminal

Cómo usar Instagram en la terminal

Localizadores de terminales

Terminal de compensación