LinuxのウィンドウをC++でPIDで移動できる関数を作りたいです。だから私はWindowsの下で試しました。しかし、Linux用にコンパイルするのに問題があります。Qt でそれを行う意味はありますか? 見つけられなかったので、Linux 用にコンパイルしようとしました。
Windows API の一部である MoveWindow 関数を使用しています。Linuxに相当するものはありますか?
移動、サイズ変更、最大化、その他のウィンドウなどのタスクを実行できるツールがすでにたくさんあるため、本当にしたくない場合は手動で行う必要はありません。
詳細に調べたいツールの 1 つは、wmctrl
使用するつもりがなくても、ソースを調べることで興味深いトリックが見つかるかもしれません。
ウィンドウを作成したクライアントの pid によってのみ認識されるウィンドウを移動するタスクは、いくつかの理由で最も簡単なタスクではない場合があります。
X Windows の哲学では、画面上にウィンドウを配置するのはウィンドウ マネージャの仕事であるため、まず最初にこれを行うべきではありません。
EWM 仕様としてのICCCM ( http://de.wikipedia.org/wiki/Inter-Client_Communication_Conventions_Manualを参照) ( http://standards.freedesktop.org/wm-spec/wm-spec-latest.htmlを参照) )サイズ変更などを独自に移動しようとするクライアントを強く思いとどまらせます。ほとんどの場合、別のクライアントが「所有」しているウィンドウを移動することは、さらに大きな悪と見なされる可能性があります。
直面する可能性のある 2 番目の問題は、X 11 プロトコルには pid の概念がないことです。
ネットワーク経由で使用するように設計されているため、現在目の前に座っているマシンと同じマシンでプログラムが実行されることを実際に確認することはできません. そのため、pid のようなものにはあまり意味がありません。異なるマシンで実行されている場合、同じ X サーバー上でウィンドウを表示する同一の pid を持つクライアントが偶然に多数存在する可能性があるからです。
幸いなことに、EWMH 仕様では、ウィンドウを作成したクライアントの pid を最上位ウィンドウの_NET_WM_PIDプロパティに設定することをクライアントに推奨しているため、それほど悪いことではありません。
繰り返しになりますが、X サーバーは EWMH 仕様への準拠を強制するものではないため、ほぼすべてのクライアントが EWMH 仕様を設定する可能性がありますが、特定の pid に属するウィンドウが見つかる保証はまだありません。
ここまで述べてきたすべての点はかなり限定的に見えるかもしれませんが、実際にはおそらくその逆です。実際には、X セッションで実行されている他のクライアントを完全に台無しにするのは比較的簡単ですが、X ワードで善良な市民になる方法に関する一連のルール全体が導入されました。
X11 プロトコル自体はネットワーク プロトコルであるため (ローカルで実行されているクライアントは、おそらく UNIX ドメイン ソケットを介して X サーバーと通信するため、100% 真実ではありません)、X サーバーと通信するために必要な特定のライブラリはありません。
あなたの質問で述べたように、C について話すと、Xlibは長い間広く使用されている唯一の実装でしたが、xcbと呼ばれる別のバインディングもあります。Xlib と比較して API がわずかに変更されています。
Xlib といえば、今まで xcb を使用したことがないので、あまり詳しくは言えませんが、次の方法が役立つかもしれません。
XListProperties - 探している値で _NET_WM_PID プロパティを検索します
XConfigureWindow、XMoveWindow、XResizeWindow、... - やりたいことを最終的に実行します。
上記のすべての機能は、マニュアル ページに記載する必要があります。man XOpenDisplay
たとえば、使用してください。
ああ、X Window の世界についてさらに調べるために、自由に使える他のすべてのツールについて必ず学んでください。を実行し、 1 つの (!) ウィンドウのみの出力で、xlsatoms
どのxwininfo
レポートがリストを取得するかを確認します。丁寧に尋ねると、xprop
何が起こるかを確認するために自分で設定してみてください。xprop