Alternativno upravljanje prozorima u Linuxu

Ja sam tip koji postavlja Caps Lock za prebacivanje jezika jer mi se ne da pritisnuti 2 tipke kada mogu pritisnuti jednu. Čak bih volio imati 2 bespotrebne tipke: jednu za uključivanje engleskog jezika, a drugu za ruski. No, druga bespotrebna tipka je poziv kontekstnog izbornika, koja je toliko bespotrebna da ju mnogi proizvođači prijenosnih računala gube. Tako da se moram zadovoljiti onim što imam.

Također, ne želim pri prebacivanju prozora tražiti njihove ikone na traci zadataka, uhvatiti pogled na nazive dok listam kroz Alt+Tab, listati radne površine itd. Želim pritisnuti kombinaciju tipki (idealno jednu, ali slobodnih bespotrebnih tipki više nema) i odmah doći do prozora koji mi treba. Na primjer ovako:

  • Alt+F: Firefox
  • Alt+D: Firefox (Privatno pretraživanje)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: IntelliJ Idea
  • i tako dalje.

Štoviše, pritiskom na, na primjer, Alt+M želim vidjeti kalkulator bez obzira na to je li ova aplikacija trenutno otvorena. Ako je otvorena, njenom prozoru treba dati fokus, a ako nije — pokrenuti potrebnu aplikaciju i prenijeti fokus kada se učita.

Za slučajeve koje ne pokriva prethodni scenarij, želim imati univerzalne kombinacije tipki na koje mogu lako dodijeliti bilo koji od otvorenih prozora. Na primjer, dodijelio sam 10 kombinacija od Alt+1 do Alt+0, koje nisu vezane uz nikakve programe. Mogu jednostavno pritisnuti Alt+1 i prozor koji je trenutno u fokusu dobit će fokus kada pritisnem Alt+1.

Ispod je opis još nekoliko značajki i odgovor na to kako to možete učiniti. Ali odmah ću upozoriti da ovakva prilagodba "za sebe" može izazvati snažnu ovisnost i čak simptome povlačenja ako treba koristiti Windows, Mac OS ili čak tuđi računalni sustav s Linuxom.

Zapravo, ako malo razmislimo, ne koristimo toliko programa svakodnevno. Preglednik, terminal, IDE, neki messenger, upravitelj datoteka, kalkulator i, može se reći, to je skoro sve. Nije potrebna velika količina kombinacija tipki da pokrijemo 95% svakodnevnih zadataka.

Za programe koji imaju otvoreno više prozora, jedan od njih može biti postavljen kao glavni. Na primjer, otvoreno je više prozora IntelliJ Idea, postavljenih na Alt+E. U običnim uvjetima pritiskom na Alt+E otvorit će se neki prozor te aplikacije, vjerovatno onaj koji je otvoren prvi. Alt+E Kada je jedno od prozora ovog programa već u fokusu, to će prozor biti označen kao glavni i točno njemu će se davati fokus prilikom sljedećih pritisaka kombinacije.

Glavno prozor se može ponovo odrediti. Da bi to učinili, prvo je potrebno resetirati kombinaciju, a zatim odrediti drugo prozor kao glavno. Za resetiranje kombinacije potrebno je pritisnuti samu kombinaciju, a zatim posebnu resetirajuću kombinaciju, koja je kod mene postavljena na Alt+Backspace. Ovo će pokrenuti skriptu koja će ukloniti oznaku glavnog prozora za prethodnu kombinaciju. A zatim se može postaviti novo glavno prozor kao što je opisano u prethodnom odlomku. Resetiranje vezanog prozora na univerzalne kombinacije događa se na sličan način.

Uvod je ispao dug, ali sam prvo želio reći što ćemo raditi, a zatim objasniti kako to raditi.

Za one kojima je dosadno čitati

Ukratko, link na skripte je na kraju članka.

No, isto tako, nećete moći odmah instalirati i koristiti. Prvo ćete se morati snaći kako skripta nalazi potrebno prozor. Bez toga nećete moći odrediti skriptu kamo točno treba prenijeti fokus. I potrebno je razumjeti što učiniti ako odgovarajući prozor nije pronađen.

Osim toga, neću se usredotočiti na to kako postaviti izvođenje skripti pritiskom na kombinacije tipki. Na primjer, u KDE-u to se nalazi u System Settings → Shortcuts → Custom Shortcuts. U drugim upraviteljima prozora bi to također trebalo biti.

Upoznavanje s wmctrl

Wmctrl — konzolna alatka za interakciju s X Window Managerom. To je ključni program za skriptu. Pogledajmo kako se može koristiti.

Za početak, ispisujemo popis otvorenih prozora:

$ 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 Translate - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najbolje objave u posljednja 24 sata / Habr - Mozilla Firefox (Privatno pregledavanje)
...

Opcija -l ispisuje popis svih otvorenih prozora, a -x dodaje naziv klase (skype.Skype, Navigator.Firefox itd.). Ovdje će nam trebati id prozora (stupac 1), ime klase (stupac 3) i naziv prozora (posljednji stupac).

Možete pokušati aktivirati neko prozor koristeći opciju -a:

$ wmctrl -a skype.Skype -x

Ako je sve išlo po planu, na ekranu bi se trebala pojaviti prozor Skype. Ako umjesto opcije -x koristite opciju -i, umjesto imena klase, možete navesti id prozora. Problem s id-om je taj što se id prozora mijenja prilikom svakog pokretanja aplikacije i ne možemo ga unaprijed znati. S druge strane, ovaj atribut jasno identificira prozor, što može biti važno kada aplikacija otvara više prozora. O tome nešto kasnije.

U ovoj fazi trebamo zapamtiti da ćemo tražiti odgovarajući prozor pomoću regexa na outputu wmctrl -lx. No, to ne znači da moramo nužno koristiti nešto složeno. Obično je dovoljno ime klase ili naziv prozora.

U principu, osnovna ideja bi trebala biti jasna. U postavkama globalnih prečaca/shortcuta za vaš windows menadžer postavite odgovarajuću kombinaciju za izvršavanje skripte.

Kako koristiti skripte

Prvo treba instalirati konzolne alate wmctrl i xdotool:

$ sudo apt-get install wmctrl xdotool

Nakon toga treba preuzeti skripte i dodati ih u $PATH. Obično ih stavljam u ~/bin:

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

Ako direktorij ~/bin nije postojao, treba ga stvoriti i ponovno se prijaviti (ili se ponovno prijaviti), inače ~/bin neće biti dostupan u $PATH. Ako je sve učinjeno ispravno, skripte bi trebale biti dostupne iz konzole i automatsko dovršavanje Tab bi trebalo raditi.

Glavna skripta showwin prima 2 parametra: prvi je regex prema kojem ćemo tražiti odgovarajući prozor, a drugi parametar je naredba koju treba izvršiti ako odgovarajući prozor nije pronađen.

Možete pokušati izvršiti skriptu, na primjer:

$ showwin "Mozilla Firefox$" firefox

Ako je Firefox instaliran, prozoru bi trebao biti dodijeljen fokus. Čak i ako Firefox nije bio pokrenut, trebao bi se pokrenuti.

Ako je uspjelo, možete pokušati postaviti izvršavanje naredbi na kombinacije tipki. U postavkama globalnih prečaca/shortcuta dodajemo:

  • Alt+F: showwin «Mozilla Firefox$» firefox
  • Alt+D: showwin «Mozilla Firefox (Private Browsing)$» «firefox -private-window»
  • Alt+C: showwin «chromium-browser.Chromium-browser N*» chromium-browser
  • Alt+X: showwin «chromium-browser.Chromium-browser I*» «chromium-browser -incognito»
  • Alt+S: showwin «skype.Skype» skypeforlinux
  • Alt+E: showwin «jetbrains-idea» idea.sh

I tako dalje. Svaka osoba može postaviti kombinacije tipki i softvera prema vlastitim željama.
Ako je sve ispravno napravljeno, putem gore navedenih kombinacija možemo se jednostavno prebacivati između prozora samo pritiskom na tipke.

Razočarat ću ljubitelje Chromea: obično prozori ne mogu se razlikovati u inkognito načinu rada prema outputu. wmctrl nije moguće, imaju iste nazive klasa i naslove prozora. U predloženim regex simboli N* i I* su potrebni samo da bi se ti regularni izrazi razlikovali jedan od drugog i mogli smo im dodijeliti različita glavna prozora.

Za resetiranje glavnog prozora prethodne kombinacije (zapravo za regex koji showwin je pozvan posljednji put) potrebno je pozvati skriptu showwinDetach. Ova skripta je dodijeljena na kombinaciju tipki Alt+Backspace.

Skripta showwin ima još jednu funkciju. Kada se poziva s jednim parametrom (u ovom slučaju je parametar samo identifikator), ne provjerava regex, nego smatra sva prozora prikladnima. To se samo po sebi čini beskorisnim, međutim tako možemo dodijeliti bilo koje prozore kao glavne i brzo se prebacivati na taj prozor.

Imam postavljene takve kombinacije:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • …
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

Tako mogu povezati bilo koje prozore s kombinacijama Alt+1…Alt+0. Samo pritiskom Alt+1 povezujem trenutni prozor s tom kombinacijom. Poništiti vezu mogu pritiskom Alt+1, a zatim Alt+Backspace. Ili jednostavno zatvoriti prozor, to također funkcionira.

Nadalje ću reći malo tehničkih detalja. To možete ne čitati, već jednostavno pokušati postaviti i vidjeti. No ipak bih preporučio razumjeti strane skripte prije nego što ih pokrenete na svom računalu :).

Kako razlikovati različite prozore jedne aplikacije

U biti, prvi primjer «wmctrl -a skype.Skype -x» bio je operativan i može se koristiti. Ali hajde još jednom pogleda na primjer s Firefoxom, u kojem su otvorena 2 prozora:

0x04400003  0 Navigator.Firefox                   N/A Google Translate - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najbolje objave u posljednja 24 sata / Habr - Mozilla Firefox (Privatno pregledavanje)

Prvi prozor — obični način, a drugi — Privatno pregledavanje. Te prozore bismo željeli smatrati različitim aplikacijama i prebacivati se među njima pomoću različitih kombinacija tipki.

Potrebno je zakomplicirati skriptu koja prebacuje prozore. Koristio sam ovakvo rješenje: izlistati sve prozore, napraviti grep po regexu, uzeti prvu liniju pomoću head, izvući prvu kolonu (to će biti id prozora) pomoću cut, prebaciti se na prozor prema id-u.

Ovdje bi trebala biti šala o regularnim izrazima i dva problema, ali zapravo ne koristim ništa složeno. Regularni izrazi su mi potrebni da bih mogao odrediti kraj niza (simbol «$») i razlikovati «Mozilla Firefox$» od «Mozilla Firefox (Privatno pregledavanje)$».

Tim izgleda otprilike ovako:

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

Ovdje se već može naslutiti druga osobina skripta: ako grep ništa ne ispiše, to znači da potrebno aplikacija nije otvorena i treba je pokrenuti izvršavanjem komande iz drugog parametra. Zatim, periodično treba provjeravati nije li se otvorio potreban prozor kako bismo mu dali fokus. Neću se previše zadržavati na tome, tko želi, neka pogleda izvorne datoteke.

Kada su prozori aplikacije neprepoznatljivi

Dakle, naučili smo kako prenijeti fokus na prozor potrebne aplikacije. No što ako je otvoreno više od jednog prozora te aplikacije? Na koji od njih prenijeti fokus? Skript iznad će vjerojatno prenijeti fokus na prvi otvoreni prozor. Međutim, želimo veću fleksibilnost. Voljeli bismo imati mogućnost zapamtiti koji nam prozor treba i prebaciti se upravo na taj prozor.

Ideja je bila ovakva: Ako želimo zapamtiti određeni prozor za kombinaciju tipki, trebamo pritisnuti tu kombinaciju kada je potreban prozor u fokusu. Kasnije, kada pritisnemo tu kombinaciju, fokus će se predavati upravo tom prozoru. Dok prozor ne zatvorimo ili ne resetiramo tu kombinaciju skripta. showwinDetach.

Algoritam skripta showwin približno je ovakav:

  • Provjeriti jesmo li ranije zapamtili id prozora kojem treba prenijeti fokus.
    Ako smo zapamtili i takav prozor još uvijek postoji, onda mu prenosimo fokus i izlazimo.
  • Gledamo koji prozor je trenutno u fokusu, i ako odgovara našem zahtjevu, zapamtit ćemo njegov id za kasniji prijelaz na njega i izlazimo.
  • Idemo na neki odgovarajući prozor ako postoji, ili otvaramo potrebnu aplikaciju.

Saznati koji prozor je trenutno u fokusu možemo pomoći konzolnoj utiliti xdotool, pretvarajući njegov ispravak u heksadecimalni format:

$ printf "0xx" `xdotool getwindowfocus`

Nešto zapamtiti u bash-u najlakše je stvaranjem datoteka u virtualnom datotečnom sustavu koji se nalazi u memoriji. U Ubuntuu je takav prema zadanim postavkama povezan u /dev/shm/. O drugim distribucijama ne mogu ništa reći, nadam se da nešto slično također postoji. Možete provjeriti komandom:

$ mount -l | grep tmpfs

Skript će stvarati prazne direktorije u ovoj mapi, nešto ovako: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dodatno, pri svakom pozivu on će stvarati symlink /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. To će biti potrebno kako bismo po potrebi uklonili id prozora za određenu kombinaciju pomoću skripta. showwinDetach.

Što se može poboljšati

Prvo, skripte je potrebno ručno konfigurirati. Vjerojatno, zbog potrebe da se razumije i učini mnogo toga ručno, mnogi od vas će se možda obeshrabriti i ne pokušati postaviti sustav. Da postoji mogućnost jednostavnog instaliranja paketa i jednostavnije konfiguracije, to bi možda steklo određenu popularnost. A tko zna, možda bi se čak i aplikacija uvrstila u standardne distribucije.

I, vjerojatno, moglo bi se napraviti jednostavnije. Ako se po ID-u prozora može saznati ID procesa koji ga je stvorio, a po ID-u procesa saznati koja je komanda njegove stvaranja, to bi moglo automatizirati konfiguraciju. U stvarnosti se nisam bavio time, možemo li ostvariti ono što sam napisao u ovom odlomku. Činjenica je da meni osobno odgovara način na koji sada radi. No, ako se nekome osim mene čitav pristup učini praktičnim i ako netko to poboljša, rado ću koristiti bolje rješenje.

Drugi problem, kao što sam već spomenuo, je taj što se u nekim slučajevima prozori ne mogu razlikovati jedni od drugih. Do sada sam takvo nešto primijetio samo s incognito prozorima u chrome/chromiumu, ali, možda, ima i drugdje slično. U najgorem slučaju, uvijek postoji mogućnost univerzalnih kombinacija. Alt+1…Alt+0. Opet, koristim Firefox i osobno mi ovaj problem nije značajan.

Međutim, značajan problem za mene je to što na poslu koristim Mac OS i tamo nisam mogao postaviti ništa slično. Alat wmctrl čini se da sam uspio instalirati, ali ne radi kako treba na Mac OS-u. Možda se nešto može učiniti s aplikacijom Automator, ali toliko usporava da nije prikladno koristiti ga čak i kada radi. Također, nisam mogao postaviti kombinacije tipki tako da rade u svim programima. Ako netko slučajno smisli rješenje - rado ću ga koristiti.

Umjesto zaključka

Iznenađujuće je mnogo riječi za takvu, naizgled, jednostavnu funkcionalnost. Želio sam prenijeti ideju a da ne opterećujem tekst, ali još nisam smislio kako jednostavnije ispričati. Možda bi u formatu videa bilo bolje, ali ovdje to baš ne vole.

Malo sam govorio o tome što se nalazi ispod haube skripte i kako je konfigurirati. Nisam ulazio u detalje same skripte, ali ona ima samo 50 redaka, nije teško razumjeti.

Nadam se da će netko još isprobati ovu ideju i možda je čak i cijeniti. Mogu reći da je skripta napisana prije otprilike 3 godine i to mi je VEOMA praktično. Toliko praktično da uzrokuje ozbiljnu nelagodu pri radu na tuđim računalima. I na radnom MacBooku.

Veza na skripte

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster