Mendeteksi jendela yang sedang aktif

52

Alat baris perintah linux wmctrlmemungkinkan Anda untuk membuat daftar semua jendela, atau semua desktop, di antara hal-hal lainnya. Dalam mode daftar desktop, desktop saat ini ditandai dengan tanda bintang.

Saya membutuhkan alat yang dapat mengetahui judul jendela yang sedang aktif. Sayangnya, wmctrltidak memiliki pembantu yang melakukan ini - meskipun mengetahui jendela mana yang sedang aktif (lihat :ACTIVE:penanda).

Apakah ada alat commandline lain yang dapat memberi saya id jendela dan / atau judul jendela dari jendela saat ini?

Dave Vogt
sumber

Jawaban:

56

Instal xdotool, lalu jalankan

xdotool getwindowfocus getwindowname

Ini akan memberikan misalnya untuk halaman web saat ini dibuka di Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
sumber
Alat yang kuat! Selain mendapatkan jendela aktif saat ini, ia juga memiliki banyak fungsi berguna lainnya.
Searene
Dibandingkan dengan jawaban Jim Paris, ini memiliki kelemahan dari ketergantungan untuk menginstal, tetapi tampaknya berjalan lebih cepat, terutama jika xdotool sudah ada dalam cache disk.
mc0e
1
Jika Anda ingin memanipulasi jendela saat ini wmctrl, Anda dapat melakukan :, di wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1mana -imemberitahu wmctrl untuk mengharapkan id jendela daripada judul jendela.
fiedl
34

Ini lebih langsung dan hanya menggunakan xpropdan cut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

Perintah-perintah ini hanyalah ekstraksi properti dari jendela root dan jendela aplikasi, tetapi sesuai permintaan Lorenzo von Matterhorn:

  • Pertama,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Ekstrak _NET_ACTIVE_WINDOWproperti dari root, yang memberi Anda XID dari jendela aktif. The 32x '\t$0'memberitahu xpropuntuk memformat output dengan cara yang cutdapat dengan mudah menguraikan nanti

  • Kemudian, ekstrak hanya XID dari keluaran dengan cut -f 2

  • Kemudian, berikan XID sebagai parameter untuk

    xprop -id XID _NET_WM_NAME
    

Yang mencetak nama jendela itu.

Jim Paris
sumber
1
hai, bisakah Anda menjelaskan argumen dan sedikit sintaks? mungkin bermanfaat untuk QA dan pembaca masa depan.
Lorenzo Von Matterhorn
9

Ada, tetapi tidak ada jawaban atau solusi singkat.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

hasil:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

Digunakan:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)
tao
sumber
1
Ini sepertinya solusi yang bagus, tidak tahu tentang utilitas xprop. Sementara itu, saya telah menambal wmctrl untuk memberikan opsi seperti itu dan mengirimkannya ke penulis. Sayangnya, saya belum mendapat jawaban.
Dave Vogt
1
+1 untuk efektivitas dan "kesederhanaan" pada kode
Lorenzo Von Matterhorn
5

Inilah yang bekerja untuk saya:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Memberi:

WM_NAME(STRING) = "~"

Jadi mungkin Anda akan melakukan sedikit keburukan untuk mendapatkan nama dengan sendirinya:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Memberi:

~

Yang merupakan nama jendela saya saat ini terfokus, dengan sendirinya.

Atau, hindari sed dengan yang sedikit kurang jelek:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'

Greg Bell
sumber
1
Atau karena cut telah diperkenalkan, Anda dapat menggunakannya lagi:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e
3

Relatif pendek, dan menangani nama jendela yang berisi kutipan dengan benar:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
Ton van den Heuvel
sumber