GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Terminalbreite in C abrufen?

Dieses Beispiel ist etwas langatmig, aber ich glaube, es ist die portabelste Art, die Terminalabmessungen zu erkennen. Dies behandelt auch Größenänderungsereignisse.

Wie tim und rlbond andeuten, verwende ich ncurses. Es garantiert eine große Verbesserung der Terminalkompatibilität im Vergleich zum direkten Lesen von Umgebungsvariablen.

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

Haben Sie darüber nachgedacht, getenv() zu verwenden? Es ermöglicht Ihnen, die Umgebungsvariablen des Systems zu erhalten, die die Spalten und Zeilen der Terminals enthalten.

Wenn Sie alternativ mit Ihrer Methode sehen möchten, was der Kernel als Terminalgröße sieht (besser, falls die Größe des Terminals geändert wird), müssen Sie TIOCGWINSZ verwenden, im Gegensatz zu Ihrer TIOCGSIZE, wie folgt:

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

und der vollständige Code:

#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. Was ist Ihr Lieblings-Terminal-Emulator?

  2. | Im Terminalkommando?

  3. 5 Verwendungen des mv-Befehls im Linux-Terminal

  4. In C erkennen, wenn an ein Terminal ausgegeben wird

  5. ip-Befehl im Mac OS X-Terminal

Mein funktionsreiches und minimales Linux-Terminal

Erste Schritte mit GnuCash

Warum ich rxvt als Terminal verwende

So verwenden Sie Instagram im Terminal

Terminal-Pager

Clearing-Terminal