在將影片渲染到幀緩衝區時隱藏虛擬控制台的最佳實踐
我目前正在使用 GStreamer 將 Linux 中的影片直接渲染到幀緩衝區。
我想知道如何在渲染時隱藏虛擬控制台。我可以阻止游標閃爍,但這僅在控制台上沒有文本更改時才有效。
X 似乎創建了一個可以通過 Ctrl(+Alt)+F7 訪問的新螢幕——我自己可以做類似的事情嗎?不知何故,可以使用 Ctrl+Alt+F1 和 Ctrl+Alt+F2 在控制台和渲染螢幕之間切換。
X 不會創建新螢幕。
要使用核心的內置終端仿真器正在使用的相同顯示和輸入事件設備(以呈現其虛擬終端),程序必須安排共享它們。核心的終端仿真器提供了一個 API,當這樣的程序負責輸入和輸出時,以及核心的內置終端仿真器負責時,通過該 API 可以進行協商。
此 API 通過
ioctl()
呼叫對核心虛擬終端字元設備開放的文件描述符來實現。Linux 中有 64 個這樣的設備,FreeBSD/PC-BSD 中有 16 個。X 不會創建這些。它打開一個現有的——按照慣例,沒有 TUI 程序同時嘗試將其用作核心虛擬終端。換句話說:按照慣例,X 打開和使用的核心虛擬終端設備上沒有執行 TUI 登錄會話。與核心終端仿真器共享的程序必須……
…告訴核心終端仿真器停止寫入幀緩衝區以顯示輸出或游標。這是通過
KDSETMODE
ioctl()
設置現在非常錯誤命名的KD_GRAPHICS
模式來完成的。在KD_TEXT
模式下,核心終端模擬器現在通常與處於實際文本模式的顯示硬體無關。所謂的幀緩衝控制台具有圖形模式的顯示硬體。KD_TEXT
和之間的區別KD_GRAPHICS
模式是在前一種模式下,核心的終端仿真器將在終端行規程向其提供輸出時將字元字形繪製到幀緩衝區上,並且還將繪製游標;而在後一種模式下,它根本不會進行任何繪圖。如今,這些實際上最好被認為是“繪製圖形”和“不繪製圖形”模式,如果不命名為“圖形”是錯誤的。☺…協商虛擬終端切換,如果適用的話。這是通過 來完成的,當用於呼叫的虛擬終端切換到或離開
VT_SETMODE
ioctl()
時,程序可以安排接收信號。ioctl()
…與核心終端仿真器協商輸入處理。
在 Linux 上,可能會直接從輸入事件子系統中讀取,在這種情況下,程序會告訴核心的終端仿真器停止讀取相同的輸入事件,它接收到的副本,停止將它們轉換為字元,並停止發送它們以線紀律作為輸入。這樣做的方式各不相同:
- 最初的方法是使用
KDSKBMODE
ioctl()
, 將虛擬終端切換到K_RAW
模式。在這種模式下,核心終端仿真器仍然從核心的輸入事件子系統接收輸入事件,但它不執行任何處理,將它們作為字元輸入傳遞給線路規程。然而,這種機制(其根源在於 X 在輸入事件子系統之前的工作方式)被破壞了,因為該輸入仍然被發送到線路規程並且仍然必須被排出。並且要求termios
終端的輸入狀態也必須是原始模式,否則原始掃描碼會被線路規則誤解為特殊字元,例如 STOP 或 INTR 字元。- 一種曾經被認為更好的方法是使用
KDSKBMODE
ioctl()
,將虛擬終端切換到K_OFF
模式。在這種模式下,核心終端仿真器不僅不會處理輸入事件,也不會將它們發送到線路規程。然而,這個機制被打破了,因為它是///K_OFF
模式切換的一部分。systemd 和其他類似系統將管理虛擬終端模式,並最終將虛擬終端切換到模式之外。K_RAW``K_CODE``K_XLATE``K_OFF
- 現在更好的方法是使用
KDSKBMUTE
旗幟。這將關閉所有輸入事件處理,而不影響//模式開關或K_RAW
受其影響K_CODE
。K_XLATE
在 FreeBSD/PC-BSD 上,首先沒有單獨的輸入事件字元設備。無論如何,人們都會通過核心虛擬終端讀取鍵盤輸入,因此雖然可能希望將其切換到掃描碼 (
K_RAW
) 或鍵碼 (K_CODE
) 模式,但不想將其關閉。這裡有一些互動。例如,X 伺服器將虛擬終端切換到鍵碼模式,讀取鍵碼並將它們轉換為 X 鍵符,通過 X 鍵盤處理機制傳遞它們。這意味著核心的內置終端仿真器永遠不會為
Alt
+鍵盤序列執行特殊處理。X伺服器必須自己辨識++ 。F*n*``Ctrl``Alt``F*n*
進一步閱讀
- 阿瑟·泰勒 (2013-02-02)。 systemd 不應在帶有 X 的 VT 上呼叫 KDSKBMODE。系統開發。
- 亞當傑克遜 (2012-11-16)。 $$ PATCH $$vt:為 VC_MUTE 刪除 K_OFF。Linux 核心郵件列表。
- 亞當傑克遜 (2012-11-16)。 $$ PATCH $$linux:首選 ioctl(KDSKBMUTE, 1) 而不是 ioctl(KDSKBMODE, K_OFF)。xorg-開發。
- 邁克爾 K.約翰遜 (1994-06-01)。Linux 程式提示。Linux 雜誌。