Saya mencoba menggunakan wmctrl
perintah toggle, tetapi tidak berfungsi pada pengaturan Ubuntu saya. Beralih akan beralih, tetapi tidak beralih. (Saya pikir itu mungkin karena saya menggunakan lingkungan desktop gnome, di mana wmctrl
AFAIK sedikit rusak).
Lagi pula, setelah banyak penelitian dan mencari cara menulis kode yang tepat dalam bash, saya membuat satu perintah yang menggunakan wmctrl
perintah dalam lapisan logika untuk mengaktifkan keadaan 'selalu di atas' secara efektif di desktop GNOME saat ini. Saya memposting jawaban ini di Ask Unix / Linux, tetapi saya pikir saya akan mempostingnya juga di sini kalau-kalau ada yang punya masalah yang sama.
Ini perintahnya:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Itu memeriksa properti keadaan jendela aktif "_NET_WM_STATE" menggunakan xprops
, dan jika itu berisi teks "DI ATAS" itu berarti opsi 'selalu di atas' aktif. Kemudian hanya menjalankan wmctrl
perintah dengan parameter add
atau remove
sesuai kebutuhan.
Perincian perintah (setiap perintah dimasukkan ke perintah berikutnya, menggantikan ■
placeholder):
Dapatkan id jendela aktif:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Dapatkan status jendela dari xprop
menggunakan id:
xprop -id $(■) _NET_WM_STATE
Periksa apakah negara berisi "DI ATAS", yang menunjukkan bahwa jendela diatur ke "selalu di atas":
[[ $(■) =~ "ABOVE" ]]
Kembalikan "hapus" jika benar, jika tidak kembalikan "tambahkan":
■ && echo "remove" || echo "add"
jalankan wmctrl
perintah menggunakan nilai yang dikembalikan sebagai parameter:
wmctrl -r :ACTIVE: -b $(■),above
Kirim semuanya ke bash
sehingga Anda dapat menggunakan substitusi perintah ${ ... }
, evaluasi bash boolean [[ ... ]]
dan operator pertandingan regex =~
:
bash -c '■'
Langkah terakhir ini khususnya membutuhkan waktu yang sangat lama bagi saya untuk mencari tahu. Sampai saya menyadari bahwa pintasan keyboard tidak berjalan di bash secara default, saya tidak tahu mengapa perintah itu bekerja di konsol saat saya mengujinya tetapi diam-diam gagal ketika dijalankan langsung sebagai pintasan keyboard. Itu membuat saya naik tembok untuk waktu yang lama!
Catatan: karena Anda memerlukan tanda kutip di sekitar perintah yang Anda kirim ke bash, saya harus berhati-hati ketika menulis perintah bahwa saya tidak pernah masuk lebih dari satu level lebih dalam (menggunakan tanda kutip ganda). Setiap nesting string dalam tanda kutip akan membutuhkan banyak backslash yang membingungkan untuk lolos dari tanda kutip.