ฉันจะค้นหาขนาดและตำแหน่งหน้าต่างอย่างถูกต้องรวมถึงการตกแต่งได้อย่างไร


37

ฉันพยายามหาขนาดของหน้าต่างเพื่อใช้ในสคริปต์ขนาดเล็ก เทคนิคปัจจุบันของฉันใช้wmctrl -lGเพื่อค้นหาขนาด อย่างไรก็ตามปัญหาคือ:

ตัวเลข x และ y ที่ให้ไว้สำหรับด้านบนซ้ายของการตกแต่งหน้าต่างในขณะที่ความสูงและความกว้างใช้สำหรับพื้นที่เนื้อหาเท่านั้น ซึ่งหมายความว่าหากการตกแต่งหน้าต่างเพิ่มความสูง 20px และความกว้าง 2px wmctrl จะรายงานหน้าต่างเป็น 640x480 แม้ว่าจะใช้เวลาถึง 660x482 บนหน้าจอ นี่เป็นปัญหาเนื่องจากขั้นตอนต่อไปของสคริปต์ของฉันคือการใช้พื้นที่นั้นเพื่อบอก ffmpeg เพื่อบันทึกหน้าจอ ฉันต้องการหลีกเลี่ยงการเข้ารหัสในขนาดของการตกแต่งหน้าต่างจากการตั้งค่าปัจจุบันของฉัน

สิ่งที่เหมาะสมกับวิธีการรับขนาดของการตกแต่งหน้าต่างเพื่อให้ฉันสามารถใช้เพื่อหาตำแหน่งของพื้นที่เนื้อหา 640x480 หรือวิธีการรับตำแหน่งของพื้นที่เนื้อหาโดยตรงไม่ใช่ของตกแต่งหน้าต่าง .


1
ฉันผสมความสูงและความกว้างในรูปของแผนภาพ
Macha

ลิงก์รูปภาพที่ตาย
Ciro Santilli 新疆改造中心法轮功六四事件

ปิดคำถาม แต่ถามสิ่งอื่น ๆ ด้วย: superuser.com/questions/164047/…
Ciro Santilli 新疆改造中心中心法轮功六四事件

คำตอบ:


36

สคริปต์ต่อไปนี้จะให้หน้าจอด้านบนซ้ายและพิกัดของหน้าต่าง (ไม่มีการตกแต่งใด ๆ ) . . . xwininfo -id $(xdotool getactivewindow)มีข้อมูลเพียงพอสำหรับคุณ


#!/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"
#

สิ่งนี้ดูเหมือนว่าจะใช้งานได้เพราะxdotool getactivewindowส่งคืนรหัสหน้าต่างของกรอบตัวจัดการหน้าต่าง (ซึ่งรวมถึงการตกแต่ง) แทนที่จะเป็นหน้าต่างไคลเอ็นต์ที่อยู่ภายใน
Adam Spires

2
ไม่นี่จะส่งกลับรูปทรงเรขาคณิตโดยไม่มีการตกแต่งซึ่งไม่ชัดเจนว่าเป็นคำถามที่ถาม หากคุณไม่ต้องการให้มีการตกแต่งรวมถึงมีวิธีที่ง่ายกว่าในการทำเช่นนั้นxdotool getactivewindow getwindowgeometry
slinkp

1
มันใช้งานไม่ได้กับฉัน (ไม่รวมของประดับตกแต่ง) นี้คำตอบจะดีกว่า
Jan Warchoł

7

คำตอบที่ได้รับการยอมรับสามารถขยายเพื่อให้ได้ทั้งหน้าต่าง:

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

แม้ว่าจะง่าย แต่ปรากฏว่าไม่สามารถทำงานกับ Unity ใน Ubuntu 14.04 ได้เพราะข้อมูลสัมพัทธ์คือทั้งหมด 0 ฉันถามรับขนาดหน้าต่างเต็ม (รวมถึงการตกแต่ง) ใน Unityและได้รับคำตอบที่ดี นี่คือวิธีที่ฉันใช้คำตอบนั้น:

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

วิธีที่สองนี้ทำงานได้ทั้ง Unity และ Xfce และควรทำงานใน Gnome ด้วย


วิธีการด้านบนนั้นผิดแม้ภายนอก Unity บน Ubuntu เพราะถือว่าขอบด้านซ้ายขวาและด้านล่างนั้นมีความกว้างเท่ากันและไม่มีการรับประกันใด ๆ วิธีที่สองดูดีกว่า
Adam Spires

ฉันเพิ่งตรวจสอบวิธีการที่สอง - เพียงต้องการaw=`xdotool getactivewindow`เพิ่มขึ้นด้านบนเพื่อหลีกเลี่ยงการแขวนในการโทร xwininfo นี่เป็นเรื่องที่น่ารู้เพราะฉันกำลังพิจารณาเปลี่ยนไปใช้ Unity ซึ่งฉันไม่สามารถเรียกใช้ wmiface ได้โดยไม่ต้องแยกจากกัน
slinkp

@slinkp ขอบคุณที่ชี้ให้เห็นawคำจำกัดความที่ขาดหายไป ฉันจะแก้ไขคำตอบทันทีเพื่อเพิ่มบรรทัดนั้น
โคลินคีแน

ส่วนที่สองของงานนี้ยอดเยี่ยม! เพียงเปลี่ยนผมต้องทำใน Gnome 3 คือการไม่ได้เพิ่มความสูง titlebar hไป ดูเหมือนว่าแถบหัวเรื่องจะรวมอยู่ในความสูงที่กลับมาxwininfoแล้ว
Jonny Asmar

6

วิธีที่ง่ายกว่ามากในการรับขนาดและตำแหน่งของหน้าต่าง:

xdotool getwindowfocus getwindowgeometry

3

คำตอบที่ยอมรับอย่างชัดเจนไม่รวมการตกแต่งหน้าต่าง สำหรับผู้ที่ยังคงมองหาวิธีการได้รับรูปทรงเรขาคณิตรวมทั้งการตกแต่งทั้งหมดตามชื่อของคำถามนี้คุณสามารถใช้wmifaceตามคำถามอื่น ๆ นี้https://superuser.com/questions/164047/how-to-get-accurate-window -information มิติ- ฯลฯ ในลินุกซ์-x ตัวอย่าง:

wmiface frameGeometry `wmiface activeWindow`

สิ่งนี้จะคืนค่าเรขาคณิตและตำแหน่งที่สัมพันธ์กับมุมซ้ายบนดังนี้:

650x437+0+1003

ดูเหมือนว่า wmiface จะไม่มาพร้อมกับ linux distros ทั้งหมด (ฉันไม่พบแพ็คเกจที่ให้ไว้ใน Mint หรือ Ubuntu) แต่ฉันสามารถติดตั้งได้จากแพ็คเกจที่นี่: http://kde-apps.org/content/show .php? content = 40425

และมันมาพร้อมกับเอกสารหรือแม้กระทั่ง--helpแต่ README อยู่ที่นี่:

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


ขออภัย - ฉันเสียใจ upvote ของฉันนี้เพราะคำตอบที่ได้รับการยอมรับไม่รวมถึงการตกแต่งหน้าต่างตามความคิดเห็นของฉันเกี่ยวกับมัน
Adam Spires

ฉันหวังว่าเป็นจริง แต่น่าเสียดายที่ความคิดเห็นนั้นผิด พวกเขาเห็นด้วยเกี่ยวกับ id หน้าต่างที่ใช้งาน: $ wmiface activeWindow 6291772 $ xdotool getactivewindow 6291772 แต่พวกเขาไม่เห็นด้วยกับเรขาคณิตและฉันสามารถยืนยันด้วยเช่น screenruler ที่ wmiface มีการตกแต่งหน้าต่างและ xdotool ไม่ได้ ลองด้วยตัวคุณเอง $ wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindowหน้าต่าง 6291772 ตำแหน่ง: 878,77 (หน้าจอ: 0) เรขาคณิต: 562x407
slinkp

ขออภัยหวังว่าคุณจะสามารถไขปริศนาสิ่งที่ฉันหมายถึงที่นั่น ... หวังว่า stackoverflow จะอนุญาตให้มีตัวอย่างโค้ดบล็อกในความคิดเห็น
slinkp

3

ใช้ xdotool:

  • ก่อนอื่นคุณต้องได้รหัสหน้าต่าง:

sleep 3s && xdotool getactivewindowคุณมี 3 วินาทีในการเปิดหน้าต่างของคุณ

  • จากนั้นคุณต้องใช้:
    1. เพื่อรับข้อมูลในผลลัพธ์ใช้สิ่งนี้: xdotool getwindowgeometry $WINDOW_ID
    2. หรือถ้าคุณต้องการพารามิเตอร์ของเชลล์ใช้สิ่งนี้: xdotool getwindowgeometry -shell $WINDOW_ID

0

การรวมคำตอบในหน้านี้ฉันใช้สิ่งนี้:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

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

เรียกใช้หนึ่งซับแล้วภายใน 3 วินาทีคลิกที่หน้าต่างที่คุณต้องการตำแหน่งและรูปทรงเรขาคณิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.