Alternatívne spravovanie okien v Linuxe

Som ten typ, ktorý si na Caps Lock nastavuje prepínanie klávesnice, pretože sa mi nechce stláčať 2 klávesy, keď môžem stlačiť jeden. Chcel by som dokonca 2 zbytočné klávesy: jednu by som použil na zapínanie anglickej klávesnice a druhú na ruskú. Ale druhá zbytočná klávesa je vyvolanie kontextového menu, ktoré je tak zbytočné, že ho mnohí výrobcovia notebookov odstránili. Takže mi nezostáva nič iné, len sa uspokojiť s tým, čo mám.

A navyše nechcem pri prepínaní okien hľadať ich ikony na paneli úloh, prichytiť pohľad na názvy pri prechádzaní cez Alt+Tab, listovať pracovné plochy a pod. Chcem stlačiť kombináciu klávesov (ideálne úplne jednu, ale už niet voľných zbytočných kláves) a hneď sa dostať do potrebného okna. Napríklad takto:

  • Alt+F: Firefox
  • Alt+D: Firefox (Súkromné prehliadanie)
  • Alt+T: Terminál
  • Alt+M: Kalkulačka
  • Alt+E: IntelliJ Idea
  • a pod.

Mimochodom, po stlačení napríklad na Alt+M chcem vidieť kalkulačku nezávisle od toho, či je táto aplikácia v aktuálnom momente spustená. Ak je spustená, oknu treba preniesť foco, a ak nie — spustiť požadovaný program a preniesť foco, keď sa načíta.

Na prípady, ktoré nie sú pokryté predchádzajúcim scenárom, chcem mať univerzálne kombinácie kláves, na ktoré môžem ľahko priradiť akékoľvek otvorené okná. Napríklad mám priradených 10 kombinácií od Alt+1 do Alt+0, ktoré nie sú viazané na žiadne programy. Môžem jednoducho stlačiť Alt+1 a okno, ktoré je teraz vo fókus, získa foco pri stlačení. Alt+1.

Pod článkom sú popísané ďalšie dve funkcie a odpoveď na to, ako to možno uskutočniť. Ale hneď varujem, že takáto prispôsobenie "pre seba" môže vyvolať silnú závislosť a dokonca abstinenčné príznaky pri potrebe používať Windows, Mac OS alebo dokonca cudzie počítače s Linuxom.

V skutočnosti, ak o tom premýšľame, toľko programov denne nepoužívame. Prehliadač, terminál, IDE, nejaký messenger, správcovský program, kalkulačka a asi to je prakticky všetko. Potrebujeme nie tak veľa kombinácií klávesov na pokrytie 95% každodenných úloh.

Pre programy, ktoré majú otvorených viacero okien, jedno z nich je možné určiť ako hlavné. Napríklad, ak je otvorených viac okien IntelliJ Idea, ktoré sú určené na Alt+E. V bežných podmienkach pri stlačení na Alt+E otvorí sa nejaké okno tejto aplikácie, pravdepodobne to, ktoré bolo otvorené ako prvé. Avšak, ak stlačíte Alt+E keď je jedno z okien tejto aplikácie už vo fókus, toto okno sa stane hlavným a to bude prijímať fokus pri nasledujúcich stlačeniach kombinácie.

Hlavné okno je možné premenovať. Na to je potrebné najprv resetovať kombináciu a potom zadefinovať iné okno ako hlavné. Na resetovanie kombinácie je potrebné stlačiť samotnú kombináciu a potom špeciálnu resetovaciu kombináciu, ktorú mám nastavenú na Alt+Backspace. To vyvolá skript, ktorý zruší predchádzajúce nastavenie hlavného okna pre predchádzajúcu kombináciu. Potom môžete definovať nové hlavné okno, ako bolo opísané v predchádzajúcom odseku. Resetovanie priradeného okna k univerzálnym kombináciám prebieha analogicky.

Úvod vyznel dlhšie, ale chcel som najprv povedať, čo budeme robiť, a potom vysvetliť, ako to robiť.

Pre tých, ktorí už majú dosť čítania

Ak to povieme stručne, odkaz na skripty je na konci článku.

Ale aj tak to nebude možné ihneď nainštalovať a používať. Najprv sa budete musieť dozvedieť, ako skript nájde potrebné okno. Bez toho nebude možné povedať skriptu, kam presne má predmet zamerať. A musíte pochopiť, čo robiť, ak sa náhodou nenašlo vhodné okno.

A taktiež sa nebudem podrobne zaoberať tým, ako nastaviť vykonávanie skriptov na stlačenie kombinácií kláves. Napríklad v KDE je to v System Settings → Shortcuts → Custom Shortcuts. V iných správcoch okien by to malo byť podobné.

Zoznámenie sa s wmctrl

Wmctrl — konzolová utilita na interakciu s X Window Managerom. Je to kľúčový program pre skript. Pozrime sa spoločne, ako ju možno používať.

Na začiatok vyhotovíme zoznam otvorených okien:

$ 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 Prevodník - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najlepšie príspevky za deň / Habr - Mozilla Firefox (Súkromné prehliadanie)
...

Možnosť -l vydáva zoznam všetkých otvorených okien a -x pridáva k výstupu názov triedy (skype.Skype, Navigator.Firefox atď.). Potrebujeme tu id okna (stĺpec 1), názov triedy (stĺpec 3) a názov okna (posledný stĺpec).

Môžete sa pokúsiť aktivovať nejaké okno pomocou možnosti -a:

$ wmctrl -a skype.Skype -x

Ak všetko prebehlo podľa plánu, malo by sa na obrazovke objaviť okno Skype. Ak namiesto možnosti -x použiť možnosť -i, tak namiesto názvu triedy môžeme uviesť id okna. Problém s id spočíva v tom, že id okna sa mení pri každom spustení aplikácie a vopred ho nemôžeme poznať. Na druhej strane tento atribút jednoznačne označuje okno, čo môže byť dôležité, keď aplikácia otvorí viac ako jedno okno. O tom neskôr.

V tomto kroku si musíme zapamätať, že budeme hľadať požadované okno pomocou regex z výstupu wmctrl -lx. Ale to neznamená, že musíme používať niečo zložité. Zvyčajne stačí názov triedy alebo názov okna.

V podstate by už mala byť základná myšlienka jasná. V nastaveniach globálnych klávesových skratiek pre váš správca okien nastavujeme potrebnú kombináciu na vykonanie skriptu.

Ako používať skripty

Najprv je potrebné nainštalovať príkazové nástroje wmctrl a xdotool:

$ sudo apt-get install wmctrl xdotool

Potom je potrebné stiahnuť skripty a pridať ich do $PATH. Zvyčajne ich umiestňujem do ~\/bin:

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

Ak adresár ~\/bin neexistoval, je potrebné ho vytvoriť a reštartovať (alebo sa prihlásiť znova), inak ~\/bin neprejde do $PATH. Ak je všetko urobené správne, skripty by mali byť dostupné z konzoly a mal by fungovať automatický doplnok cez Tab.

Hlavný skript showwin prijíma 2 parametre: prvý je regex, podľa ktorého budeme hľadať požadované okno, a druhý parameter je príkaz, ktorý sa má vykonať, ak požadované okno nebolo nájdené.

Môžete sa pokúsiť vykonať skript, napríklad:

$ showwin "Mozilla Firefox$" firefox

Ak je Firefox nainštalovaný, oknu by mal byť pridelený fokus. Aj keď bol Firefox nespustený, mal by sa spustiť.

Ak to fungovalo, môžete sa pokúsiť nastaviť vykonávanie príkazov na kombináciách. V nastaveniach globálnych klávesových skratiek pridáme:

  • Alt+F: showwin „Mozilla Firefox$“ firefox
  • Alt+D: showwin „Mozilla Firefox (Súkromné prehliadanie)$“ „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

A tak ďalej. Kombinácie klávesov a softvéru si môže každý nastaviť podľa svojich predstáv.
Ak sa všetko urobilo správne, podľa vyššie uvedených kombinácií sa môžeme medzi oknami prepínať jednoduchým stlačením klávesov.

Sklerí priaznivci chrómu: bežné okno nemožno rozlíšiť od inkognito okna podľa výstupu. wmctrl Nie, majú rovnaké názvy tried a hlavičky okna. V navrhovaných regexoch sú znaky N* a I* potrebné len na to, aby sa tieto regulárne výrazy navzájom odlišovali a mohli sme určiť rôzne okná ako hlavné.

Na resetovanie hlavného okna predchádzajúcej kombinácie (v skutočnosti pre regex, ktorý showwin bol spustený naposledy) je potrebné zavolať skript showwinDetach. Mám tento skript priradený k kombinácii klávesov. Alt+Backspace.

Skript showwin má ešte jednu funkciu. Keď je vyvolaný s jedným parametrom (v tomto prípade je parametre jednoducho identifikátor), tak vôbec nekontroluje regex, a všetky okná považuje za vhodné. To sa samo o sebe zdá byť zbytočné, avšak takto môžeme priradiť akékoľvek okno ako hlavné a rýchlo prechádzať práve k tomuto oknu.

Mám nastavené takéto kombinácie:

  • Alt+1: showwin „CustomKey1“
  • Alt+2: showwin „CustomKey2“
  • …
  • Alt+0: showwin „CustomKey0“
  • Alt+Backspace: showwinDetach

Takto môžem priradiť akékoľvek okná k kombináciám. Alt+1…Alt+0Jednoducho stlačením Alt+1 priraďujem aktuálne okno k tejto kombinácii. Zrušiť priradenie môžem stlačením Alt+1, a potom Alt+Backspace. Alebo zavrieť okno, aj to funguje.

Teraz poviem niečo technických detailoch. Tieto údaje môžete prehliadať, alebo si to môžete len vyskúšať nastaviť a pozrieť sa. Ale aj tak by som odporúčal najprv sa oboznámiť s cudzími skriptmi skôr, než ich spustíte na svojom počítači :).

Ako rozlišovať rôzne okná jednej aplikácie.

V podstate, najprv príklad "wmctrl -a skype.Skype -x" bol funkčný a možno ho využiť. Ale pozrime sa znova na príklad s Firefoxom, v ktorom sú otvorené 2 okná:

0x04400003  0 Navigator.Firefox                   N/A Google Prekladač - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Najlepšie publikácie za deň / Habr - Mozilla Firefox (Súkromné prehliadanie)

Prvé okno je v bežnom režime a druhé je v režime súkromného prehliadania. Tieto okná by sme chceli považovať za rôzne aplikácie a prepínať medzi nimi pomocou rôznych klávesových kombinácií.

Musíme skomplikovať skript, ktorý prepína okná. Použil som takéto riešenie: vypísať zoznam všetkých okien, spraviť grep podľa regexu, vziať prvý riadok pomocou head, získať prvý stĺpec (to bude id okna) pomocou cut, prepnúť na okno podľa id.

Tu by mal byť vtip o regulárnych výrazoch a dvoch problémoch, ale v skutočnosti nič zložité nepoužívam. Regulárky potrebujem na to, aby som mohol určiť koniec riadku (symbol „$“) a rozlíšiť „Mozilla Firefox$“ od „Mozilla Firefox (súkromné prehliadanie)$“.

Príkaz vyzerá asi takto:

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

Tu sa už dá domyslieť druhá špeciálnosť skriptu: ak grep nič nevydal, znamená to, že potrebná aplikácia nie je otvorená a je potrebné ju spustiť vykonaním príkazu z druhého parametra. A potom občas skontrolovať, či sa potrebné okno neotvorilo, aby sa mu mohol preniesť fokus. Nechcem sa na tom zastavovať, kto chce, ten si pozrie zdrojové kódy.

Keď sú okná aplikácie nerozlíšiteľné

Takže sme sa naučili prenášať fokus na okno požadovanej aplikácie. Ale čo ak je otvorených viac okien aplikácie? Ktorému z nich preniesť fokus? Skript vyššie pravdepodobne prenesie fokus na prvé otvorené okno. Avšak, chceli by sme väčšiu flexibilitu. Rádi by sme mali možnosť zapamätať si, ktoré konkrétne okno potrebujeme a presúvať sa presne k tomuto oknu.

Myšlienka bola taká: Ak chceme zapamätať pre kombináciu klávesov nejaké konkrétne okno, musíme stlačiť túto kombináciu vtedy, keď je potrebné okno v focuse. Následne pri stlačení tejto kombinácie sa fokus presunie práve na toto okno. Pokiaľ okno nezavrieme alebo neurobíme reset pre túto kombináciu skriptu. showwinDetach.

Algoritmus skriptu showwin je zhruba takýto:

  • Skontrolovať, či sme si predtým nezapamätali ID okna, ktorému treba preniesť fokus.
    Ak sme si ho zapamätali a také okno stále existuje, tak mu prenesieme fokus a odídeme.
  • Pozrieme sa, ktoré okno je teraz v focuse, a ak vyhovuje našej požiadavke, zapamätáme si ID na neskoršie prechody a odídeme.
  • Prejdeme k akémukoľvek vhodnému oknu, ak existuje, alebo otvoríme potrebnú aplikáciu.

Zistiť, ktoré okno je teraz v focuse, môžeme pomocou konzolovej utilitky xdotool, pričom jej výstup premeníme na hexadecimálny formát:

$ printf "0xx" `xdotool getwindowfocus`

Niečo pamätať v bash je najjednoduchšie vytváraním súborov vo virtuálnom súborovom systéme, ktorý je umiestnený v pamäti. V Ubuntu je taký pripojený predvolene na /dev/shm/. O iných distribúciách neviem povedať, dúfam, že niečo podobné existuje aj tam. Môžeme to skontrolovať príkazom:

$ mount -l | grep tmpfs

Skript bude vytvárať prázdne adresáre v tejto zložke, takéto: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Okrem toho pri každom volaní vytvorí symlink /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. To bude potrebné na to, aby bolo možné v prípade potreby odstrániť id okna pre určitú kombináciu pomocou skriptu showwinDetach.

Čo je možné zlepšiť

Po prvé, skripty je potrebné nastavovať ručne. Určite, kvôli potrebe porozumieť a robiť veľa ručne, mnohí z vás ani neskúsia nastaviť systém. Keby bola možnosť jednoducho nainštalovať balík a nastaviť všetko jednoduchšie, možno by získal určitú popularitu. A tam by sa mohlo stať, že by do štandardných distribúcií pridali aplikáciu.

A, možno, sa to dá urobiť jednoduchšie. Ak podľa id okna vieme zistiť id procesu, ktorý ho vytvoril, a podľa id procesu zistiť, aký príkaz ho vytvoril, mohli by sme automatizovať nastavenie. V skutočnosti som sa nezapájal, či je možné to, čo som napísal v tomto odseku. Ide o to, že osobne mi vyhovuje spôsob, akým to momentálne funguje. Ale ak to niekomu okrem mňa pripadá pohodlné a niekto to vylepší, rád budem používať lepšie riešenie.

Ďalší problém, ako som už písal, spočíva v tom, že v niektorých prípadoch sa okná nedajú rozlíšiť jedno od druhého. Zatiaľ som to pozoroval iba s incognito v chrome/chromium, ale možno existuje niečo podobné aj inde. V krajnom prípade je vždy možnosť univerzálnych kombinácií Alt+1…Alt+0. Opäť, používam Firefox a pre mňa osobne tento problém nie je zásadný.

Ale zásadný problém pre mňa je, že v práci používam Mac OS a tam som nič podobné nenastavil. Nástroj wmctrl nainštalovať sa zdalo byť možné, ale na Mac OS poriadne nefunguje. Niečo sa dá urobiť s aplikáciou Automator, ale tak spomaľuje, že sa s ním nedá pohodlne pracovať, aj keď funguje. Nastaviť klávesové skratky tak, aby fungovali vo všetkých programoch, sa mi tiež nepodarilo. Ak náhodou niekto vymyslí riešenie - budem rád, ak ho budem môcť použiť.

Na záver

Nevyhnutne sa mi podarilo napísať veľa slov pre takú, zdalo sa, jednoduchú funkcionalitu. Chcel som vyjadriť myšlienku a nezaplniť text, ale zatiaľ som nevymyslel, ako to povedať jednoduchšie. Možno by bolo lepšie to formou videa, ale tu to tak nemajú radi.

Trochu som prerozprával, čo sa skrýva pod kapotou skriptu a ako ho nastaviť. Do podrobností samotného skriptu som sa nepúšťal, ale má len 50 riadkov, takže sa v ňom dá ľahko zorientovať.

Dúfam, že niekto ešte vyskúša tento nápad a možno to aj ocení. Môžem povedať o sebe, že skript bol napísaný pred približne 3 rokmi a pre mňa je to VEĽMI pohodlné. Tak pohodlné, že spôsobuje vážne nepohodlie pri práci s cudzími počítačmi. A s pracovným MacBookom.

Odkaz na skripty

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster