問題タブ [xcb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Qt QPA と X11 の説明が必要
Qts プラットフォームの処理を何時間も理解しようとしましたが、わかりません。私のホットキー処理では、現在、表示の取得に X11extras、キー変換に xlib、Qt ネイティブ イベント処理に xcb を組み合わせて使用しています。リンクする 3 つのライブラリ。文書化されていない QPA は、ここでどこで役割を果たしますか? 今、これが必要かどうか疑問に思っています。ここで説明が必要です。私はqt 5.4を使用しています。未来に向かって進むべき道とは?
c - XCB – すべてのウィンドウでモーション通知イベントを受信しない
ポインターの動きについて通知を受けようとしています。ウィンドウマネージャーとして実行したくないので、XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_POINTER_MOTION
起動時と作成通知イベントの両方で行うすべてのウィンドウで設定する必要があります。
これは一般的にうまく機能しているようで、すべてのウィンドウでモーション通知イベントを受け取ります。ただし、どういうわけか、これは Google Chrome ウィンドウには当てはまりません。後で明示的にクエリを実行してイベント マスクを確認したところ、正しく設定されています。伝播マスクにも異常は見られません。
Google Chrome がモーション通知イベントを報告しない原因は何ですか? 私の知る限り、X プロトコルでは、Chrome にはないアクティブなポインター グラブを除いて、それが許可されていません。
これが、既存のすべてのウィンドウに自分自身を登録する方法です。ルート ウィンドウを呼び出しregister_events
、create notify イベントも受け取るたびに、次のようにします。
c++ - (XGetImage + XPutImage) VS XCopyArea VS (XShmGetImage + XShmPutImage) VS GTK+のパフォーマンス
私は Xlib だけでなく、Linux インターフェイス プログラミングも初めてです。
あるウィンドウのコンテンツを別のウィンドウに描画するという一般的なタスク(信頼できる例が見つからないため、それほど一般的ではない)を解決しようとしています。
しかし、私は深刻なパフォーマンスの問題に直面しており、プログラムをより高速で信頼性の高いものにするために使用できるソリューションを探しています。
ここで、プログラム フローに関する情報をいくつか提供します。選択したプログラムの設計が正しいかどうかわからないためです。Xlib の使用方法に誤りがある可能性があります。
プログラムは、アクティブなウィンドウ (今後はSrcWinと呼ばれます) の ID (Xlib "ウィンドウ" タイプ) を適切な方法で取得します (一部のプログラムのウィジェットの ID ではなく、すべてのコンテンツが描画される実際の可視ウィンドウ) XGetInputFocus
。フォーカスされたウィンドウを取得XQueryTree
し、ルート ウィンドウの子が見つかったときに使用してウィンドウを反復し、XmuClientWindow
関数を使用して名前付きウィンドウを取得します (まだ見つかっていない場合)。
次に、それを使用して、同じサイズの新しいウィンドウ(TrgWinと呼ばれる)を作成する関数で使用されるSrcWinXGetWindowAttributes
の幅と高さを取得します。XCreateSimpleWindow
新しいウィンドウ TrgWin には、KeyPressやExpose usingXSelectInput
関数などのいくつかのイベントが登録されます。
グラフィックス コンテキストは次のように作成されます。
ここで、無限ループが開始されます。このループselect
関数は、X 接続上の何らかのイベントまたはタイムアウト ( struct timeval
) を待機するために呼び出されます。
その後、プログラムは次を使用してSrcWinから画像を取得しようとします。
画像が正常に取得された場合、それはTrgWinに配置されます。
保留中のイベントは、次の場合に処理されます。
上記のように、プログラムはほぼ期待どおりに動作します。しかし、このプログラムで 40 ミリ秒ごとにSrcWinのコンテンツをTrgWinに描画させようとすると(これは timeval 値であり、イベントではより高速になる可能性があります)、コア i5-3337U ではこれに 21% の CPU 時間がかかります。プログラムと、Xorg プロセスが 683*752 のウィンドウを同じサイズの別のウィンドウに描画するのに 20% 近くかかります。
私の観点からは、SrcWin のピクセルを含むメモリ領域を TrgWin の対応するメモリ領域にマッピングできればよかったのですが、Xlib プログラミングが苦手で、それが可能であるかどうかは疑問です。標準 Xlib 関数。
1)しかし、私はKDE環境を開始してウィンドウスイッチャーをチェックしました。すべてのウィンドウのサムネイルは、深刻なCPU負荷なしでリアルタイムでウィンドウスイッチャーのウィンドウに描画されます。それはどのように行われますか?
2) どこかで XShmGetImage + XShmPutImage メカニズムが言及されています - 私のプログラムにとって XGetImage+XPutImage よりも優れていますか?
3) また、QT と GTK に「window-damage」イベントのようなものがあることを見ました。それはツールキット固有のイベントですか、それとも Xlib に相当するものですか?
4) QT と GTK の「window-damage」イベントは、ウィンドウの画像バッファーが変更された後に信号が送信されるため、ウィンドウ内の少なくとも 1 つのピクセルが変更されるすべてのイベントがそのようなイベントを生成していることを理解しましたか? SrcWin に変更がなくても、40 ミリ秒ごとに TrgWin コンテンツを継続的に変更することを取り除くことができるので、Xlib にこのようなものがあれば素晴らしいでしょう。
5) 簡単にするために GTK+ を使用する必要がありますか?
返信ありがとうございます。大量のテキストで申し訳ありません。
qt - XCB で GUI スレッドを起動する方法は?
アプリがスレッドの終了を待機しています。スレッドが終了したら、GUI を更新したいと思います。GUI スレッドは xcb_wait_for_event() でブロックされます。
これはXCBで可能ですか?Qt、GTK、FLTK などは、この基本的な GUI の問題を XCB API に関してどのように実装していますか?
python - Python アプリ - xcb プラグインの失敗
私の設定:アナコンダを使用したPython 2.7
最近、OpenCV 3.0 をインストールしました。簡単な画像表示をしようとしたり、OpenCV に付属の Python サンプルを実行したりしようとすると、次のエラー メッセージが表示されます。
このアプリケーションは、Qt プラットフォーム プラグイン「xcb」を見つけられなかったか、読み込めなかったため、開始できませんでした。
プロジェクトに .so ファイルを添付する必要があるという多くのコメントを読みましたが、ほとんどの人にとってそれは箱から出してすぐに動作するため、最適なソリューションではないと思います。
どうすればいいのかわかりません。私は未経験です。私の頭に浮かぶのは、すべてを再インストールすることだけです。
qt - XCB と libX11 イベント ループの統合 - Xt 内の select/poll でハングアップ
2 つのコード本体を、以前はそれぞれの GUI ツールキット用に独立したイベント ループを持っていた同じプロセスに統合しようとしています。1 つは Xt を使用し、もう 1 つは Qt5 を使用しています。その意図は、Qt サブウィンドウを表示できるようにすることであり、現在は機能していない Qt/Motif 統合拡張機能のような完全な統合を実現することではありません。
XCB イベントを XEvent に変換するネイティブ イベント フィルターを使用して、標準の Qt イベント ループで動作する粗いプロトタイプを作成できました (XESetWireToEvent + そのハンドラーを使用して xEvents / X11 ワイヤー フォーマットから変換します)。次に、XtDispatchEvent() を使用して、これらの XEvent を Xt に直接ディスパッチします。この時点で、プログラムを実行し、同じプログラムで Xt/Motif ウィジェットと Qt ウィジェットの両方を作成し、メニューを使用し、2D グラフィックスを描画し、Qt と Motif ウィジェットの両方を使用できます。
私が抱えている問題は、新しい Motif ダイアログを作成するときに長い遅延があることです。これを libXt 内の _XtWaitForSomething() まで追跡しました。最終的には、明らかに X サーバーの接続ソケット上の select() または poll() に行き着きます。_XtWaitForSomething() へのこの呼び出しは、XtManageChild() 内で発生するウィンドウのレイアウト管理の結果として発生します。_XtWaitForSomething() は、イベント キューに保留中のイベントがあるかどうかをチェックしているようです。
いくつか質問があります:
XCB と libX11 の両方の呼び出しを同じプログラム (イベント キュー マスターとして XCB を使用) で使用する場合、従来の Xlib からの呼び出しも適切に機能することを期待できますか? たとえば、libX11 呼び出しを介して XCB イベント キューにイベントをポストしたり、古い libX11 呼び出しを介して XCB イベント キューで保留中のイベントはありますか?
XtManageChild() が libXt 内の _XtWaitForSomething() でブロックされるのはなぜですか? ジオメトリ変更イベントを待っている可能性があります。興味深いことに、Qt のプラットフォーム レイヤーは XCB イベントを別のスレッドで読み取りますが、メイン スレッドでディスパッチします。Xt が _XtWaitForSomething() にイベント キューに何かが含まれているかどうかを確認する機会を得る前に、Qt の XCB リーダー スレッドがイベントを食べて、デッドロックにつながるのではないかと思います。Xt を呼び出している間に Qt の XCB イベント ループ [または一般的な XCB イベント ループ] をブロックさせる方法はありますか? Qt の変更はオプションではないため、Qt を変更して XCB レイヤーに条件変数を含めることはできません。
XCB のイベント キューの「所有者」ステータスは、[XSetEventQueueOwner(..., XCBOwnsEventQueue)] を意味します。これは、イベントを収集する XLib 呼び出しが実際にはイベント キューの先頭からイベントを「取得」しないことを意味しますか?
説明されているアプローチで明らかにブロックする問題はありますか? タイマー (イベント ループでこれらを処理する Xt 関数は呼び出されなくなりました)、モチーフ ウィジェットへの Qt サブウィンドウのウィンドウ親子関係を整理する必要がある可能性が高いことは既にわかっています。
ありがとう。
c - XCBでマウスカーソルを標準のハンドカーソルに変更
XCB を使用して、ウィンドウのマウス ポインターを標準のハンド カーソルに変更する必要があります (Linux での意味が何であれ、ツールキットに依存しないソリューションが必要です)。
注: 「カーソル」フォントをロードし、ウィンドウ属性 XCB_CW_CURSOR を XC_hand2 に変更することは解決策ではありません。これにより、リンクをホバーしたときに Chrome で表示されるデフォルトの Ubuntu ハンド カーソルではなく、X11 の見慣れないハンド カーソルが読み込まれます。
ありがとう。