Manajemen jendela alternatif di Linux

Saya salah satu yang mengatur Caps Lock untuk berpindah layout karena saya terlalu malas untuk menekan 2 tombol padahal saya bisa menekan salah satu. Saya bahkan ingin 2 kunci yang tidak perlu: Saya akan menggunakan satu untuk mengaktifkan tata letak bahasa Inggris, dan yang kedua untuk bahasa Rusia. Namun kunci kedua yang tidak perlu adalah memanggil menu konteks, yang sangat tidak diperlukan sehingga dihilangkan oleh banyak produsen laptop. Jadi, Anda harus puas dengan apa yang Anda miliki.

Dan saya juga tidak ingin mencari ikonnya di taskbar saat berpindah jendela, atau mengetahui namanya saat menggulir Alt + Tab, menelusuri desktop, dll. Saya ingin menekan kombinasi tombol (idealnya hanya satu, tetapi tidak ada lagi tombol gratis yang tidak diperlukan) dan segera membuka jendela yang saya perlukan. Misalnya seperti ini:

  • Alt+F: Firefox
  • Alt+D: Firefox (Penjelajahan Pribadi)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: Ide IntelliJ
  • dll.

Apalagi dengan menekan, misalnya, on Alt+M Saya ingin melihat kalkulator terlepas dari apakah program ini sedang berjalan. Jika sedang berjalan, maka jendelanya perlu diberi fokus, dan jika tidak, jalankan program yang diinginkan dan transfer fokus saat dimuat.

Untuk kasus yang tidak tercakup dalam skrip sebelumnya, saya ingin memiliki kombinasi tombol universal yang dapat dengan mudah ditetapkan ke jendela mana pun yang terbuka. Misalnya, saya memiliki 10 kombinasi yang ditetapkan Alt + 1 untuk Alt + 0, yang tidak terikat dengan program apa pun. Saya cukup mengklik Alt + 1 dan jendela yang sedang fokus akan mendapatkan fokus ketika diklik Alt + 1.

Di bawah potongan terdapat deskripsi beberapa fitur lainnya dan jawaban bagaimana hal ini dapat dilakukan. Namun saya akan segera memperingatkan Anda bahwa penyesuaian "untuk diri Anda sendiri" seperti itu dapat menyebabkan kecanduan parah dan bahkan penarikan diri jika Anda perlu menggunakan Windows, Mac OS, atau bahkan komputer orang lain dengan Linux.

Faktanya, jika dipikir-pikir, kami tidak menggunakan banyak program setiap hari. Browser, terminal, IDE, semacam messenger, pengelola file, kalkulator dan, mungkin, itu saja. Tidak banyak kombinasi tombol yang diperlukan untuk menyelesaikan 95% tugas sehari-hari.

Untuk program yang memiliki beberapa jendela terbuka, salah satunya dapat ditetapkan sebagai jendela utama. Misalnya, Anda memiliki beberapa jendela IntelliJ Idea yang terbuka dan ditetapkan Alt + E. Dalam kondisi normal, saat Anda menekan Alt + E beberapa jendela program ini akan terbuka, kemungkinan besar jendela yang dibuka pertama kali. Namun, jika Anda mengklik Alt + E ketika salah satu jendela program ini sudah menjadi fokus, maka jendela khusus ini akan ditetapkan sebagai jendela utama dan akan menjadi jendela yang akan diberi fokus ketika kombinasi berikutnya ditekan.

Jendela utama dapat dipindahkan. Untuk melakukan ini, Anda harus mengatur ulang kombinasi tersebut terlebih dahulu, lalu menetapkan jendela lain sebagai jendela utama. Untuk mengatur ulang suatu kombinasi, Anda perlu menekan kombinasi itu sendiri, dan kemudian kombinasi reset khusus, yang telah saya tetapkan Alt + Backspace. Ini akan memanggil skrip yang akan membatalkan penetapan jendela utama untuk kombinasi sebelumnya. Dan kemudian Anda dapat menetapkan jendela utama baru seperti yang dijelaskan pada paragraf sebelumnya. Menyetel ulang jendela tertaut ke kombinasi universal terjadi dengan cara yang sama.

Perkenalannya ternyata panjang, tapi saya ingin memberi tahu dulu apa yang akan kami lakukan, lalu menjelaskan cara melakukannya.

Bagi yang bosan membaca

Singkatnya, tautan ke skrip ada di akhir artikel.

Namun Anda tetap tidak bisa langsung menginstal dan menggunakannya. Pertama-tama Anda harus mencari tahu bagaimana skrip menemukan jendela yang diinginkan. Tanpa ini, tidak mungkin untuk memberi tahu skrip di mana tepatnya fokus perlu dialihkan. Dan Anda perlu memahami apa yang harus dilakukan jika tiba-tiba jendela yang sesuai tidak ditemukan.

Dan saya tidak akan fokus pada cara mengkonfigurasi eksekusi skrip dengan menekan kombinasi tombol. Misalnya di KDE ada di System Settings → Shortcuts → Custom Shortcuts. Hal ini juga harus terjadi pada window manager lainnya.

Memperkenalkan wmctrl

Wmctrl.dll — utilitas konsol untuk berinteraksi dengan X Window Manager. Ini adalah program utama untuk skrip tersebut. Mari kita lihat sekilas bagaimana Anda dapat menggunakannya.

Pertama, mari kita tampilkan daftar jendela yang terbuka:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

Pilihan -l menampilkan daftar semua jendela yang terbuka, dan -X menambahkan nama kelas ke output (skype.Skype, Navigator.Firefox dll). Di sini kita memerlukan id jendela (kolom 1), nama kelas (kolom 3) dan nama jendela (kolom terakhir).

Anda dapat mencoba mengaktifkan beberapa jendela menggunakan opsi -a:

$ wmctrl -a skype.Skype -x

Jika semuanya berjalan sesuai rencana, jendela Skype akan muncul di layar. Jika bukan pilihan -x opsi penggunaan -i, lalu alih-alih nama kelas Anda dapat menentukan id jendela. Masalah dengan id adalah id jendela berubah setiap kali aplikasi diluncurkan dan kita tidak dapat mengetahuinya sebelumnya. Di sisi lain, atribut ini secara unik mengidentifikasi sebuah jendela, yang dapat menjadi penting ketika suatu aplikasi membuka lebih dari satu jendela. Lebih lanjut tentang ini sedikit lebih jauh.

Pada tahap ini kita perlu mengingat bahwa kita akan mencari jendela yang diinginkan menggunakan regex berdasarkan output wmctrl -lx. Namun bukan berarti kita harus menggunakan sesuatu yang rumit. Biasanya nama kelas atau nama jendela sudah cukup.

Pada dasarnya gagasan pokoknya harusnya sudah jelas. Dalam pengaturan hotkey/pintasan global untuk window manager Anda, konfigurasikan kombinasi yang diperlukan untuk menjalankan skrip.

Cara menggunakan skrip

Pertama, Anda perlu menginstal utilitas konsol wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Selanjutnya Anda perlu mengunduh skrip dan menambahkannya $ PATH. Saya biasanya memasukkannya ke dalam ~/tempat sampah:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Jika direktori ~/tempat sampah tidak ada di sana, maka Anda perlu membuatnya dan reboot (atau login ulang), jika tidak ~/tempat sampah tidak akan mengenai $ PATH. Jika semuanya dilakukan dengan benar, skrip seharusnya dapat diakses dari konsol dan penyelesaian Tab akan berfungsi.

Skrip utama menang pertunjukan mengambil 2 parameter: yang pertama adalah regex, yang dengannya kita akan mencari jendela yang diperlukan, dan parameter kedua adalah perintah yang perlu dijalankan jika jendela yang diperlukan tidak ditemukan.

Anda dapat mencoba menjalankan skrip, misalnya:

$ showwin "Mozilla Firefox$" firefox

Jika Firefox diinstal, jendelanya harus diberi fokus. Meskipun Firefox tidak berjalan, Firefox seharusnya sudah dimulai.

Jika berhasil, maka Anda dapat mencoba mengkonfigurasi eksekusi perintah pada kombinasi. Dalam pengaturan hotkey/pintasan global tambahkan:

  • Alt+F: tampilkan “Mozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (Penjelajahan Pribadi)$" "firefox -private-window"
  • Alt+C: tampilkan "browser-chromium.browser-chromium N*" browser-chromium
  • Alt+X: showwin "peramban-chromium. Peramban-kromium I*" "peramban-kromium -penyamaran"
  • Alt+S: tampilkan “skype.Skype” skypeforlinux
  • Alt+E: tampilkan win “jetbrains-idea” idea.sh

Dll. Setiap orang dapat mengonfigurasi kombinasi tombol dan perangkat lunak sesuai keinginan mereka.
Jika semuanya berjalan dengan benar, maka dengan menggunakan kombinasi di atas kita akan dapat beralih antar jendela hanya dengan menekan tombol.

Saya akan mengecewakan pecinta chrome: ia dapat membedakan jendela biasa secara penyamaran dari keluarannya wmctrl Tidak bisa, mereka memiliki nama kelas dan judul jendela yang sama. Dalam regex yang diusulkan, karakter N* dan I* diperlukan hanya agar ekspresi reguler ini berbeda satu sama lain dan dapat ditetapkan sebagai jendela utama.

Untuk mereset jendela utama dari kombinasi sebelumnya (sebenarnya untuk regex, yang menang pertunjukan dipanggil terakhir kali) Anda perlu memanggil skrip showwinDetach. Saya menetapkan skrip ini untuk kombinasi tombol Alt + Backspace.

Di naskah menang pertunjukan masih ada satu fungsi lagi. Ketika dipanggil dengan satu parameter (dalam hal ini parameter hanyalah pengidentifikasi), ia tidak memeriksa regex sama sekali, tetapi menganggap semua jendela cocok. Ini sendiri tampaknya tidak berguna, tetapi dengan cara ini kita dapat menetapkan jendela mana pun sebagai jendela utama dan dengan cepat beralih ke jendela tersebut.

Saya telah mengonfigurasi kombinasi berikut:

  • Alt+1: tampilkan "CustomKey1"
  • Alt+2: tampilkan "CustomKey2"
  • ...
  • Alt+0: tampilkan "CustomKey0"
  • Alt+Backspace: tampilkanwinDetach

Dengan cara ini saya dapat mengikat jendela apa pun ke kombinasi Alt + 1...Alt + 0. Hanya dengan mengklik Alt + 1 Saya mengikat jendela saat ini ke kombinasi ini. Saya dapat membatalkan pengikatan dengan mengklik Alt + 1, seorang pria Alt + Backspace. Atau tutup jendelanya, itu juga berfungsi.

Selanjutnya saya akan memberi tahu Anda beberapa detail teknis. Anda tidak perlu membacanya, tetapi coba atur dan lihat saja. Tapi saya tetap menyarankan untuk memahami skrip orang lain sebelum menjalankannya di komputer Anda :).

Cara membedakan jendela berbeda dari aplikasi yang sama

Pada prinsipnya, contoh pertama “wmctrl -a skype.Skype -x” berfungsi dan dapat digunakan. Tapi mari kita lihat kembali contoh Firefox, di mana 2 jendela terbuka:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

Jendela pertama adalah mode normal, dan yang kedua adalah Penjelajahan Pribadi. Saya ingin menganggap jendela ini sebagai aplikasi yang berbeda dan beralih ke jendela tersebut menggunakan kombinasi tombol yang berbeda.

Hal ini diperlukan untuk memperumit skrip yang mengganti windows. Saya menggunakan solusi ini: tampilkan daftar semua jendela, lakukan grep dengan regex, ambil baris pertama dengan kepala, dapatkan kolom pertama (ini akan menjadi id jendela) menggunakan memotong, beralih ke jendela berdasarkan id.

Seharusnya ada lelucon tentang ekspresi reguler dan dua masalah, tapi sebenarnya saya tidak menggunakan sesuatu yang rumit. Saya memerlukan ekspresi reguler agar saya dapat menunjukkan akhir baris (simbol “$”) dan membedakan “Mozilla Firefox$” dari “Mozilla Firefox (Penjelajahan Pribadi)$”.

Perintahnya terlihat seperti ini:

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

Di sini Anda sudah dapat menebak fitur kedua dari skrip: jika grep tidak mengembalikan apa pun, maka aplikasi yang diinginkan tidak terbuka dan Anda harus memulainya dengan menjalankan perintah dari parameter kedua. Dan kemudian secara berkala periksa apakah jendela yang diperlukan telah terbuka untuk mentransfer fokus ke sana. Saya tidak akan fokus pada hal ini, siapa pun yang membutuhkannya akan melihat sumbernya.

Ketika jendela aplikasi tidak dapat dibedakan

Jadi, kita telah mempelajari cara mentransfer fokus ke jendela aplikasi yang diinginkan. Namun bagaimana jika suatu aplikasi memiliki lebih dari satu jendela yang terbuka? Yang mana yang harus saya fokuskan? Script di atas kemungkinan besar akan ditransfer ke jendela pertama yang terbuka. Namun, kami menginginkan lebih banyak fleksibilitas. Saya ingin dapat mengingat jendela mana yang kita perlukan dan beralih ke jendela tersebut.

Idenya adalah ini: Jika kita ingin mengingat jendela tertentu untuk kombinasi tombol, maka kita perlu menekan kombinasi ini ketika jendela yang diinginkan berada dalam fokus. Nanti, saat Anda menekan kombinasi ini, fokus akan diberikan ke jendela ini. Sampai jendelanya tertutup atau kita melakukan reset untuk kombinasi script ini showwinDetach.

Algoritma skrip menang pertunjukan sesuatu seperti ini:

  • Periksa apakah sebelumnya kita telah mengingat id jendela tempat fokus harus ditransfer.
    Jika Anda ingat dan jendela seperti itu masih ada, maka kami mentransfer fokus ke sana dan keluar.
  • Kami melihat jendela mana yang saat ini menjadi fokus, dan jika cocok dengan permintaan kami, ingatlah idnya untuk membukanya di masa mendatang dan keluar.
  • Kami pergi ke setidaknya beberapa jendela yang sesuai jika ada atau membuka aplikasi yang diinginkan.

Anda dapat mengetahui jendela mana yang sedang menjadi fokus menggunakan utilitas konsol xdotool dengan mengonversi outputnya ke format heksadesimal:

$ printf "0x%08x" `xdotool getwindowfocus`

Cara termudah untuk mengingat sesuatu di bash adalah dengan membuat file dalam sistem file virtual yang terletak di memori. Di Ubuntu ini diaktifkan secara default di /dev/shm/. Saya tidak bisa berkata apa-apa untuk distro lain, semoga ada yang serupa juga. Anda dapat melihat dengan perintah:

$ mount -l | grep tmpfs

Script akan membuat direktori kosong di folder ini, seperti ini: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Selain itu, setiap kali dipanggil akan membuat symlink /dev/shm/$USER/showwin/showwin_last pada /dev/shm/$USER/showwin/$SEARCH_REGEX. Ini diperlukan untuk, jika perlu, menghapus id jendela untuk kombinasi tertentu menggunakan skrip showwinDetach.

Apa yang bisa diperbaiki

Pertama, skrip harus dikonfigurasi secara manual. Tentunya, karena kebutuhan untuk mempelajari dan melakukan banyak hal dengan tangan Anda, banyak dari Anda bahkan tidak akan mencoba mengkonfigurasi sistem. Jika memungkinkan untuk menginstal paket dan mengkonfigurasi semuanya dengan lebih mudah, mungkin paket tersebut akan mendapatkan popularitas. Dan lihat, aplikasi tersebut akan dirilis ke distribusi standar.

Dan mungkin hal itu bisa dilakukan dengan lebih mudah. Jika dengan id jendela Anda dapat mengetahui id proses yang membuatnya, dan dengan id proses Anda dapat mengetahui perintah mana yang membuatnya, maka pengaturan dapat diotomatisasi. Sebenarnya saya tidak mengerti apakah apa yang saya tulis di paragraf ini mungkin. Faktanya adalah saya pribadi puas dengan cara kerjanya sekarang. Namun jika orang lain selain saya menganggap keseluruhan pendekatan ini nyaman dan seseorang memperbaikinya, maka saya akan dengan senang hati menggunakan solusi yang lebih baik.

Masalah lainnya, seperti yang sudah saya tulis, adalah dalam beberapa kasus windows tidak dapat dibedakan satu sama lain. Sejauh ini saya hanya mengamati ini dengan penyamaran di chrome/chromium, tapi mungkin ada yang serupa di tempat lain. Sebagai upaya terakhir, selalu ada pilihan kombinasi universal Alt + 1...Alt + 0. Sekali lagi saya menggunakan Firefox dan bagi saya pribadi masalah ini tidak signifikan.

Namun masalah penting bagi saya adalah saya menggunakan Mac OS untuk bekerja dan saya tidak dapat mengonfigurasi hal seperti itu di sana. kegunaan wmctrl Saya rasa saya dapat menginstalnya, tetapi tidak berfungsi di Mac OS. Sesuatu dapat dilakukan dengan aplikasi tersebut Automator, tetapi sangat lambat sehingga tidak nyaman digunakan meskipun sedang berfungsi. Saya juga tidak dapat mengatur kombinasi tombol agar dapat berfungsi di semua program. Jika seseorang tiba-tiba memberikan solusi, saya akan dengan senang hati menggunakannya.

Alih-alih sebuah kesimpulan

Ternyata ada banyak sekali kata yang tidak terduga untuk fungsi yang tampaknya sederhana. Saya ingin menyampaikan ide dan tidak membebani teks secara berlebihan, namun saya belum menemukan cara untuk menyampaikannya dengan lebih sederhana. Mungkin akan lebih baik dalam format video, tapi orang tidak suka seperti itu di sini.

Saya berbicara sedikit tentang apa yang ada di balik skrip dan cara mengkonfigurasinya. Saya tidak merinci skripnya sendiri, tetapi hanya 50 baris, jadi tidak sulit untuk memahaminya.

Saya berharap orang lain akan mencoba ide ini dan bahkan mungkin menghargainya. Saya dapat mengatakan tentang diri saya sendiri bahwa naskahnya ditulis sekitar 3 tahun yang lalu dan itu SANGAT nyaman bagi saya. Sangat nyaman sehingga menyebabkan ketidaknyamanan yang serius saat bekerja dengan komputer orang lain. Dan dengan MacBook yang berfungsi.

Tautan ke skrip

Sumber: www.habr.com

Tambah komentar