Điều gì gây ra độ lệch trong lệnh di chuyển cửa sổ wmctrl


13

Giới thiệu về wmctrl

Với wmctrl(không được cài đặt theo mặc định), chúng ta có thể lấy thông tin trên các cửa sổ, id của chúng, hình học của chúng, pid chúng thuộc về v.v. Chúng ta cũng có thể di chuyển hoặc thay đổi kích thước các cửa sổ bằng một số lệnh. Tuy nhiên, ở một số khía cạnh, hành vi của nó có vẻ không logic. Câu hỏi của tôi là về việc di chuyển các cửa sổ bằng cách wmctrl:

Lấy thông tin

Khi tôi chạy lệnh:

wmctrl -lG

Tôi nhận được (ao) các thông tin sau về cửa sổ trong ảnh bên dưới:

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

Trong cột 3-5, thông tin hình học cho chúng ta biết tọa độ x / y và chiều rộng / chiều cao.

Di chuyển / thay đổi kích thước cửa sổ

Khi tôi đặt các tọa độ này trong wmctrllệnh để di chuyển / thay đổi kích thước cửa sổ, nó sẽ không làm gì cả, vì tọa độ không thay đổi:

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

Độ lệch

Tuy nhiên, các hình ảnh dưới đây cho thấy cửa sổ được di chuyển xuống dưới (chính xác là 28px). Tôi giả sử lý do là lệnh wmctrl di chuyển cửa sổ được tính toán với vùng làm việc (màn hình trừ chiều cao bảng điều khiển), trong khi wmctrl -lGlệnh được tính với tổng kích thước màn hình . Tuy nhiên, 4px vẫn không giải thích được (bảng điều khiển cao 24px).

Mặc dù độ lệch rất có thể được bù trong các tập lệnh, nhưng thực tế là tôi không hiểu nguyên nhân là không thỏa mãn, vì vậy câu hỏi là:

Chính xác nguyên nhân của sự sai lệch này là gì?


Di chuyển một cửa sổ có tọa độ chính xác trong đầu ra wmctrl -lGkhông nên di chuyển cửa sổ, nhưng nó không

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Giải pháp "mập mờ" của tôi là lưu tọa độ hiện tại, di chuyển đến các tọa độ đó, lấy tọa độ mới, trừ các tọa độ đã lưu để có được sự khác biệt. Sau đó áp dụng các khác biệt cho tọa độ ban đầu và di chuyển đến tọa độ điều chỉnh. Nó dễ hơn âm thanh.
WinEunuuchs2Unix

Câu trả lời:


18

Điều đang xảy ra là wmctrl đang trả về hình dạng của cửa sổ bên trong các vật trang trí (nghĩa là không bao gồm thanh tiêu đề và đường viền) nhưng đang sử dụng vị trí cửa sổ lớn hơn để di chuyển.

(Một số dòng đầu ra lệnh bị xóa: xdotoolcó thể không được cài đặt)

$ 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

Lệnh tiếp theo nhắc nhở cho cửa sổ quan tâm và trả về cửa sổ cha bao gồm tất cả các trang trí và thay đổi tùy thuộc vào chủ đề cửa sổ đang sử dụng.

$ xdotool selectwindow
25166060

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

Như bạn có thể thấy, đó là một cửa sổ khác; vị trí X bắt đầu 2px ở bên trái (702-2) và tổng chiều rộng lớn hơn 4px (900 + 2 + 2) vì đường viền bên phải cũng là 2px. Y cao hơn (phía trên đường viền trên cùng, nếu có và thanh tiêu đề); chiều cao lớn hơn vì tất cả điều đó cộng với đường viền dưới cùng.

wmctrl di chuyển cửa sổ cha đến vị trí [X, Y] mong muốn của cửa sổ con; chiều rộng và chiều cao được áp dụng chính xác cho trẻ, như thể hiện trong "trước & sau" bên dưới.

$ 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

Chỉnh sửa: thông tin bổ sung.

Hình học máy tính để bàn, Viewport & Workarea

$ 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

Re: @Sneetsher tip trong bình luận

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

Đây trông giống như một câu trả lời tuyệt vời! Tôi sẽ xem xét chi tiết của nó tối nay.
Jacob Vlijm

theo hiểu biết của tôi, đầu ra xdotool selectwindow25166060, nhưng bước để đi đến là 0x18000ecgì? Tôi đã thử chuyển đổi từ thập lục phân, nhưng dường như không phải vậy.
Jacob Vlijm

Đầu ra từ xdotool getwindowgeometry 0x18000ectrả về ID cửa sổ thập phân 25166060 (cha). Tôi chỉ nhập giá trị hex của 0x18000ec để cho thấy rằng đó không phải là 0x04000040 (con). Nhân tiện, tôi vừa chạy lại toàn bộ bài kiểm tra với những con số dễ dàng hơn với hy vọng bạn không tìm kiếm. Xem sửa đổi chỉnh sửa trước đó nếu bạn đang ở giữa một cái gì đó.
Daxx

2
@JacobVlijm, xpropdường như hiển thị phần đệm trang trí: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Nó có thể giúp kiểm tra.
user.dz

Có thể là xdotool selectwindowlệnh hành xử khác nhau trên KDE và Unity? Đầu ra của xdotool selectwindowlệnh tham chiếu chính xác cùng một cửa sổ (-id) và (do đó) xdotool getwindowgeometryxuất ra cùng một dữ liệu như wmctrl -lG. Các xproplệnh tuy nhiên, theo đề nghị của các chương trình @Sneetsher _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, đó là chính xác những gì tôi đo bằng tay, và chứng tỏ bản chất của câu trả lời của bạn là đúng, và nó là câu trả lời hoàn hảo cho câu hỏi của tôi. Tôi ấn tượng bởi sự kỹ lưỡng của bạn. Cảm ơn!
Jacob Vlijm

0

Tôi đã có cùng một vấn đề và có thể tìm thấy một cách giải quyết.


Tình hình

Tình huống của tôi dựa trên Mate 16.04 với Compiz được cài đặt (kích hoạt trình quản lý cửa sổ gtk)

Tôi đang sử dụng một tập lệnh được kết nối với các ràng buộc khóa để đặt các cửa sổ vào các vị trí được xác định trước. Kịch bản này thất bại nếu tôi không sử dụng tùy chọn tối đa hóa.


Phân tích

Vấn đề có thể được bật và tắt bằng cách bật và trang trí cửa sổ trong cài đặt (compiz).


Giải pháp thay thế

Các trang trí cửa sổ có thể được bật và tắt bằng python cho một cửa sổ cụ thể (sử dụng keybindings để thuận tiện cho việc sử dụng cửa sổ hoạt động).

#!/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()

Sau đó, bạn có thể tắt trang trí cửa sổ, di chuyển cửa sổ và bật trang trí cửa sổ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.