Saat ini saya sedang merender video di Linux langsung ke framebuffer menggunakan GStreamer.
Saya bertanya-tanya bagaimana cara menyembunyikan konsol virtual saat melakukan rendering. Saya dapat menghentikan kursor agar tidak berkedip, tetapi itu hanya berfungsi jika tidak ada teks yang berubah di konsol.
X tampaknya membuat layar baru yang dapat diakses dengan Ctrl(+Alt)+F7 – apakah mungkin melakukan hal seperti itu sendiri? Entah bagaimana dapat beralih antara konsol &layar rendering dengan Ctrl+Alt+F1 dan Ctrl+Alt+F2.
Jawaban yang Diterima:
X tidak membuat layar baru.
Untuk menggunakan tampilan dan perangkat kejadian input yang sama dengan yang digunakan emulator terminal bawaan kernel (untuk menampilkan terminal virtualnya), sebuah program harus mengatur untuk membagikannya. Emulator terminal kernel menyediakan API yang melaluinya program semacam itu dapat bernegosiasi ketika memiliki tanggung jawab untuk input dan output, dan ketika emulator terminal bawaan kernel memilikinya.
API ini melalui ioctl()
memanggil deskriptor file yang terbuka untuk perangkat karakter terminal virtual kernel. Ada 64 perangkat ini di Linux, 16 di FreeBSD/PC-BSD. X tidak membuat ini. Ini membuka yang sudah ada - dengan konvensi yang tidak ada program TUI yang secara bersamaan mencoba untuk digunakan sebagai terminal virtual kernel. Dengan kata lain:Menurut konvensi, tidak ada sesi login TUI yang dijalankan pada perangkat terminal virtual kernel yang dibuka dan digunakan X.
Program yang berbagi dengan emulator terminal kernel harus …
- … beri tahu emulator terminal kernel untuk berhenti menulis ke framebuffer untuk menampilkan output, atau kursor. Ini dilakukan dengan
KDSETMODE
ioctl()
untuk mengaturKD_GRAPHICS
. yang saat ini cukup salah nama mode. Saat berada diKD_TEXT
mode emulator terminal kernel saat ini biasanya tidak ada hubungannya dengan perangkat keras tampilan berada dalam mode teks yang sebenarnya. Apa yang disebut konsol framebuffer memiliki perangkat keras tampilan dalam mode grafis. Perbedaan antaraKD_TEXT
danKD_GRAPHICS
mode adalah bahwa dalam mode sebelumnya emulator terminal kernel akan menggambar mesin terbang karakter ke framebuffer saat disiplin baris terminal mengirimkan output ke sana, dan juga akan menggambar kursor; sedangkan dalam mode terakhir itu tidak akan menggambar sama sekali. Ini sebenarnya akan lebih baik dianggap sebagai mode "gambar grafik" dan "jangan gambar grafik" saat ini, adalah yang salah yang tidak dinamai "grafik". - … negosiasikan peralihan terminal virtual, jika berlaku. Ini dilakukan dengan
VT_SETMODE
ioctl()
, yang dengannya program dapat mengatur untuk menerima sinyal ketika terminal virtual yang digunakan untukioctl()
panggilan dialihkan ke atau di luar. - … negosiasikan penanganan input dengan emulator terminal kernel.
- Di Linux, seseorang mungkin membaca dari subsistem kejadian input secara langsung, dalam hal ini program memberitahu emulator terminal kernel untuk berhenti membaca kejadian input yang sama, yang menerima salinannya, untuk berhenti menerjemahkannya ke dalam karakter, dan berhenti mengirim mereka ke disiplin garis sebagai masukan. Cara melakukannya bervariasi:
- Cara asli untuk melakukannya adalah dengan
KDSKBMODE
ioctl()
, alihkan terminal virtual keK_RAW
mode. Dalam mode ini, emulator terminal kernel masih menerima kejadian input dari subsistem kejadian input kernel, tetapi tidak melakukan pemrosesan apa pun, meneruskannya ke disiplin baris sebagai input karakter. Namun, mekanisme ini (yang berakar pada cara X bekerja sebelum ada subsistem kejadian input) rusak, di mana input itu masih dikirim ke disiplin garis dan masih harus dikeringkan. Dan diperlukantermios
status input untuk terminal juga berada dalam mode mentah, jika tidak, kode pindaian mentah akan disalahartikan sebagai karakter khusus seperti karakter STOP atau INTR oleh disiplin baris. - Cara yang pernah dianggap lebih baik adalah dengan
KDSKBMODE
ioctl()
, alihkan terminal virtual keK_OFF
mode. Dalam mode ini, emulator terminal kernel tidak hanya tidak akan memproses kejadian input, tetapi juga tidak akan mengirimkannya ke disiplin baris. Namun, mekanisme ini rusak, karena merupakan bagian dariK_OFF
/K_RAW
/K_CODE
/K_XLATE
saklar mode. systemd dan sistem serupa lainnya akan mengelola mode terminal virtual, dan akhirnya mengganti terminal virtual keluar dariK_OFF
modus. - Cara yang lebih baik saat ini adalah dengan menggunakan
KDSKBMUTE
bendera. Ini menonaktifkan semua pemrosesan acara input tanpa mempengaruhi, atau dipengaruhi oleh,K_RAW
/K_CODE
/K_XLATE
sakelar mode.
- Cara asli untuk melakukannya adalah dengan
- Pada FreeBSD/PC-BSD, tidak ada perangkat karakter input event yang terpisah. Seseorang membaca input keyboard melalui terminal virtual kernel bagaimanapun , jadi sementara orang mungkin ingin mengubahnya menjadi scancode (
K_RAW
) atau kode kunci (K_CODE
) mode, seseorang tidak ingin mematikannya.
- Di Linux, seseorang mungkin membaca dari subsistem kejadian input secara langsung, dalam hal ini program memberitahu emulator terminal kernel untuk berhenti membaca kejadian input yang sama, yang menerima salinannya, untuk berhenti menerjemahkannya ke dalam karakter, dan berhenti mengirim mereka ke disiplin garis sebagai masukan. Cara melakukannya bervariasi:
Ada beberapa interaksi, di sini. Server X, misalnya, mengalihkan terminal virtual ke mode kode kunci, membaca kode kunci dan mengubahnya menjadi simbol kunci X, meneruskannya melalui mekanisme penanganan keyboard X. Ini berarti bahwa emulator terminal bawaan kernel tidak pernah dapat melakukan pemrosesan khusus untuk Alt +Sn urutan keyboard. Ini adalah server X yang harus mengenali sendiri Ctrl +Alt +Sn .
Bacaan lebih lanjut
- Arthur Taylor (2013-02-02). systemd tidak boleh memanggil KDSKBMODE pada VT dengan X . systemd-devel.
- Adam Jackson (2012-11-16). [PATCH] vt:Jatuhkan K_OFF untuk VC_MUTE . Milis kernel Linux.
- Adam Jackson (2012-11-16). [PATCH] linux:Lebih suka ioctl(KDSKBMUTE, 1) daripada ioctl(KDSKBMODE, K_OFF) . xorg-devel.
- Michael K. Johnson (1994-06-01). Petunjuk Pemrograman Linux . Jurnal Linux.