Ich rendere derzeit Videos in Linux mit GStreamer direkt in den Framebuffer.
Ich habe mich gefragt, wie ich die virtuelle Konsole beim Rendern ausblenden würde. Ich kann das Blinken des Cursors stoppen, aber das funktioniert nur, wenn sich kein Text auf der Konsole ändert.
X scheint einen neuen Bildschirm zu erstellen, auf den mit Strg(+Alt)+F7 zugegriffen werden kann – ist es möglich, so etwas selbst zu tun? Irgendwie in der Lage sein, mit Strg+Alt+F1 und Strg+Alt+F2 zwischen einer Konsole und dem Rendering-Bildschirm umzuschalten.
Akzeptierte Antwort:
X erstellt keinen neuen Bildschirm.
Um dieselben Anzeige- und Eingabeereignisgeräte zu verwenden, die der eingebaute Terminal-Emulator des Kernels verwendet (um seine virtuellen Terminals darzustellen), muss ein Programm dafür sorgen, dass sie gemeinsam genutzt werden. Der Terminal-Emulator des Kernels stellt eine API bereit, über die ein solches Programm aushandeln kann, wann es für die Eingabe und Ausgabe zuständig ist und wann der eingebaute Terminal-Emulator des Kernels dies hat.
Diese API erfolgt über ioctl()
ruft einen Dateideskriptor auf, der für ein virtuelles Terminalzeichengerät des Kernels offen ist. Es gibt 64 dieser Geräte in Linux, 16 in FreeBSD/PC-BSD. X erstellt diese nicht. Es öffnet ein vorhandenes — per Konvention eines, das kein TUI-Programm gleichzeitig als virtuelles Kernel-Terminal zu verwenden versucht. Mit anderen Worten:Per Konvention läuft keine TUI-Anmeldesitzung auf dem virtuellen Terminalgerät des Kernels, das X öffnet und verwendet.
Ein Programm, das mit dem Kernel-Terminalemulator geteilt wird, muss …
- … weist den Terminal-Emulator des Kernels an, das Schreiben in den Framebuffer zu beenden, um die Ausgabe oder den Cursor anzuzeigen. Dies geschieht mit dem
KDSETMODE
ioctl()
um das heutzutage ziemlich falsch benannteKD_GRAPHICS
zu setzen Modus. Wenn inKD_TEXT
Modus hat der Terminal-Emulator des Kernels heutzutage normalerweise nichts damit zu tun, dass sich die Anzeigehardware in einem tatsächlichen Textmodus befindet. Sogenannte Framebuffer-Konsolen die Anzeigehardware im Grafikmodus haben. Die Unterscheidung zwischenKD_TEXT
undKD_GRAPHICS
Modi ist, dass im ersteren Modus der Terminal-Emulator des Kernels Zeichen-Glyphen auf den Framebuffer zeichnet, wenn die Terminal-Leitungsdisziplin eine Ausgabe an ihn liefert, und auch einen Cursor zeichnet; während im letzteren Modus überhaupt nicht gezeichnet wird. Diese würden heutzutage eigentlich besser als „Grafiken zeichnen“ und „Grafiken nicht zeichnen“-Modi bezeichnet, wenn der falsche nicht „Grafiken“ heißen würde. ☺ - … verhandeln ggf. virtuelles Terminal-Switching. Dies geschieht mit dem
VT_SETMODE
ioctl()
, mit dem das Programm veranlassen kann, Signale zu empfangen, wenn das virtuelle Terminal, das es fürioctl()
verwendet, verwendet wird Anrufe zu oder weg geschaltet wird. - … verhandeln die Behandlung von Eingaben mit dem Terminal-Emulator des Kernels.
- Unter Linux könnte man direkt aus dem Eingabeereignis-Subsystem lesen, in diesem Fall weist das Programm den Terminal-Emulator des Kernels an, das Lesen derselben Eingabeereignisse, von denen es Kopien erhält, zu stoppen, sie nicht mehr in Zeichen zu übersetzen und zu stoppen Senden Sie sie als Eingabe an die Liniendisziplin. Wie das gemacht wird, ist unterschiedlich:
- Der ursprüngliche Weg, dies zu tun, war mit dem
KDSKBMODE
ioctl()
, das virtuelle Terminal inK_RAW
umschalten Modus. In diesem Modus empfängt der Terminal-Emulator des Kernels immer noch Eingabeereignisse vom Eingabeereignis-Subsystem des Kernels, verarbeitet sie jedoch überhaupt nicht und leitet sie als Zeicheneingabe an die Leitungsdisziplin weiter. Dieser Mechanismus (der seine Wurzeln in der Art und Weise hatte, wie X funktionierte, bevor es ein Eingabeereignis-Subsystem gab) war jedoch kaputt, da die Eingabe immer noch an die Liniendisziplin gesendet wurde und immer noch geleert werden musste. Und es erforderte, dass dietermios
Eingangszustand für das Terminal ebenfalls im Raw-Modus sein, da sonst die Raw-Scancodes von der Liniendisziplin als Sonderzeichen wie die STOP- oder INTR-Zeichen fehlinterpretiert würden. - Ein früher als besser angesehener Weg, dies zu tun, war der
KDSKBMODE
ioctl()
, schaltet das virtuelle Terminal inK_OFF
Modus. In diesem Modus würde der Kernel-Terminal-Emulator die Eingabeereignisse nicht nur nicht verarbeiten, sondern sie auch nicht an die Leitungsdisziplin weiterleiten. Dieser Mechanismus war jedoch kaputt, da er Teil einesK_OFF
war /K_RAW
/K_CODE
/K_XLATE
Modusschalter. systemd und andere ähnliche Systeme würden virtuelle Terminalmodi verwalten und am Ende virtuelle Terminals aus schalten vonK_OFF
Modus. - Der bessere Weg ist heutzutage, den
KDSKBMUTE
zu verwenden Flagge. Dadurch wird die gesamte Verarbeitung von Eingabeereignissen ohne deaktiviertK_RAW
beeinflussen oder von ihm beeinflusst werden /K_CODE
/K_XLATE
Modusschalter.
- Der ursprüngliche Weg, dies zu tun, war mit dem
- Auf FreeBSD/PC-BSD gibt es überhaupt kein separates Eingabeereignis-Zeichengerät. Tastatureingaben liest man trotzdem über das virtuelle Terminal des Kernels , während man es vielleicht in Scancode umwandeln möchte (
K_RAW
) oder Schlüsselcode (K_CODE
) Modi, will man nicht abschalten.
- Unter Linux könnte man direkt aus dem Eingabeereignis-Subsystem lesen, in diesem Fall weist das Programm den Terminal-Emulator des Kernels an, das Lesen derselben Eingabeereignisse, von denen es Kopien erhält, zu stoppen, sie nicht mehr in Zeichen zu übersetzen und zu stoppen Senden Sie sie als Eingabe an die Liniendisziplin. Wie das gemacht wird, ist unterschiedlich:
Hier gibt es einige Wechselwirkungen. Ein X-Server beispielsweise schaltet das virtuelle Terminal in den Keycode-Modus, liest die Keycodes und wandelt sie in X-Keysyms um, indem er sie durch die Handhabungsmechanismen der X-Tastatur leitet. Das bedeutet, dass der eingebaute Terminal-Emulator des Kernels niemals die spezielle Verarbeitung für Alt durchführen kann +Fn Tastatursequenzen. Es ist der X-Server, der Ctrl selbst erkennen muss +Alt +Fn .
Weiterführende Literatur
- Arthur Taylor (2013-02-02). systemd sollte KDSKBMODE nicht auf einem VT mit X aufrufen . systemd-devel.
- Adam Jackson (2012-11-16). [PATCH] vt:K_OFF für VC_MUTE weglassen . Linux-Kernel-Mailingliste.
- Adam Jackson (2012-11-16). [PATCH] Linux:Bevorzugen Sie ioctl(KDSKBMUTE, 1) gegenüber ioctl(KDSKBMODE, K_OFF) . xorg-devel.
- Michael K. Johnson (1994-06-01). Hinweise zur Linux-Programmierung . Linux-Journal.