xdotool: วิธีค้นหาหน้าต่างตามชื่อเรื่องและคลาสที่มีรูปแบบแตกต่างกัน (คล้ายกับ AutoHotkey)


10

xdotool ให้คุณค้นหา windows โดยใช้คำสั่งย่อย search ฉันต้องการค้นหาหน้าต่างที่มีคลาส 'gvim' และหัวเรื่องที่มีคำว่า 'TODO' ฉันจะทำสิ่งนี้ได้อย่างไร

สิ่งที่ฉันได้ลอง:

  • คุณสามารถทำได้xdotool search --name --classแต่ยอมรับเพียงรูปแบบเดียวสำหรับทั้งชื่อและชื่อ
  • xdotool รองรับการโยงคำสั่ง แต่ฉันไม่สามารถหาวิธีที่จะโยงสายการค้นหาสองสาย - สายที่สองก็แทนที่สายแรก

xdotoolห่วย ... นี่เป็นการดำเนินการที่ง่ายและไม่มีวิธีที่จะทำได้อย่างหรูหรา
Yan King Yin

คำตอบ:


13

xdotool ของฉันช่วยบอกฉันว่าสวิตช์ทั้งสองของคุณเหมือนกัน (xdotool เวอร์ชั่น 3.20150503.1)

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

และเช่นนี้ไม่ได้ทำอะไรเลย xdotool ของฉันทำเช่นเดียวกับคุณด้วยการแทนที่สแต็กหน้าต่างดังนั้นฉันจึงใช้เชลล์สคริปต์ เชลล์สคริปต์ทำสิ่งที่คุณต้องการด้านล่าง:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

เครื่องหมายดอกจันในคำสั่ง if มีเพื่อทำการจับคู่สตริงย่อยเพื่อTODOให้สามารถเกิดขึ้นได้ทุกที่ในชื่อเรื่อง


ใช่ขอโทษผิดฉันหมายถึง - ชื่อและ - คลาส จะแก้ไขทันที
t7ko

@DS คุณอาจบอกได้ว่าทำไมการค้นหา xdotool --class "gedit" จะใช้งานได้กับ gedit เท่านั้น แต่ทำงานกับหน้าต่างอื่นได้หรือไม่ เรื่องเดียวกันกับยูทิลิตี้ xprop
Gonki

6

ฉันสามารถระบุวิธีแก้ปัญหาแบบสั้นและแบบ unix-way:

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)

3

นี่เป็นอีกวิธีการหนึ่งที่ยึดตามแนวทางของ UNIX!

ตั้งแต่แรกเห็นมันไม่สวยเท่าของคุณ @ t7ko:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

แต่ทนกับฉัน! มีความงามซ่อนเร้นอยู่บ้าง

ในระยะสั้นนั้น

  1. มีโครงสร้างแบบเส้นตรงแทนที่จะเป็นโครงสร้างแบบต้นไม้เช่นเดียวกับแบบสองมิติ
  2. ใช้มากขึ้นไวยากรณ์เปลือกที่รู้จักกันดี
  3. ไม่ตอบคำถามของคุณจริง: มันตั้งอยู่หน้าต่าง

(ไม่ว่าประเด็นเหล่านี้จะขึ้นอยู่กับบริบทหรือไม่ - ลองเพิกเฉยต่อมุมมองนี้* )

ฉันจะแสดงรหัสเดียวกันในรูปแบบที่มีโครงสร้างมากขึ้นด้านล่างเพื่อให้ง่ายต่อการเข้าใจทีละขั้นตอน
แต่โปรดสังเกตว่าการเยื้องคือการอธิบายคำสั่ง - มันไม่ได้ระบุการซ้อนหรือดังนั้นทั้งหมดยังคงเป็นไปป์ไลน์ UNIX เชิงเส้น

คำสั่งเดียวกันเพียงแยกหลังไพพ์ ( |):

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
    sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

คำสั่งเต็มรูปแบบดังที่แสดงไว้ด้านบนให้ตำแหน่งพิกเซลของgvimหน้าต่างส่งคืนพิกัดพิกเซลที่สัมพันธ์กับมุมซ้ายบนของหน้าจอ (อาจเป็นเสมือนจริง) ในx,yปัจจุบันเช่น42,433, ชอบหรืออาจเป็น-5375,-3809เมื่อหน้าจอเสมือนสี่หรือสี่หน้าจอแรก และอันที่หนึ่งอยู่ด้านขวามือ

สำหรับตอนนี้ฉันจะย่อคำสั่งเพื่อหา ID หน้าต่าง X11 เท่านั้น - นั่นอาจเป็นสิ่งที่ OP ต้องการจริงๆ แต่ก็ไม่แน่ใจว่า:

ไพพ์ไลน์คำสั่งแบบย่อ, คำสั่งเชลล์แยกจากกันในแต่ละบรรทัด:

xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
    xargs -I{} xdotool search --all --pid {} --name 'TODO'

ตอนนี้มันเริ่มอ่านได้:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool search --all --pid {} --name 'TODO' 

xdotoolคำสั่งsearchที่ใช้ในการค้นหาหน้าต่างกับ " ระดับ " gvimออกจากหน้าต่างออกบาง "ภายใน" ผลลัพธ์ถูกแสดงรายการเป็นPID's (ตัวระบุกระบวนการ)
สำหรับแต่ละPID, xargsวิ่งอีกxdotool searchการตรวจสอบ "ชื่อ" สำหรับรูปแบบตัวอย่างของเราTODO- PIDหลังจากการตรวจสอบสำหรับ

(ในกรณี: บรรทัดที่ลงท้ายด้วย\- เรียกว่าสายต่อเนื่อง - จำเป็นต้องลงท้ายด้วย\และไม่มีช่องว่างก่อน newline)

กลับไปที่คำสั่งดั้งเดิม:

xdotool \
    search --onlyvisible --class 'gvim' \
    getwindowpid %@ |
xargs -I{} \
    xdotool \
        search --all --pid {} --name 'TODO' \
        getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'

ส่วนที่เหลือแสดงรายละเอียดบางอย่างเกี่ยวกับหน้าต่างรวมถึงตำแหน่ง sedตรงกับคำสั่งและผลตอบแทนเพียงx,yค่าตำแหน่ง

ตัวอย่างเช่นการรันคำสั่งด้านบนของหน้าจอเสมือนจริงที่ 16 (จาก 4 คูณ 4) ด้วย "สิ่งที่ต้องทำ" gvimบนหน้าจอ 1:

$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732

*) คำเตือน: ฉันชอบรหัสของ @ t7ko มาก!


ใช้--onlyvisibleเป็นสิ่งที่ดี ช่วยฉันด้วยปัญหาที่คล้ายกัน ธันเดอร์เบิร์ดสามารถเริ่มต้นด้วย 14 หน้าต่างและมีเพียงหนึ่งหรือสองอยู่บนเดสก์ท็อป ฉันไม่รู้ว่าสิ่งอื่นนั้นมีไว้เพื่ออะไร BTW หมายถึงการมองเห็นได้เท่านั้นที่สามารถแสดงได้ - ไม่เพียงแสดงบนเดสก์ท็อปปัจจุบันเท่านั้น
โจ

1

คำตอบสั้น ๆ และสง่างาม (ซึ่งใช้wmctrl):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

ID หน้าต่างผลลัพธ์เป็นเลขฐานสิบดังนั้นคุณจำเป็นต้องแปลงเป็นทศนิยม (ใช้โดยxdotool):

printf "%d\n" $result

xdotoolจากนั้นคุณสามารถทำสิ่งที่มี


1
wmctrlคู่มือบอก-lว่าไม่ได้พิมพ์คลาสหน้าต่างเพียงชื่อ; ดังนั้นข้อมูลโค้ดของคุณจึงไม่สามารถแก้ปัญหา "ค้นหาตามชื่อและคลาส"
t7ko

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