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
}