다른 창에 상대적인 창의 Z축 위치를 알려줄 수 있는 Linux 명령은 무엇입니까?

다른 창에 상대적인 창의 Z축 위치를 알려줄 수 있는 Linux 명령은 무엇입니까?

xprop일부 Linux 명령에 또는 유사한 방법을 통해 얻은 창 ID를 제공 wmctrl하고 현재 "z-wards" 스택 순서에서 창이 어디에 있는지 알려주고 싶습니다.

예를 들어, 창 C가 시각적으로 창 B 뒤에 있고(B의 클립 C가 서로 겹치는 경우와 같이) 창 A가 창 앞에 있는 경우 명령은 C 에 대해 0창 A, 1B 와 같은 내용을 알려줍니다. 2아마도 "앞" 숫자가 "뒤" 숫자보다 클 수도 있습니다. 그것은 나에게 중요하지 않습니다.

답변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설치가 필요할 수 있습니다.

관련 정보