Terminal Eigenschaften
-
Hallo Forum!
Folgendes Problem:
Ich möchte die Spalten (und Zeilen) des aktuellen Terminals ('echte' Konsole, SuSE 8.0) ermitteln, ohne Curses zu benutzen.Allerdings habe ich noch keine Mehtode herausgefunden, dies zuverlässig zu tun.
1. getenv("COLUMNS")
- klappt wunderbar, solange $COLUMNS auch exportiert wurde
2. terminfo selber auslesen.
- komische sache dieses terminfo-ding: zwar habe ich mittels
"man 5 term" eine Auslesefunktion hinbekommen, jedoch fehlt genau
für das terminal 'linux' der Eintrag für die Spalten?! ... okay nächste
Methodestruct winsize ws;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);- diese Methode habe ich im Quelltext von stty (welches aus irgendwelchen
Gründen ja die richtigen Zeilen und Spalten ausgibt) gefunden. Allerdings
wird die winsize-Struktur bei dem ioctl-Aufruf nicht 'besetzt' (ohne, dass
ein Fehler gemeldet wird).Also, falls mir hier jemand weiterhelfen kann, wäre ich ziemlich dankbar (auch
Links, die das Verständnis dieser Problematik erhellen könnten sind gerne gesehenGruss,
FB
-
Letzte Variante sollte funktionieren, tut sie jedenfalls hier. Versuchs mal mit STDIN_FILENO (0). So hab ich's bisher jedenfalls überall gesehen.
-
Okay, Butter bei die Fisch'
Also an diesem Code ist alles okay (nur um auszuschießen, dass ich einen ganz blöden Fehler gemacht habe)?
#include <stdio.h> #include <sys/ioctl.h> #include <unistd.h> #include <string.h> int get_cols(); int main(int argc, char **argv) { printf("Cols: %d\n", get_cols()); return 0; } int get_cols() { int fd = STDOUT_FILENO; struct winsize ws; memset(&ws, 0, sizeof(ws)); if ( ioctl(fd, TIOCSWINSZ, &ws) == -1 ) { perror("ioctl:"); return 0; } return ws.ws_col; }
Edit: Es ist auch egal, ob der FD stdin, stdout oder ein wahnsinnig umständlich ermittelter FD des Terminals ist ...
-
Nicht, TIOCSWINSZ, sondern TIOCGWINSZ.. Dann funktioniert dein Beispiel hier.
-
Autsch! Der tat weh - jetzt klappt's auch hier
Danke