什么 Linux 命令可以告诉我一个窗口相对于其他窗口在 Z 轴上的位置?

什么 Linux 命令可以告诉我一个窗口相对于其他窗口在 Z 轴上的位置?

我希望为某些 Linux 命令提供一个通过xpropwmctrl或类似方法获得的窗口 ID,并告诉我该窗口当前在“z-wards”堆叠顺序中的位置。

例如,如果窗口 C 在视觉上位于窗口 B 后面(如 B 中的剪辑 C,如果它们彼此重叠),并且窗口 A 在它们的前面,则某个命令会告诉我类似0窗口 A、1B 的信息,对于2C,也许“前面”的数字比“后面”的数字大;这对我来说不重要。

答案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可能需要安装。

相关内容