GNU/Linux >> Tutoriales Linux >  >> Linux

¿Mejor práctica para ocultar la consola virtual mientras se renderiza video en Framebuffer?

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 llamado KD_GRAPHICS modo. Cuando en KD_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 entre KD_TEXT y KD_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 el ioctl() 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 a K_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 los termios 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 a K_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 un K_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 de K_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 el K_RAW /K_CODE /K_XLATE interruptor de modo.
    • 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.
Relacionado:Linux:¿cómo crear un disco virtual de tamaño fijo con qemu-img?

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.

Linux
  1. ¿Qué servicio de Systemd inicia la consola de texto en el dispositivo Framebuffer?

  2. ¿Encontrar la mejor fuente para renderizar un punto de código?

  3. Las 10 mejores aplicaciones de edición multimedia para Linux

  4. Los 10 mejores software de videoconferencia para Linux en 2020

  5. Las 10 mejores alternativas gratuitas de Skype para PC con Linux

Los mejores convertidores de video gratuitos para Linux [GUI, CLI y en línea]

Las 30 mejores herramientas de VMware para empresas modernas

Los 15 mejores reproductores de video de Linux en 2022:prueba obligada para los amantes del cine

15 mejores programas de edición de video para sistema Linux

Terminal de compensación

¿Cuál es la mejor práctica para la comunicación entre instancias de Amazon EC2?