GNU/Linux >> Znalost Linux >  >> Linux

Nejlepší postup pro skrytí virtuální konzole při vykreslování videa do Framebufferu?

Momentálně vykresluji video v Linuxu přímo do framebufferu pomocí GStreamer.

Přemýšlel jsem, jak bych při vykreslování skryl virtuální konzoli. Mohu zastavit blikání kurzoru, ale to funguje pouze tehdy, když se na konzole nemění žádný text.

Zdá se, že X vytváří novou obrazovku přístupnou pomocí Ctrl(+Alt)+F7 – je možné něco takového udělat sám? Nějakým způsobem je možné přepínat mezi konzolou a obrazovkou vykreslování pomocí Ctrl+Alt+F1 a Ctrl+Alt+F2.

Přijatá odpověď:

X nevytváří novou obrazovku.

Chcete-li použít stejná zařízení pro zobrazení a vstup, která používá emulátor terminálu vestavěný v jádře (k prezentaci svých virtuálních terminálů), musí program zajistit jejich sdílení. Emulátor terminálu jádra poskytuje rozhraní API, jehož prostřednictvím může takový program vyjednávat, kdy má odpovědnost za vstup a výstup a kdy má vestavěný emulátor terminálu jádra.

Toto API je přes ioctl() volá deskriptor souboru, který je otevřený pro virtuální terminálové znakové zařízení jádra. V Linuxu je 64 těchto zařízení, ve FreeBSD/PC-BSD 16. X je nevytváří. Otevírá existující — podle konvence ten, který se žádné programy TUI současně nesnaží použít jako virtuální terminál jádra. Jinými slovy:Podle konvence na virtuálním terminálovém zařízení jádra, které X otevírá a používá, není spuštěna žádná přihlašovací relace TUI.

Program sdílený s emulátorem terminálu jádra musí …

  • … řeknete emulátoru terminálu jádra, aby zastavil zápis do framebufferu, aby se zobrazil výstup nebo kurzor. To se provádí pomocí KDSETMODE ioctl() nastavit v dnešní době dost špatně pojmenované KD_GRAPHICS režimu. Když je v KD_TEXT emulátor jaderného terminálu nemá v dnešní době obvykle nic společného s hardwarem displeje, který je ve skutečném textovém režimu. Takzvané konzoly framebufferu mít zobrazovací hardware v grafickém režimu. Rozdíl mezi KD_TEXT a KD_GRAPHICS modes spočívá v tom, že v předchozím režimu bude emulátor terminálu jádra kreslit znaky znaků do framebufferu, když mu disciplína terminálové řádky dodává výstup, a také kreslí kurzor; zatímco v druhém režimu nebude provádět vůbec žádné kreslení. Tyto režimy by bylo ve skutečnosti lépe chápat jako režimy „kresli grafiku“ a „nekresli grafiku“, pokud by se nejednalo o režim „grafika“. ☺
  • … vyjednat přepnutí virtuálního terminálu, je-li to možné. To se provádí pomocí VT_SETMODE ioctl() , pomocí kterého může program zařídit příjem signálů, když virtuální terminál, který používá pro ioctl() hovory jsou přepnuty na nebo odpojeny.
  • … vyjednat manipulaci se vstupem s emulátorem terminálu jádra.
    • V Linuxu je možné číst přímo ze subsystému vstupních událostí. V takovém případě program řekne emulátoru terminálu jádra, aby přestal číst stejné vstupní události, kterých přijímá kopie, aby je přestal překládat na znaky a zastavil posílat je na linkovou disciplínu jako vstup. Jak se to dělá, se liší:
      • Původní způsob, jak to udělat, byl pomocí KDSKBMODE ioctl() , přepnutí virtuálního terminálu do K_RAW režimu. V tomto režimu emulátor terminálu jádra stále přijímá vstupní události ze subsystému vstupních událostí jádra, ale neprovádí je žádné zpracování a předává je řádkové disciplíně jako znakový vstup. Tento mechanismus (který měl kořeny ve způsobu, jakým X fungoval předtím, než existoval subsystém vstupních událostí) byl však porušen, protože vstup byl stále odesílán do řádkové disciplíny a stále musel být vyčerpán. A to vyžadovalo, aby termios vstupní stav pro terminál být také v nezpracovaném režimu, jinak by byly nezpracované skenovací kódy chybně interpretovány jako speciální znaky, jako jsou znaky STOP nebo INTR, řádkovou disciplínou.
      • Způsob, který byl kdysi považován za lepší, byl pomocí KDSKBMODE ioctl() , přepnutím virtuálního terminálu do K_OFF režimu. V tomto režimu by emulátor jaderného terminálu nejenže nezpracovával vstupní události, ale ani by je neposílal do řádkové disciplíny. Tento mechanismus byl však poškozen, protože byl součástí K_OFF /K_RAW /K_CODE /K_XLATE přepínač režimu. systemd a další podobné systémy by spravovaly režimy virtuálních terminálů a nakonec by virtuální terminály vypnuly z K_OFF režimu.
      • V dnešní době je lepší použít KDSKBMUTE vlajka. Tím se vypne veškeré zpracování vstupních událostí bez ovlivňující nebo ovlivnění K_RAW /K_CODE /K_XLATE přepínač režimu.
    • Ve FreeBSD/PC-BSD v první řadě není žádné samostatné zařízení se znakem vstupní události. Jeden čte vstup z klávesnice přes virtuální terminál jádra stejně , takže i když jej možná budete chtít přepnout do skenovacího kódu (K_RAW ) nebo kód klíče (K_CODE ) režimy, člověk to nechce vypínat.
Související:Linux – Jak vytvořit virtuální disk s pevnou velikostí pomocí qemu-img?

Jsou zde nějaké interakce. X server například přepne virtuální terminál do režimu kódování kláves, načte kódy kláves a přemění je na X klávesové symboly, které předá mechanismům manipulace s klávesnicí X. To znamená, že vestavěný emulátor terminálu v jádře nikdy neprovede speciální zpracování pro Alt +Fn klávesové sekvence. Je to X server, který musí sám rozpoznat Ctrl +Alt +Fn .

Další čtení

  • Arthur Taylor (2013-02-02). systemd by neměl volat KDSKBMODE na VT s X . systemd-devel.
  • Adam Jackson (2012-11-16). [PATCH] vt:Vynechejte K_OFF pro VC_MUTE . Linux kernel mailing list.
  • Adam Jackson (2012-11-16). [PATCH] linux:Preferujte ioctl(KDSKBMUTE, 1) před ioctl(KDSKBMODE, K_OFF) . xorg-devel.
  • Michael K. Johnson (1994-06-01). Tipy pro programování Linuxu . Linux Journal.

Linux
  1. vlock – Chytrý způsob, jak uzamknout uživatelskou virtuální konzoli nebo terminál v systému Linux

  2. 7 tipů osvědčených postupů pro správu vzdálených týmů

  3. Která služba Systemd spouští textovou konzoli na zařízení Framebuffer?

  1. 10 nejlepších aplikací pro úpravu médií pro Linux

  2. osvědčený postup pro přístupová oprávnění uživatelům pro apache tomcat

  3. Jaký je nejlepší postup pro komunikaci mezi instancemi Amazon EC2?

  1. 3 nejlepší GPU-akcelerované terminálové emulátory pro Linux

  2. Najít nejlepší písmo pro vykreslení kódového bodu?

  3. MOC – Nejlepší hudební přehrávač pro vaši konzoli Linux