web-dev-qa-db-ja.com

他のウィンドウと比較して、Z軸に関してウィンドウがどこにあるかを教えてくれるLinuxコマンドは何ですか?

いくつかのLinuxコマンドにxpropまたはwmctrlなどで取得したウィンドウIDを与えて、そのウィンドウが現在「z方向」のスタック順序のどこにあるかを教えてもらいたいと思っています。

たとえば、ウィンドウCがウィンドウBの背後にある場合(BがCをクリッピングしている場合など、ウィンドウが互いにオーバーラップしている場合)、ウィンドウAが両方の前にある場合、いくつかのコマンドで0のようなウィンドウが表示されます。 A、Bの場合は1、Cの場合は2。おそらく「前」の数字は「後ろ」の数字よりも大きいでしょう。それは私にとって重要ではありません。

3
Duncan Marshall

あなたが探しているのはウィンドウではありませんpropertyですが、Xがウィンドウを表示する方法の副作用です。 XRaiseWindowの詳細を検索するとXRestackWindowsになり、ウィンドウのリストが並べ替えられていることがわかります(Xサーバーの順序が変更されている場合表示 、見かけ上の重なり順を制御します)。

xwininfo コマンドは、任意のウィンドウの子ウィンドウのリストと、ウィンドウのtreeを返すことができます。これは同じ順序で表示されます( XQueryTree を使用します。その説明では、現在のスタック順序で子が一覧表示されます)、(少しの努力で)それを分析するスクリプトを作成できます。気になるウィンドウに関連付けます(すべてのウィンドウが興味深いわけではありません)。

ウィンドウIDはそれほど有用ではありませんが、それらをxpropのパラメーターとして使用して、対応するウィンドウタイトルを見つけることができます。すべてのウィンドウにタイトルがあるわけではなく、途中で説明すべきいくつかの癖があります。

(このソリューションはbash固有でもLinux固有でもないため、両方よりも前のものです)。

[〜#〜] ewmh [〜#〜]_NET_CLIENT_LIST

_NET_CLIENT_LIST, WINDOW[]/32
_NET_CLIENT_LIST_STACKING, WINDOW[]/32

これらのアレイには、ウィンドウマネージャーによって管理されるすべてのXウィンドウが含まれています。 _NET_CLIENT_LISTには、最も古いウィンドウから始まる最初のマッピング順序があります。 _NET_CLIENT_LIST_STACKINGのスタック順序は下から上です。これらのプロパティは、ウィンドウマネージャによって設定および更新される必要があります。

簡単なチェックで、それは探求する癖を示しています。

$ xprop -root
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x400023
_NET_CLIENT_LIST(WINDOW): window id # 0x400023, 0xc00018, 0xa0000a
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0xa0000a, 0xc00018, 0x400023, 0xc00018
_NET_SUPPORTED(ATOM) = _NET_ACTIVE_WINDOW, _NET_CLIENT_LIST, _NET_CLIENT_LIST_STACKING, _NET_CLOSE_WINDOW, _NET_SUPPORTED, _NET_SUPPORTING_WM_CHECK, _NET_WM_ACTION_CLOSE, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_SHADE, _NET_WM_ALLOWED_ACTIONS, _NET_WM_NAME, _NET_WM_STATE, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_HIDDEN, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MODAL, _NET_WM_STATE_SHADED, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_STICKY, _NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_COMBO, _NET_WM_WINDOW_TYPE_DESKTOP, _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_WINDOW_TYPE_DND, _NET_WM_WINDOW_TYPE_DOCK, _NET_WM_WINDOW_TYPE_DROPDOWN_MENU, _NET_WM_WINDOW_TYPE_MENU, _NET_WM_WINDOW_TYPE_NORMAL, _NET_WM_WINDOW_TYPE_NOTIFICATION, _NET_WM_WINDOW_TYPE_POPUP_MENU, _NET_WM_WINDOW_TYPE_SPLASH, _NET_WM_WINDOW_TYPE_TOOLBAR, _NET_WM_WINDOW_TYPE_TOOLTIP, _NET_WM_WINDOW_TYPE_UTILITY
_NET_SUPPORTING_WM_CHECK(WINDOW): window id # 0x800001
_XKB_RULES_NAMES(STRING) = "base", "empty", "empty", "", ""
_NATIVE_SCREEN_Origin(INTEGER) = 0, 22

私は3つのウィンドウを持っており、スタッキングは1つを2回リストします。また、which windowは可視クライアントの親です。使用しているウィンドウマネージャーによって異なります。

そしてもちろん、[〜#〜] ewmh [〜#〜]に従わないウィンドウマネージャーがまだあります。 [〜#〜] ewmh [〜#〜]内でも、 "SHOULD" 。成功を保証するものではありません。

もちろん、比較のために:

$ xwininfo -root -children

xwininfo: Window id: 0x111 (the root window) (has no name)

  Root window id: 0x111 (the root window) (has no name)
  Parent window id: 0x0 (none)
     7 children:
     0x80000a (has no name): ()  806x853+0+1  +0+1
     0x40007d (has no name): ()  225x401+183+45  +183+45
     0x40007c (has no name): ()  295x464+101+45  +101+45
     0x800010 (has no name): ()  164x186+1113+5  +1113+5
     0x80000d (has no name): ()  246x159+950+0  +950+0
     0x800001 (has no name): ()  1x1+0+0  +0+0
     0x600001 (has no name): ()  1x1+0+0  +0+0
3
Thomas Dickey

私が この答え で見つけた解決策は機能し、Xベースのディストリビューションで機能すると信じています:

xprop -root | grep '_NET_CLIENT_LIST_STACKING(WINDOW)'

私のシステムでの結果は:

_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x3800003, 0x380000b, 0x58000fa, 0x5800006, 0x4a00d48

IDは、左から右にzオーダーで並べられています。そこから、必要に応じて情報を使用することは簡単です。

xpropのインストールが必要な場合があります。

1
Duncan Marshall