web-dev-qa-db-ja.com

特定のウィンドウでwmctrlが機能しないのはなぜですか?

francisco@Ubuntu:~$ wmctrl -l
0x02600006  0 Ubuntu Área de trabalho
0x03c00002  0 Ubuntu XdndCollectionWindowImp
0x03c00005  0 Ubuntu unity-launcher
0x03c00008  0 Ubuntu unity-panel
0x03c0000b  0 Ubuntu unity-dash
0x03c0000c  0 Ubuntu Hud
0x046000b3  0 Ubuntu How to make a window aways on top? - Stack Overflow - Mozilla Firefox
0x0520000b  0    N/A Qt Creator
0x05002396  0 Ubuntu francisco@Ubuntu: ~
0x0540000b  0    N/A backlight

マシン名列がN/Aであるウィンドウの場合、wmctrl -r "window name" -b add,aboveのようなwmctrlコマンドを送信できません。どうして? (また、これらのウィンドウがマシン名列に関して異なる理由を私は知りません...)

私の最初の意図は、そのようなコマンドをフレームレスQtアプリケーションであるbacklightウィンドウに送信することでした。ただし、ウィンドウシステムメニューを使用し、「常に上に表示」をチェックすると、ウィンドウが機能します。同じことをするプログラム的な手段が好きです。

2
pepper_chico

間違いなくwmctrlのバグです。
wmctrlコードを掘り下げた後、バグはウィンドウ名文字列を対応するウィンドウID(またはXID)に変換しているようです。 wmctrl -r "window name" -b add,aboveは信頼できません。

回避策として、代わりにXID、つまりwmctrl -i -r window_id -b add,aboveを使用します。あなたの場合、wmctrl -i -r 0x0520000b -b add,aboveは動作するはずです。

ほとんどのウィンドウ管理機能は、Xウィンドウプロパティとして実装されます。コマンド-- xpropによってウィンドウのすべてのプロパティを表示できます。

注:

  1. マシン名列がN/Aであるウィンドウ。マシン名のプロパティはWM_CLIENT_MACHINEです。めったに使用されません。また、一部のGUIツールキットはそれらを実装しない場合があります。
    次のコマンドラインを実行してウィンドウをクリックすると、ウィンドウのマシン名プロパティを表示できます。

    Shell> xprop | grep MACHINE
    
  2. Always On Topに関しては、別のプロパティ値_NET_WM_STATE_ABOVEです。
    自分で確認するには、次のコマンドラインを実行してウィンドウをクリックします

    Shell> xprop | grep _NET_WM_STATE
    
6
sgx1