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
KDSETMODEioctl()um das heutzutage ziemlich falsch benannteKD_GRAPHICSzu setzen Modus. Wenn inKD_TEXTModus 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_TEXTundKD_GRAPHICSModi 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_SETMODEioctl(), 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
KDSKBMODEioctl(), das virtuelle Terminal inK_RAWumschalten 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 dietermiosEingangszustand 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
KDSKBMODEioctl(), schaltet das virtuelle Terminal inK_OFFModus. 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_OFFwar /K_RAW/K_CODE/K_XLATEModusschalter. systemd und andere ähnliche Systeme würden virtuelle Terminalmodi verwalten und am Ende virtuelle Terminals aus schalten vonK_OFFModus. - Der bessere Weg ist heutzutage, den
KDSKBMUTEzu verwenden Flagge. Dadurch wird die gesamte Verarbeitung von Eingabeereignissen ohne deaktiviertK_RAWbeeinflussen oder von ihm beeinflusst werden /K_CODE/K_XLATEModusschalter.
- 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.