wmctrl window move 명령에서 편차를 일으키는 원인


13

wmctrl 정보

wmctrl(기본적으로 설치되지 않음)을 사용하면 창, 해당 ID, 지오메트리 및 해당 pid 등에 대한 정보를 얻을 수 있습니다. 또한 여러 명령으로 창을 이동 하거나 크기를 조정할 수도 있습니다 . 그러나 어떤 측면에서는 그 행동이 논리적이지 않은 것으로 보입니다. 내 질문은 다음과 같이 창을 이동 하는 것입니다 wmctrl.

정보 얻기

명령을 실행할 때 :

wmctrl -lG

아래 그림의 창에 대한 다음 정보를 얻습니다 (ao).

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit

3-5 열에서 지오메트리 정보는 x / y 좌표와 너비 / 높이를 알려줍니다.

창 이동 / 크기 조정

이 좌표를 wmctrl명령에 넣어 창 을 이동 / 크기 조정 하면 좌표가 변경되지 않으므로 아무것도 수행하지 않아야합니다.

wmctrl -ir 0x04200085 -e 0,746,443,468,205

일탈

그러나 아래 그림은 창이 아래쪽으로 움직 였다는 것을 보여줍니다 (정확히 28px). 그 이유는 작업 영역 (화면에서 패널 높이를 뺀 값)으로 wmctrl 창 이동 명령이 계산 되었지만 명령이 총 화면 크기로 계산 되었기 때문이라고 가정했습니다 . 그러나 여전히 4px는 설명 할 수 없습니다 (패널은 24px입니다).wmctrl -lG

스크립트에서 편차를 매우 잘 보상 할 수 있지만 원인을 이해하지 못한다는 사실은 만족스럽지 않으므로 질문은 다음과 같습니다.

이 편차의 원인은 정확히 무엇입니까?


출력에서 정확한 좌표로 창을 이동하면 창을 이동 wmctrl -lG해서는 안되지만

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


내 "퍼지"솔루션은 현재 좌표를 저장하고 해당 좌표로 이동하여 새 좌표를 얻고 저장된 좌표를 빼서 차이를 얻는 것입니다. 그런 다음 원래 좌표에 차이를 적용하고 조정 된 좌표로 이동하십시오. 소리보다 쉽습니다.
WinEunuuchs2Unix

답변:


18

무슨 일이 일어나고 있는지 wmctrl은 장식 내부의 창의 지오메트리를 반환하지만 (제목 표시 줄과 테두리는 포함하지 않음) 이동을 위해 더 큰 창 위치를 사용하고 있습니다.

(일부 명령 출력 라인 제거 : xdotool설치되지 않았을 수 있음)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

다음 명령은 관심있는 창을 프롬프트하고 모든 장식을 포함하고 사용중인 창 테마에 따라 다른 상위 창을 리턴합니다.

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

보시다시피, 다른 창입니다. X 위치는 왼쪽에서 2px (702-2)로 시작하고 오른쪽 테두리도 2px이므로 총 너비가 4px (900 + 2 + 2) 더 큽니다. Y가 더 높습니다 (상단 경계가있는 경우 상단 제목 표시 줄 위). 높이와 하단 테두리로 인해 높이가 더 큽니다.

wmctrl은 부모 창을 자식 창의 원하는 [X, Y] 위치로 이동합니다. 아래 "전후"에 표시된 것처럼 너비와 높이가 자녀에게 올바르게 적용됩니다.

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child

편집 : 추가 정보.

데스크탑 지오메트리, 뷰포트 및 작업 영역

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
$ xdotool -v
xdotool version 3.20140217.1

https://github.com/jordansissel/xdotool

다시 : 댓글 @ 스니커 팁

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4

이것은 훌륭한 답변처럼 보입니다! 오늘 밤 세부 정보를 살펴 보겠습니다.
Jacob Vlijm

내 이해를 위해 xdotool selectwindowis 의 출력은 25166060있지만 도달하는 단계는 무엇 0x18000ec입니까? 16 진수에서 변환을 시도했지만 그렇지 않은 것 같습니다.
Jacob Vlijm

의 출력 xdotool getwindowgeometry 0x18000ec은 10 진수 창 ID 25166060 (부모) 을 반환합니다. 방금 0x18000ec의 16 진수 값을 입력하여 0x04000040 (자식)이 아님을 보여줍니다. 그건 그렇고, 나는 당신이 보지 않기를 바라면서 더 쉬운 숫자로 전체 테스트를 다시 실행했습니다. 중간에 있다면 이전 수정 버전을 참조하십시오.
Daxx

2
@JacobVlijm, xprop장식 패딩을 보여주는 것 같습니다 : _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. 확인하는 데 도움이 될 수 있습니다.
user.dz

xdotool selectwindowKDE와 Unity 에서 명령이 다르게 동작 할 수 있습니까? xdotool selectwindow명령 의 출력은 정확히 동일한 창 (-id)을 참조하고 (따라서) xdotool getwindowgeometry와 동일한 데이터를 출력합니다 wmctrl -lG. xprop명령하지만, @Sneetsher 쇼에 의해 제안 _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0내가 수동으로 측정하고, 답의 본질이 정확한지 증명하고, 내 질문에 대한 완벽한 해답 정확히 것입니다. 당신의 철저함에 깊은 인상을 받았습니다. 감사!
Jacob Vlijm

0

나는 같은 문제가 있었고 해결 방법을 찾을 수있었습니다.


상태

내 상황은 Compiz가 설치된 Mate 16.04를 기반으로합니다 (gtk 창 관리자 활성화).

키 바인딩에 연결된 스크립트를 사용하여 미리 정의 된 장소에 창을 배치하고 있습니다. 최대화 된 옵션을 사용하지 않으면이 스크립트가 실패합니다.


분석

설정 (compiz)에서 창 장식을 켜거나 켜서 문제를 켜거나 끌 수 있습니다.


해결 방법

특정 창에 파이썬을 사용하여 창 장식을 켜거나 끌 수 있습니다 (키 바인딩을 사용하면 활성 창을 사용하는 것이 편리합니다).

#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys

w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()

그런 다음 창 장식을 끄고 창을 이동 한 다음 창 장식을 켤 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.