Làm thế nào để tôi tìm thấy kích thước cửa sổ và vị trí chính xác bao gồm cả trang trí?


37

Tôi đã cố gắng tìm ra kích thước của một cửa sổ để sử dụng trong một tập lệnh nhỏ. Kỹ thuật hiện tại của tôi đang sử dụng wmctrl -lGđể tìm hiểu các kích thước. Tuy nhiên, vấn đề là đây:

Các hình x và y mà nó đưa ra là ở phía trên bên trái của trang trí cửa sổ, trong khi chiều cao và chiều rộng chỉ dành cho khu vực nội dung. Điều này có nghĩa là nếu các trang trí cửa sổ thêm 20px chiều cao và 2px chiều rộng, wmctrl sẽ báo cáo một cửa sổ là 640x480, ngay cả khi nó chiếm 660x482 trên màn hình. Đây là một vấn đề vì bước tiếp theo của tập lệnh của tôi sẽ là sử dụng khu vực đó để báo cho ffmpeg ghi lại màn hình. Tôi muốn tránh mã hóa kích thước của các trang trí cửa sổ từ thiết lập hiện tại của tôi.

Những gì phù hợp là một phương pháp để có được kích thước của các trang trí cửa sổ để tôi có thể sử dụng chúng để tìm ra vị trí của khu vực nội dung 640x480, hoặc một cách để có được vị trí của khu vực nội dung trực tiếp, không phải là trang trí cửa sổ .


1
Tôi trộn lẫn chiều cao và chiều rộng trong các hình cho sơ đồ.
Macha

Liên kết hình ảnh chết.
Ciro Santilli 心 心

câu hỏi gần gũi nhưng cũng hỏi những điều khác: superuser.com/questions/164047/ từ
Ciro Santilli 改造 心 心 事件

Câu trả lời:


36

Kịch bản sau đây sẽ cung cấp cho bạn các đồng quỹ màn hình trên cùng bên trái và kích thước của cửa sổ (không có bất kỳ trang trí nào). . . . xwininfo -id $(xdotool getactivewindow)chứa đủ thông tin cho bạn


#!/bin/bash
# Get the coordinates of the active window's
#    top-left corner, and the window's size.
#    This excludes the window decoration.
  unset x y w h
  eval $(xwininfo -id $(xdotool getactivewindow) |
    sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
           -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
           -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
           -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
  echo -n "$x $y $w $h"
#

Điều này dường như hoạt động vì xdotool getactivewindowtrả về id cửa sổ của khung quản lý cửa sổ (bao gồm trang trí) thay vì cửa sổ máy khách chứa bên trong nó.
Adam Spiers

2
Không, điều này trả về hình học mà không có trang trí, rõ ràng không phải là những gì câu hỏi. Nếu bạn không muốn trang trí đi kèm, có nhiều cách dễ dàng hơn để làm điều đó, ví dụxdotool getactivewindow getwindowgeometry
slinkp 27/1/2016

1
Điều này không hoạt động tốt đối với tôi (tức là không bao gồm trang trí). Đây trả lời là tốt hơn.
Jan Warchoł

7

Câu trả lời được chấp nhận có thể được mở rộng để có được toàn bộ cửa sổ:

entire=false
x=0
y=0
w=0
h=0
b=0  # b for border
t=0  # t for title (or top)

# ... find out what user wants then 

eval $(xwininfo -id $(xdotool getactivewindow) |
  sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
         -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
         -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
         -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" \
         -e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=\1/p" \
         -e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=\1/p" )
if [ "$entire" = true ]
then                     # if user wanted entire window, adjust x,y,w and h
    let x=$x-$b
    let y=$y-$t
    let w=$w+2*$b
    let h=$h+$t+$b
fi
echo "$w"x"$h" $x,$y

Mặc dù dễ, nhưng hóa ra nó không hoạt động trên Unity trong Ubuntu 14.04 vì thông tin tương đối là tất cả 0. Tôi đã hỏi Lấy kích thước cửa sổ đầy đủ (bao gồm cả trang trí) trong Unity và nhận được câu trả lời tốt. Đây là cách tôi sử dụng câu trả lời:

aw=$(xdotool getactivewindow)
eval $(xwininfo -id "$aw" |
      sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
             -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
             -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
             -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
if [ "$entire" = true ]
then
    extents=$(xprop _NET_FRAME_EXTENTS -id "$aw" | grep "NET_FRAME_EXTENTS" | cut -d '=' -f 2 | tr -d ' ')
    bl=$(echo $extents | cut -d ',' -f 1) # width of left border
    br=$(echo $extents | cut -d ',' -f 2) # width of right border
    t=$(echo $extents | cut -d ',' -f 3)  # height of title bar
    bb=$(echo $extents | cut -d ',' -f 4) # height of bottom border

    let x=$x-$bl
    let y=$y-$t
    let w=$w+$bl+$br
    let h=$h+$t+$bb
fi

Phương thức thứ hai này hoạt động trong cả Unity và Xfce và cũng hoạt động trong Gnome.


Cách tiếp cận hàng đầu là sai ngay cả bên ngoài Unity trên Ubuntu vì nó giả sử các đường viền bên trái, phải và dưới cùng có cùng chiều rộng và không có gì đảm bảo điều này. Cách tiếp cận thứ hai có vẻ tốt hơn.
Adam Spiers

Tôi vừa kiểm tra cách tiếp cận thứ hai - nó chỉ cần aw=`xdotool getactivewindow`thêm vào đầu để tránh bị treo trong cuộc gọi xwininfo. Điều này thật tuyệt khi biết vì tôi đang cân nhắc chuyển sang Unity, nơi tôi không thể chạy wmiface mà không bị phân tách.
nháy mắt

@slinkp, cảm ơn bạn đã chỉ ra awđịnh nghĩa còn thiếu . Tôi sẽ chỉnh sửa câu trả lời ngay bây giờ để thêm dòng đó.
Colin Keenan

Phần thứ hai của công trình này tuyệt vời! Chỉ thay đổi tôi phải thực hiện trong Gnome 3 là không thêm chiều cao thanh tiêu đề vào h. Có vẻ như thanh tiêu đề đã được bao gồm trong chiều cao trở lại từ xwininfo.
Jonny Asmar

6

Cách đơn giản hơn nhiều để có được kích thước và vị trí cửa sổ:

xdotool getwindowfocus getwindowgeometry

3

Câu trả lời được chấp nhận rõ ràng không bao gồm trang trí cửa sổ. Đối với những người vẫn đang tìm cách lấy hình học bao gồm tất cả các trang trí, theo tiêu đề của câu hỏi này, bạn có thể sử dụng wmiface theo câu hỏi khác này https://superuser.com/questions/164047/how-to-get-accur-window -in information-kích thước-etc-in-linux-x . Thí dụ:

wmiface frameGeometry `wmiface activeWindow`

Điều này trả về hình học và vị trí liên quan đến trên cùng bên trái như vậy:

650x437+0+1003

wmiface dường như không đi kèm với tất cả các bản phân phối linux (Tôi không tìm thấy gói cung cấp nó trên Mint hoặc Ubuntu) nhưng tôi đã có thể cài đặt nó từ các gói ở đây: http://kde-apps.org/content/show .php? nội dung = 40425

Và nó không có tài liệu hay thậm chí --help, nhưng README có ở đây:

https://gitorious.org/wmiface/wmiface/source/ea941eeb2076124734f6a3d3079326c826b462d7:README


Xin lỗi - Tôi rất tiếc về upvote của mình vì điều này vì câu trả lời được chấp nhận không bao gồm trang trí cửa sổ theo nhận xét của tôi về nó.
Adam Spiers

Tôi ước điều đó là đúng, nhưng thật không may, nhận xét đó là sai. Họ đồng ý về id cửa sổ hoạt động: $ wmiface activeWindow 6291772 $ xdotool getactivewindow 6291772 Nhưng họ không đồng ý về hình học và tôi có thể xác nhận với ví dụ. sàng lọc mà wmiface bao gồm trang trí cửa sổ và xdotool thì không. Hãy thử nó cho chính mình. $ wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindowWindow 6291772 Vị trí: 878,77 (màn hình: 0) Hình học: 562x407
slinkp 27/1/2016

xin lỗi, hy vọng bạn có thể giải đố những gì tôi muốn nói ở đó ... mong muốn stackoverflow sẽ cho phép các mẫu mã khối trong các bình luận.
nháy mắt

3

Sử dụng xdotool:

  • Đầu tiên bạn cần lấy id cửa sổ:

sleep 3s && xdotool getactivewindow, bạn có 3 giây để mở cửa sổ

  • Sau đó, bạn cần sử dụng:
    1. để có được thông tin trong đầu ra, hãy sử dụng cái này: xdotool getwindowgeometry $WINDOW_ID
    2. hoặc nếu bạn muốn tham số shell sử dụng điều này: xdotool getwindowgeometry -shell $WINDOW_ID

0

Kết hợp câu trả lời trên trang này tôi đã sử dụng điều này:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

Window 88080400
  Position: 4565,2345 (screen: 0)
  Geometry: 1186x885

Chạy một lớp lót và sau đó trong vòng 3 giây, nhấp vào cửa sổ bạn muốn vị trí và hình học cho.

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.