11


8

OpenGLアプリを端末から直接フルスクリーンで実行するにはどうすればよいでしょうか(Ubuntu Server 9.04)。 私は自分のサーバー上で視覚的診断用のアプリケーションを開発しましたが、ウィンドウレス環境で実行するための最善の方法がまったくわからない。

'' '' '

理想的には、私は自分のプログラムを実行します。

./visualdiagnostics

そしてそれにOpenGLアプリを起動させます。 それから、単純な `Ctrl X`キーバインディングを通して、私はアプリを終了させて​​ターミナルに戻ります。

'' '' '

X11をインストールしてからプログラム内から起動する必要がありますか? すでに実行されているかどうかを検出し、必要に応じて起動または停止するには、どうすればよいでしょうか。

そしてFYI:いいえ、私はこれをPuttyやその他何にでも実行させようとはしていません… 私はモニターをサーバーに直接接続しています。 サーバーに適切なビデオドライバがインストールされています。

4 Answer


12


あなたの仕事にはいくつかの部分があります。 このうちのいくつかは非常にディストリビューション固有のものになる可能性があることに留意してください。しかし、あなたがUbuntuを言ったので、我々はUbuntuを話します!

また、この質問Cにタグを付けましたが、私は一般的なLinuxパターン、つまりBashシェルスクリプトラッパーを持つネイティブアプリケーションから始めています。 たぶんうまく動くようになれば、もしそうしなければならないならその機能をCに折り畳むかもしれません。

Xが稼働しているかどうかの検出

rootになることはとても役に立ちます。 うまくいくいくつかのこと。

  1. pgrep Xorg

  2. `/ var / lib / gdm /:0.Xauth`が存在するか確認してください。 誰もログインしていなくてもGDMが実行されている場合でも、これは存在します。

  3. ls -l / home / * /。Xauthority(たとえあなたがrootでなくても_あなた_がXを実行しているかどうかは少なくとも確認できます。

既存のXセッションをピギーバックする

あなたは特にそれについて言及しませんでしたが、あなたがコンソールでrootであるならば、またはあなたがすでにログインしているのと同じユーザーとしてアプリを実行したいなら、それはかなり簡単です。

DISPLAY`と XAUTHORITY`環境変数を正しく設定しなければなりません。そうすれば、既存のXディスプレイを使うことができます。

DISPLAY`では単に:0`を仮定するか、既存のXプログラム( `x-session-manager`がGNOME標準です)を見つけて/ proc / PID / environからその環境を読むことができます。 変数は、nullバイトで区切られたkey = value形式です。 たとえば、そのPIDが12345の場合、

cat / proc / 12345 / environ \ | ruby -ne 'は$ _。split( "\ 0")を置きます。 e.starts_with? "DISPLAY ="} '

`XAUTHORITY`でも同じように使えます。 推測したければ、ほとんどの場合 `/ home / whoever / .Xauthority`です。

これら2つの変数を入手したら、Xコードの実行は簡単です。例えば、

環境変数=:0 XAUTHORITY = / home / brian / .Xauthority ./visualdiagnostics

Xを停止する

これはrootならば簡単です: /etc/init.d/gdm stop。 `killall Xorg`も動きます。

あなたがユーザならば、あなた自身の Xorg`または x-session-manager`プロセスを終了させて​​ください。 (これを行うための標準的な方法についての他の人からの意見を歓迎します。 たぶんいくつかのdbus送信メッセージ?

Xを起動

私は人生の目標がXを起動してちょうど1つのプログラムを実行することである `xinit`を推薦します。

例えば、 `xinit。/ visualdiagnostics`です。

また、xinitにどの解像度でXを実行するかを指定することもできます。 (これは、以下のフルスクリーンセクションで重要になります。)

これに関する問題はウィンドウマネージャを持たないことです - ボタンを最大化したり最小化したりしないでください。 化粧品だけではありません。 ポップアップウィンドウを移動したり、正しい入力フィールドに焦点を合わせることができないため、通常、アプリは役に立ちません。 しかし、あなたが特別なアプリを持っていればそれで十分かもしれません(以下のフルスクリーンを見てください)。

次のステップは、すべてに対する私の答えです:他のシェルスクリプトwrapper! ウィンドウマネージャを起動してからプログラムになるような簡単なものでもうまくいきます。

#!/ bin / bash##xinitが私に電話をかけたら、visualdiagnosticsを起動します。

/ usr / bin / metacity exec ./visualdiagnostics

最初のプログラムが終了するとXはシャットダウンするので、メインプログラムを実行(なる)することは重要です。

全画面表示

私は100%確実ではありません。 いくつかのアイデア:

  • 標準的なXの `-geometry`パラメータを使って、左上隅に0,0、水平方向と垂直方向のサイズにx yを設定してください。 サイズはどうやってわかりますか? `xinit`を起動したときにハードコードしたか、Xサーバに問い合わせることができます。 `xwininfo -root`はあなたに教えてくれるでしょうし、それをするxlib API呼び出しもあります - 私が推測しているxwininfoソースをチェックしてください。

  • アプリ自体が最大化やサイズ変更をリクエストして画面いっぱいに表示することができます。 私はなじみがありませんが、それは間違いなくX APIにあります。

  • より構成可能なウィンドウマネージャの中には、最大化して実行できるように事前設定できるものがあります。 これはおそらく私が最初に確認することでしょう。 あなたのラッパースクリプトはハードコードされた設定をエコーすることで `$ HOME / .fluxboxrc`を作成することができます。

概要

他は正しいです。 Xは厳密には必要ではないので、OpenGLはフレームバッファに対して実行できます。 しかし、Xがどこにあり、配布用に自動化するためにどれだけの作業が費やされてきたかを考えると、Xルートには多少の労力を費やすことになるでしょう。

(ちなみに、 "terminal"と言ったときは、* gnome-terminal ではなく console *というテキストが表示されていることを意味します。 :)


2


そうですね、私の答えがあなたを助けてくれるのかどうかははっきりとはわかりません。

私が学生だったずっと前に、私はフレームバッファをインストールすることによってそうすることに成功しました(端末のみのLinuxインストールからopenGLアプリを起動する)。 私は自分のカーネルを再コンパイルする必要があったことを覚えている限り(フレームバッファはカーネルモジュールだったので)。

これはおそらく5年前のDebianディストリビューションでしたが、Ubuntuのような最新のDebianディストリビューションでそれが現在どのように機能するのかわかりません。 多分framebufferはUbuntuでデフォルトで提供されているバイナリカーネルで静的にコンパイルされています。 そうでないかもしれない。 多分フレームバッファは今は無関係です…​ それとも5年前の私自身の冒険のすべての詳細を今では覚えていないのですが、まったく間違っているかもしれません。

グーグルを見てください! ;-)

それが役立つことを願っています…​

**

更新:


1


yvesが指摘したように、フレームバッファを使用すればXサーバを実行することを避けることができます。 実際には、フレームバッファモジュールはまだ利用可能であることが多くあります(たとえば、カーネル起動時にtuxロゴを表示したり、背景にファンシー画像を表示したテキスト端末を使用する場合)。

カーネル側は非常に原始的なので、私は DirectFBのようないくつかのより高いレベルのライブラリを使うことを勧めます。 フレームバッファは問題なく使用できますが、本格的なXサーバと同じ成熟度レベルを期待しないでください。


0


コンピュータに直接接続されたモニタにビデオを表示させようとしていますか?

Xはサーバー上で稼働していますか?

Xが実行されているなら、あなたはすることができます

DISPLAY = = 0.0をエクスポート

これは、どこから来た場所ではなく、localhostのXサーバーに接続するようにXアプリに指示します。

実際に(直接端末から)ローカルにログインしている場合 はい、Xをインストールして実行する必要があります。