GNU/Linux >> Belajar Linux >  >> Linux

Mendapatkan lebar terminal di C?

Contoh ini agak panjang, tapi saya percaya ini adalah cara paling portabel untuk mendeteksi dimensi terminal. Ini juga menangani peristiwa pengubahan ukuran.

Seperti yang disarankan oleh tim dan rlbond, saya menggunakan ncurses. Ini menjamin peningkatan besar dalam kompatibilitas terminal dibandingkan dengan membaca variabel lingkungan secara langsung.

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

Sudahkah Anda mempertimbangkan untuk menggunakan getenv() ? Ini memungkinkan Anda untuk mendapatkan variabel lingkungan sistem yang berisi kolom dan baris terminal.

Atau menggunakan metode Anda, jika Anda ingin melihat apa yang dilihat kernel sebagai ukuran terminal (lebih baik jika terminal diubah ukurannya), Anda perlu menggunakan TIOCGWINSZ, bukan TIOCGSIZE Anda, seperti:

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

dan kode lengkapnya:

#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. | Di Perintah Terminal?

  2. 5 penggunaan perintah mv di terminal linux

  3. Terminal Ubuntu

  1. Memulai dengan Zsh

  2. Lakukan petualangan di terminal Linux Anda

  3. Linux API untuk mendaftar proses yang sedang berjalan?

  1. Apa emulator terminal favorit Anda?

  2. Cowsay:Menyenangkan di terminal Linux

  3. Deteksi di C jika mengeluarkan ke terminal