Xlib。 XGrabButtonがクリックを消費しないようにするには?

Xlib。 XGrabButtonがクリックを消費しないようにするには?

最初の質問です。ここで要件を見落とした場合は、ご容赦ください。

Arch Linux用のウィンドウマネージャを作成しようとしています。現在のウィンドウをマップする前にキャッチイベントを追加します。

私は以下を持っています:

XGrabButton(display, Button1, 0, window, false, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);

Button1 を押すと、次のコマンドを実行します。

XRaiseWindow(display, frame);

今問題は、ウィンドウで何もクリックできないことです。 ButtonPressed コールバック関数のみ実行中です。 (1)ウィンドウがButtonPressイベントも受信していることを確認し、(2)ウィンドウが現在のトップレベルウィンドウでない場合にのみXRaiseWindow関数を実行するにはどうすればよいですか(ここではstack_modeを使用できるとします)。

ベストアンサー1

Arch Linux用のウィンドウマネージャを作成しようとしています。

これはかなり大きなプロジェクトです。あなたの立場では、まず既存のウィンドウマネージャのコードを見てみましょう。

現在のウィンドウをマップする前にキャッチイベントを追加します。

IIRC、それは彼らがすることではありません。代わりに「リダイレクト」を介してイベントを登録しますSubstructureRedirectMask。たとえば、次のように見てください。これ記事シリーズ。

今問題は、ウィンドウで何もクリックできないことです。

はい、ボタンイベントをキャッチしたので、すべてのボタンイベントがウィンドウの代わりにウィンドウマネージャに渡されます(これがウィンドウマネージャが通常キャッチを実行しない理由です)。これに固執する場合(そうではありません)、各ボタンイベントをウィンドウに渡す必要があるかどうかを判断し、キャッチをキャンセルし、2番目の合成イベントを生成してから、渡す必要がある各ボタンをもう一度キャッチする必要があります。窓口イベントに渡されます。これはあまり愚かなアプローチではありません。

ウィンドウが現在のトップレベルウィンドウでない場合にのみ、XRaiseWindow関数を実行してください。

それでは、これはフォーカス戦略(「クリックして上げる」)に関連していますか?実際にこれがどのように実装されているのかよくわかりません。上記のように、既存のウィンドウマネージャのコードを読んで調べました。 X自体で構成することもできます。

おすすめ記事