GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Best Practice zum Ausblenden der virtuellen Konsole beim Rendern von Videos in Framebuffer?

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 benannte KD_GRAPHICS zu setzen Modus. Wenn in KD_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 zwischen KD_TEXT und KD_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ür ioctl() 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 in K_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 die termios 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 in K_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 eines K_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 von K_OFF Modus.
      • Der bessere Weg ist heutzutage, den KDSKBMUTE zu verwenden Flagge. Dadurch wird die gesamte Verarbeitung von Eingabeereignissen ohne deaktiviert K_RAW beeinflussen oder von ihm beeinflusst werden /K_CODE /K_XLATE Modusschalter.
    • 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.
Siehe auch:Linux – Wie erstelle ich eine virtuelle Festplatte mit fester Größe mit qemu-img?

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.

Linux
  1. MOC – Der beste Musikplayer für Ihre Linux-Konsole

  2. Hyper – Die beste Terminal-App für Linux

  3. Virtueller serieller Port für Linux

  4. Best Practice für Zugriffsberechtigungen für Benutzer für Apache Tomcat

  5. Wo ist die Terminalansicht von tty7

Die besten kostenlosen Videokonverter für Linux [GUI, CLI und Online]

Die 30 besten VMware-Tools für moderne Unternehmen

Die 15 besten Linux-Videoplayer im Jahr 2022:Ein Muss für Filmliebhaber

15 beste Videobearbeitungssoftware für Linux-Systeme

Clearing-Terminal

Was ist Best Practice für die Kommunikation zwischen Amazon EC2-Instances?