Xlib。フレームはクライアントウィンドウに送信された入力に応答します。

Xlib。フレームはクライアントウィンドウに送信された入力に応答します。

以下を使用してフレームを作成しています。

frame = XCreateSimpleWindow(display, root, x_window_attributes.x, x_window_attributes.y, x_window_attributes.width, x_window_attributes.height + window_bar_height, border_width, border_color, background_color);
XSelectInput(display, frame, SubstructureRedirectMask | SubstructureNotifyMask);
XAddToSaveSet(display, window);
XReparentWindow(display, window, frame, 0, 20);
XMapWindow(display, frame);

//Map events
XGrabButton(display, Button1, 0, frame, false, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button1, 0, frame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button3, 0, frame, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);

理想的にマッピングされたイベントは、ユーザーがフレームワークと直接対話するときにのみ機能します。ただし、ユーザーがクライアントウィンドウと対話するときにも機能します。つまり、フレームをドラッグする代わりにどこにでもドラッグでき、ウィンドウを移動/サイズ調整します。

どのようにフレームに制限できますか?おそらくSubtstructRedirectMaskがこの問題の原因であると思いましたが、それを削除した後も同じ問題が発生しました。

助けてくれてありがとう!

答え1

この質問は、Xlibのマスキングと入力処理の理解が不足しているために発生します。これを数多くの試行錯誤を通じて学ばなければならなかったので、今、大工の炎が成長し始めるかもしれません。ひげをきれいに保ちたい方のために、次のような回答をいたします。

今マスク(例えばSubtstructureRedirectMask)を心配しないでください。入力を受けなければならないことだけを知っておいてください。

フレームの場合、元の計画は、クライアントウィンドウと同じサイズに一部を加えたフレームを作成し、それをオフセットすることでした。たとえば、クライアントウィンドウの高さが800ピクセルの場合は、フレームの高さを820ピクセルに設定し、クライアントウィンドウを20ピクセルオフセットしてから、タイトルバーに上部20ピクセルを使用します。クライアントウィンドウがフレームの残りの部分への入力をブロックし、公開されている上位20ピクセルのみが応答するようにします*。しかしそうではありません。入力はクライアントウィンドウを介して直接渡され、フレーム全体(タイトルバー領域とクライアントウィンドウ領域)が応答します。

この問題を回避するために、コードを確認して別のウィンドウマネージャとテストしてから、別のタイトルバーウィンドウを作成することにしました。これでwindow、クライアントウィンドウを表す、frameフレーム(親として必要)を表す、タイトルtitlebarバーを表すがあります。

前のコードは次に置き換えられました。

XGrabButton(display, Button1, 0, titlebar, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(display, Button3, 0, titlebar, false, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None);

今、titlebar上記の1つだけがwindow入力の移動に興味があります。フレームとクライアントウィンドウのサイズを変更して移動するためにすべてを補償するために、いくつかの簡単な計算を行いました。

関連情報