Actualmente estoy renderizando video en Linux directamente al búfer de cuadros usando GStreamer.
Me preguntaba cómo haría para ocultar la consola virtual durante el renderizado. Puedo evitar que el cursor parpadee, pero eso solo funciona cuando no cambia el texto en la consola.
X parece crear una nueva pantalla a la que se puede acceder con Ctrl (+ Alt) + F7. ¿Es posible hacer algo así yo mismo? De alguna manera poder cambiar entre una consola y la pantalla de renderizado con Ctrl+Alt+F1 y Ctrl+Alt+F2.
Respuesta aceptada:
X no crea una nueva pantalla.
Para utilizar los mismos dispositivos de visualización y eventos de entrada que utiliza el emulador de terminal incorporado del núcleo (para presentar sus terminales virtuales), un programa debe hacer arreglos para compartirlos. El emulador de terminal del kernel proporciona una API a través de la cual un programa de este tipo puede negociar cuándo tiene la responsabilidad de la entrada y la salida, y cuándo la tiene el emulador de terminal integrado del kernel.
Esta API es a través de ioctl()
llama a un descriptor de archivo que está abierto a un dispositivo de caracteres de terminal virtual del kernel. Hay 64 de estos dispositivos en Linux, 16 en FreeBSD/PC-BSD. X no crea estos. Abre uno existente, por convención, uno que ningún programa TUI intenta usar simultáneamente como terminal virtual del núcleo. En otras palabras:por convención, no se ejecuta ninguna sesión de inicio de sesión de TUI en el dispositivo de terminal virtual del kernel que X abre y usa.
Un programa que comparte con el emulador de terminal del kernel debe...
- ... dígale al emulador de terminal del kernel que deje de escribir en el framebuffer para mostrar la salida o el cursor. Esto se hace con el
KDSETMODE
ioctl()
para configurar el hoy en día bastante mal llamadoKD_GRAPHICS
modo. Cuando enKD_TEXT
En la actualidad, el emulador de terminal del kernel generalmente no tiene nada que ver con que el hardware de visualización esté en un modo de texto real. Las llamadas consolas de framebuffer tener el hardware de visualización en modo gráfico. La distinción entreKD_TEXT
yKD_GRAPHICS
modos es que, en el modo anterior, el emulador de terminal del kernel dibujará glifos de caracteres en el búfer de fotogramas a medida que la disciplina de línea de terminal le entrega la salida, y también dibujará un cursor; mientras que en el último modo no hará ningún dibujo en absoluto. En realidad, hoy en día sería mejor considerarlos como modos de "dibujar gráficos" y "no dibujar gráficos", si el incorrecto no se llamara "gráficos". ☺ - ... negociar el cambio de terminal virtual, si corresponde. Esto se hace con el
VT_SETMODE
ioctl()
, con el que el programa puede organizarse para recibir señales cuando el terminal virtual que está utilizando para elioctl()
las llamadas se activan o desactivan. - ... negocie el manejo de la entrada con el emulador de terminal del kernel.
- En Linux, uno podría estar leyendo desde el subsistema de eventos de entrada directamente, en cuyo caso el programa le dice al emulador de terminal del kernel que deje de leer esos mismos eventos de entrada, de los que recibe copias, que deje de traducirlos a caracteres y que deje de leer. enviándolos a la disciplina de línea como entrada. Cómo se hace esto varía:
- La forma original de hacer esto era con el
KDSKBMODE
ioctl()
, cambiando la terminal virtual aK_RAW
modo. En este modo, el emulador de terminal del kernel aún recibe eventos de entrada del subsistema de eventos de entrada del kernel, pero no los procesa en absoluto, pasándolos a la disciplina de línea como entrada de caracteres. Sin embargo, este mecanismo (que tenía sus raíces en la forma en que X funcionaba antes de que hubiera un subsistema de eventos de entrada) estaba roto, ya que la entrada todavía se enviaba a la disciplina de línea y aún tenía que drenarse. Y requería que lostermios
el estado de entrada para el terminal también debe estar en modo sin procesar, de lo contrario, los códigos de escaneo sin procesar se malinterpretarían como caracteres especiales como los caracteres STOP o INTR por la disciplina de línea. - Una forma, una vez considerada mejor, de hacer esto fue con el
KDSKBMODE
ioctl()
, cambiando la terminal virtual aK_OFF
modo. En este modo, el emulador de terminal del kernel no solo no procesaría los eventos de entrada, sino que no los enviaría a la disciplina de línea. Sin embargo, este mecanismo estaba roto, porque era parte de unK_OFF
/K_RAW
/K_CODE
/K_XLATE
Cambio de modo. systemd y otros sistemas similares administrarían los modos de terminales virtuales y terminarían cambiando los terminales virtuales fuera deK_OFF
modo. - Hoy en día, la mejor manera es usar el
KDSKBMUTE
bandera. Esto desactiva todo el procesamiento de eventos de entrada sin afectando o siendo afectados por elK_RAW
/K_CODE
/K_XLATE
interruptor de modo.
- La forma original de hacer esto era con el
- En FreeBSD/PC-BSD, no hay un dispositivo de caracteres de evento de entrada separado en primer lugar. Uno lee la entrada del teclado a través de la terminal virtual del núcleo de todos modos , por lo que, si bien es posible que desee cambiarlo a scancode (
K_RAW
) o código clave (K_CODE
), uno no quiere apagarlo.
- En Linux, uno podría estar leyendo desde el subsistema de eventos de entrada directamente, en cuyo caso el programa le dice al emulador de terminal del kernel que deje de leer esos mismos eventos de entrada, de los que recibe copias, que deje de traducirlos a caracteres y que deje de leer. enviándolos a la disciplina de línea como entrada. Cómo se hace esto varía:
Hay algunas interacciones, aquí. Un servidor X, por ejemplo, cambia el terminal virtual al modo de código de clave, lee los códigos de clave y los convierte en X keysyms, pasándolos a través de los mecanismos de manejo del teclado X. Esto significa que el emulador de terminal integrado del kernel nunca llega a realizar el procesamiento especial para Alt +Fn secuencias de teclado. Es el servidor X el que tiene que reconocer Ctrl +Alt +Fn .
Lecturas adicionales
- Arthur Taylor (2013-02-02). systemd no debería llamar a KDSKBMODE en un VT con X . systemd-devel.
- Adam Jackson (2012-11-16). [PATCH] vt:Deja K_OFF para VC_MUTE . Lista de correo del kernel de Linux.
- Adam Jackson (2012-11-16). [PARCHE] Linux:Preferir ioctl(KDSKBMUTE, 1) sobre ioctl(KDSKBMODE, K_OFF) . desarrollo xorg.
- Michael K. Johnson (1994-06-01). Sugerencias de programación de Linux . Diario de Linux.