2

クライアントに画面の更新を送信できるように、X11ウィンドウがいつ変更されるかを知る必要があるXvfb-to-HTML5-canvasツールを作成しようとしています。WebベースのVNCまたはRDPのように考えてください。ただし、X11ウィンドウ専用です(デスクトップ全体を送信する理由=)。

Xlibまたはxcb(xpyb)を介してこれを行う簡単な方法があると思いましたが、私の実験では、ウィンドウが作成、破棄、または移動されたときを検出することができました。これはすばらしいことですが、ウィンドウの内容がいつ変更されるかを知る必要があります(xtermにキーストロークを送信し、ウィンドウを移動するまでキーストロークがフリーズしているように見えることを想像してください)。

X11ウィンドウの内容がいつ変更されたかを誰かが知っているなら、私はそれを聞きたいです!私は創造的な解決策を受け入れています。たとえば、ffmpegを使用してfifoを介してx11grabをストリーミングし、何かが変更されたかどうかを定期的にチェックしてみましたが、CPU使用率の点で非常に非効率的であることが判明しました(何も起きていなくてもシステム全体の速度が低下するようです) )。

また、可能な限り最も効率的な方法で変更を確認しながら、ループ内で15 fps相当のスクリーンショットを取得してみました(たとえば、このcStringIOバッファーは最後のバッファーと一致しますか?)。これもCPUに非常に負荷がかかりました。

理想的な解決策は、ソケットのファイル記述子を監視し、X11ウィンドウに変更があったときにハンドラーを呼び出すことができるようにすることです。X11画面全体に変更があった場合は、それを検出することに同意したいと思います...それでも私が持っているものよりはましです。

これに関するすべての助けはありがたいです!

4

1 に答える 1

4

まず、実際にvncを使用して、デスクトップ全体ではなく、1つのウィンドウで変更を追跡できます。x11vncドキュメントから:

-id windowid           Show the X window corresponding to "windowid" not
                       the entire display.  New windows like popup menus,
                       transient toplevels, etc, may not be seen or may be
                       clipped.  Disabling SaveUnders or BackingStore in the
                       X server may help show them.  x11vnc may crash if the
                       window is initially partially obscured, changes size,
                       is iconified, etc.  Some steps are taken to avoid this
                       and the -xrandr mechanism is used to track resizes.  Use
                       xwininfo(1) to get the window id, or use "-id pick"
                       to have x11vnc run xwininfo(1) for you and extract
                       the id.  The -id option is useful for exporting very
                       simple applications (e.g. the current view on a webcam).
-sid windowid          As -id, but instead of using the window directly it
                       shifts a root view to it: this shows SaveUnders menus,
                       etc, although they will be clipped if they extend beyond
                       the window.


-appshare              Simple application sharing based on the -id/-sid
                       mechanism.  Every new toplevel window that the
                       application creates induces a new viewer window via
                       a reverse connection.  The -id/-sid and -connect
                       options are required.  Run 'x11vnc -appshare -help'
                       for more info.

同様の機能を手動でコーディングする場合は、damageextensionを使用する必要があります

node-x11を使用したjavascriptの簡単な例を次に示します(申し訳ありませんが、Pythonでのダメージ拡張サポートについてはよくわかりません)

var x11 = require('x11');

var X = x11.createClient(function(err, display) {
    X.require('damage', function(Damage) {
        var damage = X.AllocID();
        Damage.Create(damage, parseInt(process.argv[2]), Damage.ReportLevel.NonEmpty);
        X.on('event', function(ev) {
          Damage.Subtract(damage, 0, 0);
          console.log("window content changed!");
        });
    });
});

コマンドライン引数としてウィンドウIDを使用して開始すると、ウィンドウの内容が変更されるたびに通知されます。

于 2013-02-12T00:10:24.220 に答える