いくつかのLinuxコマンドにxprop
またはwmctrl
などで取得したウィンドウIDを与えて、そのウィンドウが現在「z方向」のスタック順序のどこにあるかを教えてもらいたいと思っています。
たとえば、ウィンドウCがウィンドウBの背後にある場合(BがCをクリッピングしている場合など、ウィンドウが互いにオーバーラップしている場合)、ウィンドウAが両方の前にある場合、いくつかのコマンドで0
のようなウィンドウが表示されます。 A、Bの場合は1
、Cの場合は2
。おそらく「前」の数字は「後ろ」の数字よりも大きいでしょう。それは私にとって重要ではありません。
あなたが探しているのはウィンドウではありません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
私が この答え で見つけた解決策は機能し、Xベースのディストリビューションで機能すると信じています:
xprop -root | grep '_NET_CLIENT_LIST_STACKING(WINDOW)'
私のシステムでの結果は:
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x3800003, 0x380000b, 0x58000fa, 0x5800006, 0x4a00d48
IDは、左から右にzオーダーで並べられています。そこから、必要に応じて情報を使用することは簡単です。
xprop
のインストールが必要な場合があります。