xdotool: Cách tìm kiếm cửa sổ theo tiêu đề và lớp với các mẫu khác nhau (tương tự như AutoHotkey)


10

xdotool cho phép bạn tìm kiếm các cửa sổ bằng cách sử dụng tiểu ban tìm kiếm của nó. Tôi cần xác định vị trí một cửa sổ, có lớp 'gvim' và tiêu đề có chứa từ 'TODO'. Làm thế nào để tôi làm điều này?

Những gì tôi đã thử:

  • Bạn có thể làm xdotool search --name --class, nhưng nó sẽ chỉ chấp nhận một mẫu cho cả tên và tiêu đề.
  • xdotool hỗ trợ chuỗi lệnh, nhưng tôi không thể tìm ra cách xâu chuỗi hai cuộc gọi tìm kiếm - cuộc gọi thứ hai chỉ đơn giản ghi đè cuộc gọi đầu tiên.

xdotoolthật tệ ... đây là một thao tác đơn giản và không có cách nào để thực hiện một cách thanh lịch.
Yan King Yin

Câu trả lời:


13

Xdotool của tôi giúp thông báo cho tôi rằng hai công tắc của bạn giống nhau (phiên bản xdotool 3.20150503.1),

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

và như vậy không làm gì cả. Xdotool của tôi làm tương tự như của bạn với việc thay thế ngăn xếp cửa sổ, vì vậy tôi đã làm điều đó với một tập lệnh shell. Một tập lệnh shell làm những gì bạn muốn được phân phối dưới đây:

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

Dấu hoa thị trong câu lệnh if là có để thực hiện khớp chuỗi con cho TODO, để nó có thể xảy ra bất cứ nơi nào trong tiêu đề.


vâng, xin lỗi, một sai lầm, ý tôi là - tên và - lớp. Sẽ sửa ngay.
t7ko

@DS bạn có thể cho biết tại sao tìm kiếm xdotool - lớp "gedit" bây giờ chỉ hoạt động cho gedit, nhưng hoạt động cho bất kỳ cửa sổ nào khác không? Câu chuyện tương tự với tiện ích xprop.
Gonki

6

Tôi đã có thể xác định giải pháp ngắn và unix-way:

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

3

Đây là một giải pháp khác tuân thủ cách UNIX!

Ngay từ cái nhìn đầu tiên, nó không đẹp như của bạn, @ 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'

Nhưng hãy chịu đựng tôi! Có một số vẻ đẹp tiềm ẩn trong đó.

Nói tóm lại, nó

  1. cấu trúc tuyến tính , thay vì cấu trúc cây, giống như một thay vì hai chiều
  2. sử dụng cú pháp shell nổi tiếng hơn .
  3. không thực sự trả lời câu hỏi của bạn: Nó định vị cửa sổ.

(Những điểm này có phải là lợi thế hay không tùy thuộc vào ngữ cảnh - hãy bỏ qua khía cạnh này * .)

Tôi sẽ hiển thị cùng một mã trong bố cục có cấu trúc hơn bên dưới, để dễ hiểu hơn từng bước.
Nhưng lưu ý rằng thụt lề là để giải thích lệnh - nó không chỉ ra lồng nhau hay như vậy, tất cả vẫn là một đường ống UNIX tuyến tính.

Lệnh tương tự, chỉ phân tách sau các ống dẫn ( |):

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'

Lệnh đầy đủ, như được hiển thị ở trên, cung cấp vị trí pixel của gvimcửa sổ, trả về tọa độ pixel tương ứng với góc trên cùng bên trái của màn hình hiện tại (có thể là ảo) x,y, như 42,433, hoặc có thể -5375,-3809khi nó ở trên bốn màn hình đầu tiên của bốn màn hình ảo và cái hiện tại nằm ở phía bên phải.

Hiện tại, tôi sẽ rút ngắn lệnh chỉ tìm ID cửa sổ X11 - có thể đó là tất cả những gì thực sự cần thiết cho OP, không chắc chắn:

Đường ống lệnh rút ngắn, một lệnh shell riêng biệt trên mỗi dòng:

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

Bây giờ, nó bắt đầu có thể đọc được:

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

Các xdotoollệnh searchđược sử dụng để tìm các cửa sổ với " đẳng cấp " gvim, để lại một số cửa sổ "nội bộ". Kết quả được liệt kê là PID's (định danh quy trình).
Đối với mỗi PID, xargschạy một cái khác xdotool search, kiểm tra "tên" cho mẫu ví dụ của chúng tôi TODO- sau khi kiểm tra PID.

(Chỉ trong trường hợp: Các dòng kết thúc bằng \- được gọi là các dòng tiếp tục - cần thực sự kết thúc bằng \và không có khoảng trắng trước dòng mới.)

Bây giờ trở lại lệnh ban đầu:

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'

Phần còn lại liệt kê một số chi tiết về cửa sổ, bao gồm cả vị trí. Các sedtrận đấu lệnh và trả về chỉ các x,ygiá trị vị trí.

Ví dụ: chạy lệnh trên cùng trên màn hình ảo thứ 16 của tôi (bằng 4 x 4), với "TODO" gvimtrên màn hình 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

*) Tuyên bố miễn trừ trách nhiệm: Tôi thích mã của @ t7ko. Rất nhiều!


Sử dụng --onlyvisiblelà tốt đẹp. Đã giúp tôi với một vấn đề tương tự. Thunderbird có thể bắt đầu với 14 cửa sổ và chỉ có một hoặc hai trên máy tính để bàn. Tôi không biết những người khác đang làm gì. BTW chỉ có thể hiển thị phương tiện có thể hiển thị - không chỉ hiển thị ngay trên màn hình hiện tại.
Joe

1

Câu trả lời ngắn gọn và thanh lịch (sử dụng wmctrl):

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

ID cửa sổ kết quả là hex, vì vậy bạn cần chuyển đổi nó thành thập phân (được sử dụng bởi xdotool):

printf "%d\n" $result

Sau đó, bạn có thể làm bất cứ điều gì với xdotool.


1
wmctrlhướng dẫn nói rằng -lkhông in lớp cửa sổ, chỉ có tiêu đề; vì vậy đoạn mã của bạn không giải quyết được vấn đề của tôi "tìm kiếm theo tiêu đề VÀ lớp".
t7ko

1
wmctrl -lxkhông cung cấp các lớp học.
david.perez
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.