Je rends actuellement la vidéo sous Linux directement dans le framebuffer à l'aide de GStreamer.
Je me demandais comment j'allais cacher la console virtuelle pendant le rendu. Je peux empêcher le curseur de clignoter, mais cela ne fonctionne que lorsqu'aucun texte ne change sur la console.
X semble créer un nouvel écran accessible avec Ctrl (+ Alt) + F7 - est-il possible de faire quelque chose comme ça moi-même ? D'une manière ou d'une autre, être capable de basculer entre une console et l'écran de rendu avec Ctrl+Alt+F1 et Ctrl+Alt+F2.
Réponse acceptée :
X ne crée pas de nouvel écran.
Pour utiliser les mêmes périphériques d'affichage et d'entrée d'événements que l'émulateur de terminal intégré du noyau (pour présenter ses terminaux virtuels), un programme doit s'arranger pour les partager. L'émulateur de terminal du noyau fournit une API à travers laquelle un tel programme peut négocier quand il a la responsabilité de l'entrée et de la sortie, et quand l'émulateur de terminal intégré du noyau l'a fait.
Cette API passe par ioctl()
appelle un descripteur de fichier qui est ouvert sur un périphérique caractère de terminal virtuel du noyau. Il y a 64 de ces périphériques sous Linux, 16 sous FreeBSD/PC-BSD. X ne les crée pas. Il en ouvre un existant - par convention, un qu'aucun programme TUI n'essaie simultanément d'utiliser comme terminal virtuel du noyau. En d'autres termes :par convention, aucune session de connexion TUI n'est exécutée sur le terminal virtuel du noyau que X ouvre et utilise.
Un programme qui partage avec l'émulateur de terminal du noyau doit …
- … indique à l'émulateur de terminal du noyau d'arrêter d'écrire dans le framebuffer pour afficher la sortie ou le curseur. Ceci est fait avec le
KDSETMODE
ioctl()
pour définir leKD_GRAPHICS
aujourd'hui assez mal nommé mode. Quand enKD_TEXT
De nos jours, l'émulateur de terminal du noyau n'a généralement rien à voir avec le fait que le matériel d'affichage soit en mode texte réel. Les soi-disant consoles de framebuffer avoir le matériel d'affichage en mode graphique. La distinction entreKD_TEXT
etKD_GRAPHICS
modes est que dans le premier mode, l'émulateur de terminal du noyau dessinera des glyphes de caractères sur le framebuffer lorsque la discipline de ligne terminale lui fournira une sortie, et dessinera également un curseur; alors que dans ce dernier mode, il ne fera aucun dessin du tout. Ceux-ci seraient en fait mieux considérés comme des modes "dessiner des graphiques" et "ne pas dessiner de graphiques" de nos jours, si le mauvais n'était pas nommé "graphiques". ☺ - … négocier le changement de terminal virtuel, le cas échéant. Cela se fait avec le
VT_SETMODE
ioctl()
, avec lequel le programme peut s'arranger pour recevoir des signaux lorsque le terminal virtuel qu'il utilise pour leioctl()
les appels sont basculés vers ou depuis. - … négocier la gestion des entrées avec l'émulateur de terminal du noyau.
- Sous Linux, on peut lire directement à partir du sous-système d'événements d'entrée, auquel cas le programme dit à l'émulateur de terminal du noyau d'arrêter de lire ces mêmes événements d'entrée, dont il reçoit des copies, d'arrêter de les traduire en caractères et d'arrêter les envoyer à la discipline de ligne comme entrée. La façon dont cela est fait varie :
- La façon originale de faire cela était avec le
KDSKBMODE
ioctl()
, basculer le terminal virtuel enK_RAW
mode. Dans ce mode, l'émulateur de terminal du noyau reçoit toujours les événements d'entrée du sous-système d'événements d'entrée du noyau, mais il n'effectue aucun traitement de ceux-ci, les transmettant à la discipline de ligne en tant qu'entrée de caractères. Cependant, ce mécanisme (qui avait ses racines dans la façon dont X fonctionnait avant qu'il y ait un sous-système d'événement d'entrée) était cassé, dans la mesure où cette entrée était toujours envoyée à la discipline de ligne et devait encore être drainée. Et il fallait que lestermios
l'état d'entrée du terminal soit également en mode brut, sinon les scancodes bruts seraient interprétés à tort comme des caractères spéciaux tels que les caractères STOP ou INTR par la discipline de ligne. - Une façon, autrefois considérée comme meilleure, de le faire était avec le
KDSKBMODE
ioctl()
, basculer le terminal virtuel enK_OFF
mode. Dans ce mode, non seulement l'émulateur de terminal du noyau ne traiterait pas les événements d'entrée, mais il ne les enverrait pas à la discipline de ligne. Cependant, ce mécanisme était cassé, car il faisait partie d'unK_OFF
/K_RAW
/K_CODE
/K_XLATE
changement de mode. systemd et d'autres systèmes similaires géreraient les modes de terminaux virtuels et finiraient par basculer les terminaux virtuels hors deK_OFF
mode. - La meilleure façon de nos jours est d'utiliser le
KDSKBMUTE
drapeau. Cela désactive tous les traitements d'événements d'entrée sans affectant ou étant affecté par leK_RAW
/K_CODE
/K_XLATE
commutateur de mode.
- La façon originale de faire cela était avec le
- Sur FreeBSD/PC-BSD, il n'y a pas de périphérique de caractère d'événement d'entrée séparé en premier lieu. On lit les entrées au clavier via le terminal virtuel du noyau de toute façon , donc bien que l'on veuille le changer en scancode (
K_RAW
) ou code clé (K_CODE
) modes, on ne veut pas le désactiver.
- Sous Linux, on peut lire directement à partir du sous-système d'événements d'entrée, auquel cas le programme dit à l'émulateur de terminal du noyau d'arrêter de lire ces mêmes événements d'entrée, dont il reçoit des copies, d'arrêter de les traduire en caractères et d'arrêter les envoyer à la discipline de ligne comme entrée. La façon dont cela est fait varie :
Il y a des interactions, ici. Un serveur X, par exemple, bascule le terminal virtuel en mode keycode, lit les keycodes et les transforme en X keysyms, en les faisant passer par les mécanismes de gestion du clavier X. Cela signifie que l'émulateur de terminal intégré au noyau ne peut jamais effectuer le traitement spécial pour Alt +Fn séquences de clavier. C'est le serveur X qui doit lui-même reconnaître Ctrl +Alt +Fn .
Autres lectures
- Arthur Taylor (2013-02-02). systemd ne doit pas appeler KDSKBMODE sur un VT avec X . systemd-devel.
- Adam Jackson (2012-11-16). [PATCH] vt :supprimez K_OFF pour VC_MUTE . Liste de diffusion du noyau Linux.
- Adam Jackson (2012-11-16). [PATCH] Linux :Préférer ioctl(KDSKBMUTE, 1) à ioctl(KDSKBMODE, K_OFF) . xorg-devel.
- Michael K. Johnson (1994-06-01). Conseils de programmation Linux . Journal Linux.