[AdeL schrieb-!CoG?-[Aid[A]]
So, nun habe ich mal ein paar Fragen, die mir sehr auf der Zunge brennen und ich um's Verrecken nicht herausbekommen habe:
Frage 1: Wie kann ich in C++ die Auflösung der Konsole veränder (XTerm)?
Ich möchte eben beim Start des Programms eine bestimmte Auflösung der Konsole haben, damit kein Zeilenumbruch oder ein schwarzer Rand entsteht.
Es stimmt nicht so ganz was hier gesagt wurde. X-Terminals kann man in der Größe ändern. Es kommt aber auf die konkrete Implementierung an, ob dies geht. Bei xterm (also /usr/bin/xterm) geht dies standardmäßig, ebenso urxvt (rxvt-unicode). Bei der KDE3-Konsole kann man es konfigurieren, bei der KDE4-Konsole habe ich diese Option nicht gefunden und beim gnome-terminal und allen Derivaten die das Terminalwidget VTE verwenden scheint es nicht implementiert zu sein. Es gibt hierzu das Programm xtermset (im AUR), oder einfach über die Escape-Sequenz '\e[8;%s;%st', also um beispielsweise das aktuelle Terminal auf 80x25 zu bringen geht
echo -ne '\e[8;25;80t'
Für eigene Programme kann man das natürlich machen, allerdings glaube ich nicht dass die Benutzer glücklich sind. Für eigene Programme kannst du auch gleich das Terminal auf 80x25 starten (xterm -geometry 80x25 -T Meinprogramm -e /usr/bin/meinprogramm).
Also in C++ wäre das dann
#include <iostream>
// ...
int x, y;
std::cout << "\033[8;" << y ";" << x << "t" << std::flush;
Frage 2: Wie kann in in C++ die Schrift formatieren?
Siehe Erklärung zu Frage 1.
Nen anderen Font kannst du eigentlich gar nicht nehmen (bei urxvt gibt es eine Escape-Sequenz die den Font den ganzen Terminals umstellt), wohl aber Farben und Attribute (fett, unterstrichen, blinkend). Auch dafür gibt es Escape-Sequenzen. Du findest im Internet zig seiten, einfach nach "escape sequenz ANSI VT100" suchen, z.B.
http://www.imb-jena.de/~gmueller/kurse/pascal/escape.html
Auch gibt es Escape-Sequenzen um den Cursor (und damit die aktuelle Position) zu setzen, bestimmte Bereiche zu löschen, usw. Und spätestens hier wirst du merken, dass du schnell an einen Punkt kommst, wo das Ganze nicht mit allen Terminals funktioniert.
Der kleinste gemeinsame Nenner der Linux-Terminals dürfte VT100 sein. Alle Implementierungen (wie gesagt, xterm, rxvt, urxvt, Linux-Konsole, KDE-Konsole, gnome-terminal, ...) sind dazu mehr oder weniger kompatibel. Der Teufel steckt aber so oft im Detail, und außerdem gibt es ja noch viel mehr Terminals auf der Welt.
Deshalb kam man irgendwann auf die Idee diese ganzen Sequenzen in einer Datenbank zu speichern und den Programmen zur Verfügung zu stellen. Das ganze nannte sich dann termcap, siehe termcap(3). Irgendwann hat man gemerkt dass termcap zu limitiert ist und terminfo wurde geboren, siehe terminfo(5).
Nun ist es aber immer noch sehr müselig für die Programme, die Escapesequenzen aus termcap bzw. Terminfo rauszusuchen und entsprechend zu verwenden. Aus diesem Umstand entstand (n)curses: Du betrachtest das Terminal als Zeichenfläche und setzt einfach deinen Text rein. Die nötige Aktualisierung übernimmt ncurses dann selber und relativ intelligent. Siehe ncurses(3).
Wenn du jetzt noch ne Ebene höher willst gibt es CDK (Curses Development Kit) wo du dann schon sowas wie Buttons, Textfelder etc. hast, also wie bei grafischer Programmierung mit Qt oder Gtk. Als (IMO bessere) Alternative dazu gibt es newt. Letzteres wurde im Wesentlichen von Red Hat für ihren Installer entwickelt. Da Red Hat viel mit Python macht gibt es auch entsprechende Python-Bindings.
Was du jetzt brauchst hängt ganz von deinen Anforderungen ab. Um nur mal einen Text rot zu machen reichen eigentlich ANSI-Sequenzen. Sie werden von so vielen Terminals verstanden, soweit ich weiß sind die sogar unter Windows gleich dass es nicht nötig ist, dafür terminfo oder termcap zu verwenden.
Willst du aber wirklich mit dem Cursor rumspringen und auch Input lesen wirst du um ncurses oder eben CDK/newt (die auch ncurses untendrunter verwenden) nicht herumkommen wenn du es komfortabel und gleichzeitig portabel machen willst.
Ich hoffe dass diese Antwort etwas mehr Licht ins Dunkel der "Terminalprogrammierung" bringt.
Gruß,
Bernhard