xdotool: Farklı desenlere sahip başlık ve sınıfa göre pencere nasıl aranır (AutoHotkey'e benzer)


10

xdotool arama alt komutunu kullanarak pencereleri aramanızı sağlar. Sınıf 'gvim' ve 'TODO' kelimesini içeren başlık olan bir pencere bulmak gerekiyor. Bunu nasıl yaparım?

Ne denedim:

  • Yapabilirsiniz xdotool search --name --class, ancak hem ad hem de başlık için yalnızca bir desen kabul eder .
  • xdotool komut zincirlemeyi destekler, ancak iki arama çağrısını zincirlemek için bir yol bulamadım - ikincisi sadece birincisini geçersiz kılar.

xdotoolberbat ... Bu çok basit bir işlem ve zarif bir şekilde yapmanın bir yolu yok.
Yan King Yin

Yanıtlar:


13

Xdotool yardımım, iki anahtarınızın aynı olduğunu bana bildirir (xdotool sürüm 3.20150503.1),

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

ve böyle bir şey yapmıyor. Benim xdotool pencere yığını yerine seninkiyle aynı, bu yüzden bir kabuk komut dosyası ile yaptım. İstediğinizi yapan bir kabuk komut dosyası aşağıda sunulmuştur:

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

İf deyimindeki yıldız işaretleri, bir alt dize eşleşmesi yapmak için oradadır TODO, böylece başlığın herhangi bir yerinde gerçekleşebilir.


evet, özür dilerim, bir baskı hatası, yani - isim ve - sınıf. Şimdi düzelecek.
t7ko

@DS xdotool arama --class "gedit" in neden sadece gedit için çalıştığını, ancak başka herhangi bir pencere için çalıştığını söyleyebilir misiniz? Xprop yardımcı programı ile aynı hikaye.
Gonki

6

Kısa ve tek yönlü çözümü tespit edebildim:

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

3

İşte UNIX yoluna bağlı başka bir çözüm!

İlk bakışta seninki kadar güzel değil, @ 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'

Ama benimle kal! İçinde gizli bir güzellik var.

Kısacası,

  1. iki boyut yerine bir ağaç yapısı yerine doğrusal bir yapıya sahiptir.
  2. daha iyi bilinen kabuk sözdizimini kullanır .
  3. aslında sorunuzu cevaplıyor: Pencereyi bulur .

(Bu noktaların avantaj olup olmadığı bağlama bağlıdır - sadece bu yönü görmezden gelelim * .)

Adım adım daha kolay anlaşılmasını sağlamak için aynı kodu aşağıdaki daha yapılandırılmış düzende göstereceğim.
Ancak girintinin komutu açıklamak olduğuna dikkat edin - iç içe geçmeyi göstermez veya hepsi, hepsi hala doğrusal bir UNIX boru hattıdır.

Aynı komut, borulardan sonra bölünür ( |):

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'

Tam komut, yukarıda gösterildiği gibi, gvimgeçerli (muhtemelen sanal) ekranın sol üst köşesine göre piksel koordinatlarını , dört veya dört sanal ekranın ilkinde olduğu x,ygibi 42,433veya belki de pencerenin piksel konumunu verir. -5375,-3809ve mevcut olan sağ tarafta bir yerlerde.

Şimdilik, sadece bir X11 pencere kimliği bulma komutunu kısaltacağım - belki de OP tarafından gerçekten ihtiyaç duyulan şey bu değil, emin değilim:

Kısaltılmış komut boru hattı, her satırda ayrı bir kabuk komutu:

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

Şimdi, okunabilir olmaya başlıyor:

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

xdotoolKomut search"ile pencereleri bulmak için kullanılan sınıfın " gvimbazı "iç" pencereleri dışarıda bırakarak. Sonuç PID's olarak listelenir (işlem tanımlayıcıları).
Her biri için PID, xargsbaşka çalışır xdotool searchörneğimiz modeli için "adı" kontrol TODOiçin kontrol ettikten sonra - PID.

(Her ihtimale karşı: Devam çizgileri olarak \adlandırılan - ile biten satırların, aslında yeni satırdan \önce boşlukla bitmesi ve boşluk olmaması gerekir .)

Şimdi orijinal komuta geri dönelim:

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'

Kalan kısım, konum da dahil olmak üzere pencere hakkında bazı ayrıntıları listeler. sedKomut maçları ve iadeler sadece x,ykonum değeri.

Örneğin, 16. sanal ekranımda (4'ten 4'e kadar) üstteki komutu gvimekran 1'de "TODO" ile çalıştırmak:

$ 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

*) Feragatname: @ t7ko'nun kodunu tercih ederim. Çok!


Kullanmak --onlyvisiblegüzel. Benzer bir konuda bana yardımcı oldu. Thunderbird 14 pencereyle başlayabilir ve masaüstünde yalnızca bir veya iki tane vardır. Diğerlerinin ne için olduğu hakkında hiçbir fikrim yok. BTW yalnızca görünen araçlar görüntülenebilir - yalnızca geçerli masaüstünde hemen gösterilmez.
Joe

1

Kısa ve zarif cevap (kullanan wmctrl):

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

Ortaya çıkan pencere kimliği onaltılıktır, bu nedenle ondalık sayıya dönüştürmeniz gerekir (tarafından kullanılır xdotool):

printf "%d\n" $result

Sonra her şeyi yapabilirsiniz xdotool.


1
wmctrlmanuel -lpencere sınıfı yazdırmaz, sadece başlık diyor ; kod snippet'iniz "başlığa ve sınıfa göre ara" sorunumu çözmez.
t7ko

1
wmctrl -lxsınıfı sağlar.
david.perez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.