我希望为某些 Linux 命令提供一个通过xprop
或wmctrl
或类似方法获得的窗口 ID,并告诉我该窗口当前在“z-wards”堆叠顺序中的位置。
例如,如果窗口 C 在视觉上位于窗口 B 后面(如 B 中的剪辑 C,如果它们彼此重叠),并且窗口 A 在它们的前面,则某个命令会告诉我类似0
窗口 A、1
B 的信息,对于2
C,也许“前面”的数字比“后面”的数字大;这对我来说不重要。
答案1
你要找的不是窗户财产但 X 显示窗口方式的副作用。查找XRaiseWindow
有关线索的详细信息XRestackWindows
,并发现它重新排序了窗口列表(假设它更改了 X 服务器的顺序)显示它们控制明显的堆叠顺序)。
这xwininfo
命令可以返回任何窗口的子窗口列表,以及树的窗户。它以相同的顺序呈现(它使用XQueryTree
,其描述表明它按当前堆叠顺序列出了子级),您可以(通过一些努力)制作一个脚本来分析它并将其与您关心的窗口相关联(并非所有窗口都有趣)。
窗口 ID 没有那么有用,但您可以使用它们作为参数来xprop
查找对应的窗口标题。并非所有窗口都有标题,并且在此过程中需要考虑一些怪癖。
(该解决方案既不是 bash 特定的,也不是 linux 特定的,并且早于这两者)。
有人提到欧洲WMH的_NET_CLIENT_LIST
:
_NET_CLIENT_LIST, WINDOW[]/32
_NET_CLIENT_LIST_STACKING, WINDOW[]/32
这些数组包含由窗口管理器管理的所有 X Windows。
_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 个窗口,并且堆叠列表一两次。还,哪个window 是可见客户端的父级,可以根据使用的窗口管理器而有所不同。
当然,仍然有一些窗口管理器不遵循欧洲WMH。即使在欧洲WMH,你必须欣赏这一点“应该”。它并不能保证成功。
当然,为了比较:
$ 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
答案2
我找到的解决方案这个答案有效,并且我相信可以与任何基于 X 的发行版一起使用:
xprop -root | grep '_NET_CLIENT_LIST_STACKING(WINDOW)'
我的系统上的结果是:
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x3800003, 0x380000b, 0x58000fa, 0x5800006, 0x4a00d48
ID 按 z 顺序从左到右排序。从那里开始,按照自己的意愿使用这些信息就变得很简单了。
xprop
可能需要安装。