ビデオをフレームバッファにレンダリングするときに仮想コンソールを非表示にするベストプラクティス

ビデオをフレームバッファにレンダリングするときに仮想コンソールを非表示にするベストプラクティス

私は現在、GStreamerを使用してLinuxのビデオをフレームバッファに直接レンダリングしています。

レンダリング中に仮想コンソールを隠す方法を知りたいです。カーソルの点滅を止めることができますが、これはコンソールでテキストが変更されていない場合にのみ機能します。

XがCtrl(+ Alt)+ F7を介してアクセスできる新しい画面を作成しているようです。私も同様のことができますか? Ctrl+Alt+F1 と Ctrl+Alt+F2 を使用して、コンソールとレンダリングされた画面を切り替えることができます。

答え1

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端末の入力状態も生モードでなければなりません。それ以外の場合、生のスキャンコードは、ラインルールによってSTOPやINTR文字などの特殊文字として誤解されます。
      • かつて良いと考えられた方法は、 KDSKBMODE ioctl()スイッチ仮想端末をK_OFFモードで使用することでした。このモードでは、カーネル端末エミュレータは入力イベントを処理するだけでなく、ラインルールにも送信しません。ただし、このメカニズムはK_OFF/// モード スイッチK_RAWの一部であるため破損しています。 systemdや他の同様のシステムは、仮想端末モードを管理し、最終的に仮想端末を切り替えます。K_CODEK_XLATE出るモードK_OFF
      • 最近のより良いアプローチはロゴを使用することですKDSKBMUTE。これにより、すべての入力イベント処理がオフになります。いいえK_RAW//K_CODEモードK_XLATEスイッチに影響を与えるか影響を受けます。
    • FreeBSD/PC-BSD には、そもそも個別の入力イベント文字デバイスはありません。 1つは、カーネル仮想端末を介してキーボード入力を読み取ることです。それでもK_RAWしたがって、スキャンコード()またはキーコード()モードに切り替えたい場合がありますが、オフにしたくありK_CODEません。

これにはいくつかの相互作用があります。たとえば、Xサーバーは仮想端末をキーコードモードに切り替え、キーコードを読み取り、それをXキーシンボルに変換し、Xキーボード処理メカニズムを介して渡します。これは、カーネルに組み込まれた端末エミュレータがAlt+キーボードシーケンスの特別な処理を実行できないことを意味します。 Xサーバーは++自体を認識する必要があります。FnCtrlAltFn

追加読書

関連情報