GNU/Linux >> Znalost Linux >  >> Linux

Získání šířky terminálu v C?

Tento příklad je trochu zdlouhavý, ale věřím, že je to nejpřenosnější způsob zjišťování rozměrů terminálu. To také zpracovává události změny velikosti.

Jak navrhují tim a rlbond, používám ncurses. Zaručuje velké zlepšení kompatibility terminálu ve srovnání s přímým čtením proměnných prostředí.

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

Uvažovali jste o použití getenv() ? Umožňuje vám získat systémové proměnné prostředí, které obsahují sloupce a řádky terminálů.

Případně pomocí vaší metody, pokud chcete vidět, jakou velikost terminálu vidí jádro (lépe v případě, že se změní velikost terminálu), budete muset použít TIOCGWINSZ, na rozdíl od vaší TIOCGSIZE, například takto:

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

a celý kód:

#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. 5 použití příkazu mv v linuxovém terminálu

  2. Cowsay:Zábava v linuxovém terminálu

  3. Detekce v C při výstupu na terminál

  1. Jaký je váš oblíbený emulátor terminálu?

  2. Formátování struct timespec

  3. ip příkaz v terminálu Mac OS X

  1. Začínáme se Zsh

  2. Vydejte se na dobrodružství ve svém linuxovém terminálu

  3. | V příkazu terminálu?