14

xscreensaver、kscreensaver、または gnome-screensaver のうち、実行されている可能性のあるものを、できればスクリーンセーバーにとらわれない方法で抑制するための適切でラメのない方法を探しています

xscreensaver FAQを読みました。

私は gtk ベースのゲーム プログラムを持っており、複数のオーディオ チャネルをミキシングしながら毎秒 30 フレームをクランクアウトしています。それはジョイスティックで制御されているため、「the」スクリーンセーバーが作動することがあります。 xscreensaver、gnome-screensaver、および kscreensaver の少なくとも 3 つの異なる一般的なスクリーンセーバーであり、それぞれに独自のユニークで扱いにくい方法があり、アプリケーションがそれらを禁止する可能性があります。

コードをカプセル化して、これらすべてを高速なコードの塊にまとめた人はいますか? ああ、それは GPL 互換でなければなりません。

現在、私のコードは、スクリーンセーバーが検出され、ジョイスティックが使用されている場合、非協力的なスクリーンセーバー開発者について哀れに泣き言を言うだけであり、実際にはスクリーンセーバーを手動で無効にするようにユーザーにアドバイスする以外に何もしようとしません。やろうと思うことは信じられないほど醜いので、私はそれをすることを単に拒否します.

他の誰かがこれに遭遇したかどうか、彼らが何をしたか、そして彼らが何かをしたかどうか、それが私に思われるほど醜いものであったかどうか、またはエレガントな解決策があるかどうか... X イベントを何らかの形で合成して、何らかのアクティビティがあるとスクリーンセーバーに思い込ませることで、普遍的な方法でトリックを実行できるように思われますが、それを行う方法が本当にわかりません (そして、それを行うために root になる必要がないことを願っています)。 .)

何か案は?


残念ながら、少なくとも Fedora コア 8 では、これは機能していないようです。

xdg-screensaver スクリプトがあり、動作するように意図されているようですが、実際には動作しません。

「xdg-screensaver suspend window-id」を実行すると、ウィンドウIDがプログラム内から取得されます

xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);

または、ウィンドウ ID が xprop を介して取得され、xdg-screensaver が手動で実行されるかどうかにかかわらず、2 つのプロセスが作成されます。

[scameron@zuul wordwarvi]$ ps -efa | grep xdg
scameron  4218     1  0 20:12 pts/2    00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron  4223     1  0 20:12 pts/2    00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004
scameron  4313  3151  0 20:15 pts/1    00:00:00 grep xdg
[scameron@zuul wordwarvi]$ 

そして、彼らが死ぬのを待っていると思われるプログラムが死んでも、決して死ぬことはなく、スクリーンセーバーが再び有効になることもありません。

[scameron@zuul wordwarvi]$ xdg-screensaver status
disabled
[scameron@zuul wordwarvi]$ ls -ltr /tmp | grep xdg
-rw------- 1 scameron scameron    15 2009-01-20 20:12 xdg-screensaver-scameron--0.0
[scameron@zuul wordwarvi]$ 

xdg-screensaver resume window-id を実行しても、スクリーンセーバーは再開されません。

スクリーンセーバーを再度有効にするには、手動でそれらを強制終了し、/tmp に残っているファイルを手動で削除する必要があります。

[scameron@zuul wordwarvi]$ kill 4218 4223
[scameron@zuul wordwarvi]$ rm /tmp/xdg-screensaver-scameron--0.0 
[scameron@zuul wordwarvi]$ xdg-screensaver status
enabled
[scameron@zuul wordwarvi]$ 

したがって、善意ですが、実際には機能していないようです。


いいえ、もちろん、すべてのフレームで実行することを期待していませんが、実行時に問題が発生することを望んでいません。X イベントを合成するという私の考えでは、スクリーン セーバーにアクティビティがあると認識させるのに十分な頻度であると想像していました。

xdg-screensaver (これは、最終的にプロセスを「待機」するだけのシェル スクリプトのようです。クールです) を見ると、私がやりたいことだけを行うように作られているようです。この問題に直面したのは、私だけではない、または最初の人ではないことはわかっていました。

4

6 に答える 6

6

いいえ、しかしはい...

これを行うための良いクリーンな方法はありません。私の意見では、Xサーバーによって管理されるメカニズムが必要です。このメカニズムは、スクリーンセーバーと関心のあるアプリケーションの両方が、1つ以上のプログラムの実行中にスクリーンセーバーの抑制をネゴシエートするために自発的に使用できます。しかし、私の知る限り、そのようなメカニズムはまだ存在していません。GNOMEとKDEは、この問題に対してDBUSアプローチを実装しているように見えますが、私の意見では、それが普及したとしても(サードパーティのコードで信頼できるほど普及していない)、それは正しいアプローチではありません。

ただし、xdg-screensaverは、スクリーンセーバーを制御するためのサブプロセスとして実行できるFreeDesktopの標準化されたシェルスクリプトです。これは最も人気のあるスクリーンセーバーを制御し、OSベンダーは、新しいスクリーンセーバーまたは将来これを行うためのより良い方法で動作するように更新/維持する責任があります。他の多くの応急修理とは異なり、アプリケーションがクラッシュしたり、再有効化コードの呼び出しを忘れたルートを経由して終了したりすると、スクリーンセーバーが自動的に再有効化されます。使用方法の詳細については、マニュアルページを参照してください。

GTK +ユーザーとして、おそらくこれの最も難しい側面は、シェルスクリプトを実行するサブプロセスを作成し(fork + execの使用に関するチュートリアルを見つける前にこれを行っていない場合)、XWindowを取得することです。 xdg-screensaverに提供するアプリケーションのメインウィンドウのID。

コードは「高速」である必要があります。これは、フレームごとに実行することを期待しているのかどうか疑問に思います-しないでください。xdg-screensaverソリューションを使用すると、フレームごとに1回などを抑制しようとするのではなく、スクリーンセーバーを明示的に無効化または再利用可能にすることができます。

于 2009-01-20T11:44:52.597 に答える
2

これは完全にデスクトップに依存しないソリューションではありませんが、コア Gnome ライブラリがインストールされている場合 (多くの GTK ベースのアプリで必要です)、他のデスクトップ環境でも動作する可能性があります。

スクリーンセーバーを無効にする:

gsettings set org.gnome.desktop.screensaver idle-activation-enabled false

スクリーンセーバーを (再) 有効にします。

gsettings set org.gnome.desktop.screensaver idle-activation-enabled true
于 2013-06-30T21:17:41.963 に答える
1

映画プレーヤーは通常、スクリーンセーバーを無効にします。mplayerコードを調べて、彼らがどのようにそれを行うかを確認できます。

通常の X の場合、サポートされている場合はXScreenSaverSuspendを使用します。

于 2009-01-20T11:22:36.840 に答える