現在、LinuxでGStreamerを使用してフレームバッファに直接ビデオをレンダリングしています。
レンダリング中に仮想コンソールを非表示にするにはどうすればよいのでしょうか。カーソルの点滅を止めることはできますが、それはコンソールでテキストが変更されていない場合にのみ機能します。
XはCtrl(+ Alt)+ F7でアクセスできる新しい画面を作成しているようです–自分でそのようなことをすることは可能ですか?どういうわけか、Ctrl + Alt+F1とCtrl+Alt+F2でコンソールとレンダリング画面を切り替えることができます。
承認された回答:
Xは新しい画面を作成しません。
カーネルの組み込みターミナルエミュレータが(仮想ターミナルを提示するために)使用しているのと同じ表示および入力イベントデバイスを使用するには、プログラムがそれらを共有するように調整する必要があります。カーネルのターミナルエミュレータは、そのようなプログラムが入出力を担当する場合、およびカーネルの組み込みターミナルエミュレータが担当する場合にネゴシエートできる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
が必要でした 端末の入力状態もrawモードになっています。そうしないと、rawスキャンコードがラインディシプリンによってSTOP文字やINTR文字などの特殊文字として誤って解釈されてしまいます。 - かつてはより良いと考えられていた方法は、
KDSKBMODE
を使用することでした。ioctl()
、仮想端末をK_OFF
に切り替えます モード。このモードでは、カーネルターミナルエミュレータは入力イベントを処理しないだけでなく、それらをラインディシプリンに送信しません。ただし、このメカニズムはK_OFF
の一部であったため、壊れていました。 /K_RAW
/K_CODE
/K_XLATE
モードスイッチ。 systemdや他の同様のシステムは、仮想端末モードを管理し、最終的に仮想端末を切り替えます。K_OFF
の モード。 - 最近のより良い方法は、
KDSKBMUTE
を使用することです。 国旗。これにより、すべての入力イベント処理がなしでオフになります。K_RAW
に影響を与える、または影響を受ける /K_CODE
/K_XLATE
モードスイッチ。
- これを行う元の方法は、
- FreeBSD / PC-BSDには、そもそも個別の入力イベント文字デバイスはありません。カーネル仮想端末を介してキーボード入力を読み取るとにかく 、したがって、スキャンコード(
K_RAW
)に切り替えたい場合があります )またはキーコード(K_CODE
)モード、スイッチをオフにしたくない。
- Linuxでは、入力イベントサブシステムから直接読み取る場合があります。その場合、プログラムはカーネルのターミナルエミュレータに、コピーを受け取る同じ入力イベントの読み取りを停止し、文字への変換を停止し、停止するように指示します。それらを入力としてラインディシプリンに送信します。これがどのように行われるかはさまざまです:
ここにいくつかの相互作用があります。たとえば、Xサーバーは、仮想端末をキーコードモードに切り替え、キーコードを読み取ってXキーシムに変換し、Xキーボード処理メカニズムを通過させます。これは、カーネルの組み込みターミナルエミュレータが Altの特別な処理を実行することは決してないことを意味します + F n キーボードシーケンス。 Ctrlを認識しなければならないのはXサーバーです + Alt + F n 。
さらに読む
- アーサーテイラー(2013-02-02)。 systemdはXを使用するVTでKDSKBMODEを呼び出さないでください 。 systemd-devel。
- アダムジャクソン(2012-11-16)。 [PATCH] vt:VC_MUTEのK_OFFを削除 。 Linuxカーネルメーリングリスト。
- アダムジャクソン(2012-11-16)。 [PATCH] linux:ioctl(KDSKBMODE、K_OFF)よりもioctl(KDSKBMUTE、1)を優先する 。 xorg-devel。
- マイケルK.ジョンソン(1994-06-01)。 Linuxプログラミングのヒント 。 LinuxJournal。