{"id":55206,"date":"2020-01-15T00:00:00","date_gmt":"2020-01-14T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/alternativnoe-upravlenie-oknami-v-linux"},"modified":"2020-02-18T14:03:18","modified_gmt":"2020-02-18T11:03:18","slug":"alternativnoe-upravlenie-oknami-v-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Alternatywne zarz\u0105dzanie oknami w Linuxie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jestem osob\u0105, kt\u00f3ra ustawia prze\u0142\u0105czanie uk\u0142adu na Caps Lock, poniewa\u017c leniwie naciskam dwa klawisze, gdy mog\u0119 naciska\u0107 jeden. Chcia\u0142bym nawet mie\u0107 dwa zb\u0119dne klawisze: jeden do w\u0142\u0105czania angielskiego uk\u0142adu, a drugi do rosyjskiego. Ale ten drugi zb\u0119dny klawisz to otwieranie menu kontekstowego, kt\u00f3re jest tak zb\u0119dne, \u017ce wielu producent\u00f3w laptop\u00f3w si\u0119 go pozbywa. Dlatego musz\u0119 zadowoli\u0107 si\u0119 tym, co mam. <\/p>\n<p><\/p>\n<p>I jeszcze nie chc\u0119 szuka\u0107 ikon okien na pasku zada\u0144 podczas ich prze\u0142\u0105czania, \u0142apa\u0107 wzrokiem nazw przegl\u0105daj\u0105c przez <em>Alt+Tab<\/em>, przegl\u0105da\u0107 biurka itp. Chc\u0119 nacisn\u0105\u0107 kombinacj\u0119 klawiszy (w idealnym przypadku jedn\u0105, ale nie ma ju\u017c wolnych zb\u0119dnych klawiszy) i od razu przej\u015b\u0107 do potrzebnego okna. Na przyk\u0142ad tak:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Przegl\u0105danie prywatne)<\/li>\n<li>Alt+T: Terminal<\/li>\n<li>Alt+M: Kalkulator<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>i tak dalej.<\/li>\n<\/ul>\n<p><\/p>\n<p>Przy czym, po naci\u015bni\u0119ciu, na przyk\u0142ad, na <em>Alt+M<\/em> chc\u0119 widzie\u0107 kalkulator niezale\u017cnie od tego, czy ta aplikacja jest aktualnie uruchomiona. Je\u015bli jest uruchomiona, okno powinno otrzyma\u0107 fokus, a je\u015bli nie \u2014 uruchomi\u0107 potrzebny program i przekaza\u0107 fokus, gdy si\u0119 za\u0142aduje.<\/p>\n<p><\/p>\n<p>Na przypadki, kt\u00f3re nie s\u0105 obj\u0119te poprzednim scenariuszem, chc\u0119 mie\u0107 uniwersalne kombinacje klawiszy, do kt\u00f3rych \u0142atwo mo\u017cna przypisa\u0107 dowolne z otwartych okien. Na przyk\u0142ad mam przypisane 10 kombinacji od <em>Alt+1<\/em> do <em>Alt+0<\/em>, kt\u00f3re nie s\u0105 przypisane do \u017cadnych program\u00f3w. Mog\u0119 po prostu nacisn\u0105\u0107 <em>Alt+1<\/em> i okno, kt\u00f3re jest teraz w fokusie, otrzyma fokus po naci\u015bni\u0119ciu <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>Pod spodem opis jeszcze kilku funkcji i odpowied\u017a na pytanie, jak to zrobi\u0107. Ale od razu ostrzegam, \u017ce taka personalizacja \u201epod siebie\u201d mo\u017ce wywo\u0142a\u0107 silne uzale\u017cnienie, a nawet syndrom odstawienia podczas korzystania z Windows, Mac OS lub nawet obcego komputera z Linuxem.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>W rzeczywisto\u015bci, je\u015bli si\u0119 nad tym zastanowi\u0107, nie u\u017cywamy zbyt wielu program\u00f3w na co dzie\u0144. Przegl\u0105darka, terminal, IDE, jaki\u015b komunikator, mened\u017cer plik\u00f3w, kalkulator i to chyba wszystko. Nie potrzebuj\u0119 zbyt wielu kombinacji klawiszy, aby pokry\u0107 95% codziennych zada\u0144.<\/p>\n<p><\/p>\n<p>Dla program\u00f3w, w kt\u00f3rych jest otwartych kilka okien, jedno z nich mo\u017cna ustawi\u0107 jako g\u0142\u00f3wne. Na przyk\u0142ad, gdy otwarte s\u0105 kilka okien IntelliJ Idea, przypisanych do <em>Alt+E<\/em>. W normalnych warunkach, naciskaj\u0105c <em>Alt+E<\/em> , otworzy si\u0119 jakie\u015b okno tego programu, najprawdopodobniej to, kt\u00f3re by\u0142o otwarte jako pierwsze. Jednak, je\u015bli naci\u015bniesz <em>Alt+E<\/em> Gdy jedno z okien programu jest ju\u017c w fokuse, to w\u0142a\u015bnie to okno zostanie oznaczone jako g\u0142\u00f3wne i to do niego b\u0119dzie przypisywany fokus przy kolejnych naci\u015bni\u0119ciach kombinacji. <\/p>\n<p><\/p>\n<p>G\u0142\u00f3wne okno mo\u017cna zmieni\u0107. W tym celu najpierw nale\u017cy resetowa\u0107 kombinacj\u0119, a nast\u0119pnie przypisa\u0107 inne okno jako g\u0142\u00f3wne. Aby zresetowa\u0107 kombinacj\u0119, trzeba wcisn\u0105\u0107 t\u0119 sam\u0105 kombinacj\u0119, a nast\u0119pnie specjaln\u0105 kombinacj\u0119 resetuj\u0105c\u0105, kt\u00f3r\u0105 mam przypisan\u0105 na <em>Alt+Backspace<\/em>. To wywo\u0142a skrypt, kt\u00f3ry anuluj\u0119 oznaczenie g\u0142\u00f3wnego okna dla poprzedniej kombinacji. Nast\u0119pnie mo\u017cna przypisa\u0107 nowe g\u0142\u00f3wne okno, tak jak opisano to w poprzednim akapicie. Reset przypisanego okna do uniwersalnych kombinacji odbywa si\u0119 analogicznie.<\/p>\n<p><\/p>\n<p>Wprowadzenie wysz\u0142o d\u0142ugie, ale chcia\u0142em najpierw opowiedzie\u0107, co b\u0119dziemy robi\u0107, a potem wyja\u015bni\u0107, jak to robi\u0107.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">Dla tych, kt\u00f3rzy maj\u0105 do\u015b\u0107 czytania<\/h2>\n<p><\/p>\n<p>M\u00f3wi\u0105c kr\u00f3tko, link do skrypt\u00f3w znajduje si\u0119 na ko\u0144cu artyku\u0142u.<\/p>\n<p><\/p>\n<p>Ale i tak od razu nie uda si\u0119 ich zainstalowa\u0107 i u\u017cywa\u0107. Najpierw trzeba zrozumie\u0107, jak skrypt znajduje odpowiednie okno. Bez tego nie uda si\u0119 wskaza\u0107 skryptowi, gdzie dok\u0142adnie nale\u017cy przekaza\u0107 fokus. I trzeba zrozumie\u0107, co zrobi\u0107, je\u015bli nagle nie ma odpowiedniego okna.<\/p>\n<p><\/p>\n<p>Nie b\u0119d\u0119 te\u017c zwraca\u0142 uwagi na to, jak konfigurowa\u0107 wykonanie skrypt\u00f3w przy naci\u015bni\u0119ciu kombinacji klawiszy. Na przyk\u0142ad, w KDE znajduje si\u0119 to w Ustawieniach systemu \u2192 Skr\u00f3ty \u2192 Niestandardowe skr\u00f3ty. W innych mened\u017cerach okien r\u00f3wnie\u017c powinno by\u0107 podobnie.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Poznawanie wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> to narz\u0119dzie konsolowe do interakcji z X Window Manager. To kluczowy program dla skryptu. Przejrzyjmy szybko, jak mo\u017cna go u\u017cywa\u0107.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek wy\u015bwietlmy list\u0119 otwartych okien:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -lx\n0x01e0000e -1 plasmashell.plasmashell N\/A Desktop \u2014 Plasma\n0x01e0001e -1 plasmashell.plasmashell N\/A Plasma\n0x03a00001 0 skype.Skype N\/A Skype\n0x04400003 0 Navigator.Firefox N\/A T\u0142umacz Google - Mozilla Firefox\n0x04400218 0 Navigator.Firefox N\/A Najlepsze publikacje za dob\u0119 \/ Habr - Mozilla Firefox (Przegl\u0105danie prywatne)\n...<\/code><\/pre>\n<p><\/p>\n<p>Opcja <em>-l<\/em> wy\u015bwietla list\u0119 wszystkich otwartych okien, a <em>-x<\/em> dodaje do wyj\u015bcia nazw\u0119 klasy (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> itd.). B\u0119dzie nam tutaj potrzebny identyfikator okna (kolumna 1), nazwa klasy (kolumna 3) oraz tytu\u0142 okna (ostatnia kolumna).<\/p>\n<p><\/p>\n<p>Mo\u017cna spr\u00f3bowa\u0107 aktywowa\u0107 jakie\u015b okno za pomoc\u0105 opcji <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>Je\u015bli wszystko posz\u0142o zgodnie z planem, na ekranie powinno pojawi\u0107 si\u0119 okno Skype. Je\u015bli zamiast opcji <em>-x<\/em> u\u017cyjesz opcji <em>-i<\/em>, zamiast nazwy klasy mo\u017cna u\u017cy\u0107 id okna. Problem z id polega na tym, \u017ce zmienia si\u0119 ono przy ka\u017cdym uruchomieniu aplikacji i nie mo\u017cemy go zna\u0107 z wyprzedzeniem. Z drugiej strony, ten atrybut jednoznacznie wskazuje na okno, co mo\u017ce by\u0107 wa\u017cne, gdy aplikacja otwiera wi\u0119cej ni\u017c jedno okno. O tym troszk\u0119 p\u00f3\u017aniej.<\/p>\n<p><\/p>\n<p>Na tym etapie musimy zapami\u0119ta\u0107, \u017ce b\u0119dziemy szuka\u0107 odpowiedniego okna za pomoc\u0105 regex w wyj\u015bciu <em>wmctrl -lx<\/em>. Ale to nie znaczy, \u017ce musimy u\u017cywa\u0107 czego\u015b skomplikowanego. Zazwyczaj wystarczy nazwa klasy lub tytu\u0142 okna. <\/p>\n<p><\/p>\n<p>W zasadzie g\u0142\u00f3wna idea ju\u017c powinna by\u0107 jasna. W ustawieniach globalnych skr\u00f3t\u00f3w klawiszowych dla twojego mened\u017cera okien konfigurujemy odpowiedni\u0105 kombinacj\u0119 do wykonania skryptu.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">Jak korzysta\u0107 ze skrypt\u00f3w<\/h2>\n<p><\/p>\n<p>Na pocz\u0105tku musisz zainstalowa\u0107 narz\u0119dzia konsolowe <em>wmctrl<\/em> i <em>xdotool<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get install wmctrl xdotool<\/code><\/pre>\n<p><\/p>\n<p>Nast\u0119pnie nale\u017cy pobra\u0107 skrypty i doda\u0107 je do <em>$PATH<\/em>. Zwykle umieszczam je w <em>~\/bin<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd ~\/bin\n$ git clone https:\/\/github.com\/masyamandev\/Showwin-script.git\n$ ln -s .\/Showwin-script\/showwin showwin\n$ ln -s .\/Showwin-script\/showwinDetach showwinDetach<\/code><\/pre>\n<p><\/p>\n<p>Je\u015bli katalog <em>~\/bin<\/em> nie istnia\u0142, nale\u017cy go utworzy\u0107 i zrestartowa\u0107 (lub si\u0119 przelogowa\u0107), w przeciwnym razie <em>~\/bin<\/em> nie b\u0119dzie dost\u0119pny w <em>$PATH<\/em>. Je\u015bli wszystko zosta\u0142o zrobione poprawnie, skrypty powinny by\u0107 dost\u0119pne z konsoli i powinna dzia\u0142a\u0107 autouzupe\u0142nianie po Tab.<\/p>\n<p><\/p>\n<p>G\u0142\u00f3wny skrypt <strong>showwin<\/strong> przyjmuje 2 parametry: pierwszy to regex, na podstawie kt\u00f3rego b\u0119dziemy szuka\u0107 odpowiedniego okna, a drugi parametr to polecenie, kt\u00f3re nale\u017cy wykona\u0107, je\u015bli odpowiednie okno nie zosta\u0142o znalezione. <\/p>\n<p><\/p>\n<p>Mo\u017cna spr\u00f3bowa\u0107 wykona\u0107 skrypt, na przyk\u0142ad:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>Je\u015bli Firefox jest zainstalowany, jego okno powinno uzyska\u0107 fokus. Nawet je\u015bli Firefox nie by\u0142 uruchomiony, powinien si\u0119 uruchomi\u0107.<\/p>\n<p><\/p>\n<p>Je\u015bli si\u0119 uda\u0142o, mo\u017cna spr\u00f3bowa\u0107 skonfigurowa\u0107 wykonanie polece\u0144 na kombinacjach klawiszy. W ustawieniach globalnych skr\u00f3t\u00f3w klawiszowych dodajemy:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: showwin &#171;Mozilla Firefox$&#187; firefox<\/li>\n<li>Alt+D: showwin &#171;Mozilla Firefox (Przegl\u0105danie prywatne)$&#187; &#171;firefox -private-window&#187;<\/li>\n<li>Alt+C: showwin &#171;chromium-browser.Chromium-browser N*&#187; chromium-browser<\/li>\n<li>Alt+X: showwin &#171;chromium-browser.Chromium-browser I*&#187; &#171;chromium-browser -incognito&#187;<\/li>\n<li>Alt+S: showwin &#171;skype.Skype&#187; skypeforlinux<\/li>\n<li>Alt+E: showwin &#171;jetbrains-idea&#187; idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>I tak dalej. Ka\u017cdy mo\u017ce skonfigurowa\u0107 kombinacje klawiszy i oprogramowanie wed\u0142ug w\u0142asnych upodoba\u0144.<br \/>\nJe\u015bli wszystko zosta\u0142o zrobione poprawnie, przy podanych kombinacjach klawiszy b\u0119dziemy mogli prze\u0142\u0105cza\u0107 si\u0119 mi\u0119dzy oknami prostym naci\u015bni\u0119ciem klawiszy.<\/p>\n<p><\/p>\n<p>Rozczaruj\u0119 mi\u0142o\u015bnik\u00f3w Chrome'a: zwyk\u0142e okno nie da si\u0119 odr\u00f3\u017cni\u0107 od incognito na podstawie wyj\u015bcia. <em>wmctrl<\/em> Nie mo\u017cna, maj\u0105 te same nazwy klas i nag\u0142\u00f3wki okien. W zaproponowanych wyra\u017ceniach regex znaki N* i I* s\u0105 potrzebne tylko po to, aby te regularne wyra\u017cenia si\u0119 r\u00f3\u017cni\u0142y, co pozwala na przypisanie r\u00f3\u017cnych okien jako g\u0142\u00f3wnych.<\/p>\n<p><\/p>\n<p>Aby zresetowa\u0107 g\u0142\u00f3wne okno poprzedniej kombinacji (w rzeczywisto\u015bci dla regex, kt\u00f3ry <strong>showwin<\/strong> by\u0142 wywo\u0142ywany ostatni raz), nale\u017cy wywo\u0142a\u0107 skrypt <strong>showwinDetach<\/strong>. Mam ten skrypt przypisany do kombinacji klawiszy <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>Skrypt <strong>showwin<\/strong> ma jeszcze jedn\u0105 funkcj\u0119. Kiedy jest wywo\u0142ywany z jednym parametrem (w tym przypadku parametrem jest po prostu identyfikator), to w og\u00f3le nie sprawdza regex, a wszystkie okna uwa\u017ca za odpowiednie. W sobie nie wydaje si\u0119 to przydatne, jednak w ten spos\u00f3b mo\u017cemy przypisa\u0107 ka\u017cde okno jako g\u0142\u00f3wne i szybko prze\u0142\u0105cza\u0107 si\u0119 do tego okna.<\/p>\n<p><\/p>\n<p>Mam skonfigurowane takie kombinacje:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: showwin &#171;CustomKey1&#187;<\/li>\n<li>Alt+2: showwin &#171;CustomKey2&#187;<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: showwin &#171;CustomKey0&#187;<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>W ten spos\u00f3b mog\u0119 przypisa\u0107 dowolne okna do kombinacji <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Po prostu naciskaj\u0105c <em>Alt+1<\/em> przypisuj\u0119 bie\u017c\u0105ce okno do tej kombinacji. Mo\u017cna anulowa\u0107 przypisanie naciskaj\u0105c <em>Alt+1<\/em>, a potem <em>Alt+Backspace<\/em>. Lub zamkn\u0105\u0107 okno, to te\u017c dzia\u0142a.<\/p>\n<p><\/p>\n<p>Teraz opowiem troch\u0119 o technicznych szczeg\u00f3\u0142ach. Mo\u017cna ich nie czyta\u0107, a po prostu spr\u00f3bowa\u0107 skonfigurowa\u0107 i zobaczy\u0107. Ale mimo wszystko poleca\u0142bym zrozumienie cudzych skrypt\u00f3w przed uruchomieniem ich na swoim komputerze :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">Jak rozr\u00f3\u017cnia\u0107 r\u00f3\u017cne okna jednej aplikacji<\/h2>\n<p><\/p>\n<p>W zasadzie, pierwszy przyk\u0142ad \u201ewmctrl -a skype.Skype -x\u201d by\u0142 dzia\u0142aj\u0105cy i mo\u017cna go u\u017cywa\u0107. Ale przyjrzyjmy si\u0119 jeszcze raz przyk\u0142adzie z Firefox, w kt\u00f3rym otwarte s\u0105 2 okna:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">0x04400003  0 Navigator.Firefox                   N\/A Google Translate - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Najlepsze publikacje za dzie\u0144 \/ Habr - Mozilla Firefox (Prywatne przegl\u0105danie)<\/code><\/pre>\n<p><\/p>\n<p>Pierwsze okno \u2014 zwyk\u0142y tryb, a drugie \u2014 Prywatne przegl\u0105danie. Te okna chcia\u0142bym traktowa\u0107 jako r\u00f3\u017cne aplikacje i prze\u0142\u0105cza\u0107 si\u0119 w nie za pomoc\u0105 r\u00f3\u017cnych kombinacji klawiszy. <\/p>\n<p><\/p>\n<p>Trzeba skomplikowa\u0107 skrypt prze\u0142\u0105czaj\u0105cy okna. U\u017cy\u0142em takiego rozwi\u0105zania: wy\u015bwietli\u0107 list\u0119 wszystkich okien, zrobi\u0107 <em>grep<\/em> na regex, wzi\u0105\u0107 pierwszy wiersz za pomoc\u0105 <em>head<\/em>, wydoby\u0107 pierwsz\u0105 kolumn\u0119 (to b\u0119dzie id okna) za pomoc\u0105 <em>cut<\/em>, prze\u0142\u0105czy\u0107 na okno po id.<\/p>\n<p><\/p>\n<p>Tutaj powinien by\u0107 \u017cart o wyra\u017ceniach regularnych i dw\u00f3ch problemach, ale w rzeczywisto\u015bci nie u\u017cywam niczego skomplikowanego. Wyra\u017cenia regularne s\u0105 mi potrzebne po to, aby mo\u017cna by\u0142o okre\u015bli\u0107 koniec linii (znak \u201e$\u201d) i rozr\u00f3\u017cni\u0107 \u201eMozilla Firefox$\u201d od \u201eMozilla Firefox (Prywatne przegl\u0105danie)$\u201d.<\/p>\n<p><\/p>\n<p>Zesp\u00f3\u0142 wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -i -a `wmctrl -lx | grep -i \"Mozilla Firefox$\" | head -1 | cut -d\" \" -f1`<\/code><\/pre>\n<p><\/p>\n<p>Ju\u017c mo\u017cna si\u0119 domy\u015bli\u0107 o drugiej charakterystyce skryptu: je\u015bli grep nic nie zwr\u00f3ci\u0142, oznacza to, \u017ce potrzebna aplikacja nie jest otwarta i nale\u017cy j\u0105 uruchomi\u0107, wykonuj\u0105c polecenie z drugiego parametru. A potem okresowo sprawdza\u0107, czy potrzebne okno si\u0119 nie otworzy\u0142o, aby przekaza\u0107 mu fokus. Nie b\u0119d\u0119 na tym skupia\u0107 uwagi, kto potrzebuje, ten spojrzy w \u017ar\u00f3d\u0142a.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">Gdy okna aplikacji s\u0105 nieodr\u00f3\u017cnialne<\/h2>\n<p><\/p>\n<p>Nauczyli\u015bmy si\u0119 przekazywa\u0107 fokus do okna potrzebnej aplikacji. Ale co, je\u015bli otwartych jest wi\u0119cej ni\u017c jedno okno danej aplikacji? Do kt\u00f3rego z nich przekaza\u0107 fokus? Powy\u017cszy skrypt prawdopodobnie przeka\u017ce fokus do pierwszego otwartego okna. Chcieliby\u015bmy jednak wi\u0119kszej elastyczno\u015bci. Chcemy mie\u0107 mo\u017cliwo\u015b\u0107 zapami\u0119tania, kt\u00f3re dok\u0142adnie okno potrzebujemy, i prze\u0142\u0105czania si\u0119 do tego okna.<\/p>\n<p><\/p>\n<p>Pomys\u0142 by\u0142 taki: Je\u015bli chcemy zapami\u0119ta\u0107 dla kombinacji klawiszy jakie\u015b konkretne okno, musimy nacisn\u0105\u0107 t\u0119 kombinacj\u0119 wtedy, gdy to okno jest w fokusie. W kolejnych naci\u015bni\u0119ciach tej kombinacji fokus b\u0119dzie przekazywany w\u0142a\u015bnie temu oknu, dop\u00f3ki okno si\u0119 nie zamknie lub nie zresetujemy tej kombinacji skryptu. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>Algorytm skryptu <strong>showwin<\/strong> wygl\u0105da mniej wi\u0119cej tak:<\/p>\n<p><\/p>\n<ul>\n<li>Sprawd\u017a, czy wcze\u015bniej zapami\u0119tali\u015bmy id okna, kt\u00f3remu nale\u017cy przekaza\u0107 fokus.<br \/>\nJe\u015bli zapami\u0119tali\u015bmy i takie okno nadal istnieje, przekazujemy mu fokus i wychodzimy. <\/li>\n<li>Patrzymy, kt\u00f3re okno jest aktualnie w fokusie, a je\u015bli spe\u0142nia nasze oczekiwania, zapami\u0119tujemy jego id do przysz\u0142ego prze\u0142\u0105czania si\u0119 do niego i wychodzimy.<\/li>\n<li>Przechodzimy do jakiegokolwiek odpowiedniego okna, je\u015bli istnieje, lub otwieramy potrzebn\u0105 aplikacj\u0119.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mo\u017cemy uzyska\u0107 informacje o tym, kt\u00f3re okno jest aktualnie w fokusie, za pomoc\u0105 narz\u0119dzia konsolowego xdotool, przekszta\u0142caj\u0105c jego wyj\u015bcie na format szesnastkowy:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>Cokolwiek zapami\u0119tywa\u0107 w bashu naj\u0142atwiej tworz\u0105c pliki w wirtualnym systemie plik\u00f3w znajduj\u0105cym si\u0119 w pami\u0119ci. W Ubuntu taki system jest pod\u0142\u0105czony domy\u015blnie w <em>\/dev\/shm\/<\/em>. O innych dystrybucjach nic nie mog\u0119 powiedzie\u0107, mam nadziej\u0119, \u017ce takie rozwi\u0105zanie r\u00f3wnie\u017c tam istnieje. Mo\u017cna to sprawdzi\u0107 poleceniem:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>Skrypt b\u0119dzie tworzy\u0107 puste katalogi w tej folderze, takie jak: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Dodatkowo przy ka\u017cdym wywo\u0142aniu b\u0119dzie tworzy\u0107 symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> na <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. B\u0119dzie to potrzebne, aby w razie potrzeby usun\u0105\u0107 id okna dla okre\u015blonej kombinacji za pomoc\u0105 skryptu. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">Co mo\u017cna poprawi\u0107<\/h2>\n<p><\/p>\n<p>Po pierwsze, skrypty musz\u0105 by\u0107 konfigurowane r\u0119cznie. Z pewno\u015bci\u0105, z powodu potrzeby zaanga\u017cowania si\u0119 i wykonania wielu czynno\u015bci samodzielnie, wielu z was nawet nie spr\u00f3buje skonfigurowa\u0107 systemu. Gdyby by\u0142a mo\u017cliwo\u015b\u0107 po prostu zainstalowania pakietu i \u0142atwej konfiguracji wszystkiego, to by\u0107 mo\u017ce zyska\u0142by pewn\u0105 popularno\u015b\u0107. A wtedy z pewno\u015bci\u0105 znalaz\u0142oby si\u0119 w standardowych dystrybucjach aplikacja.<\/p>\n<p><\/p>\n<p>I by\u0107 mo\u017ce mo\u017cna to zrobi\u0107 pro\u015bciej. Je\u015bli po identyfikatorze okna mo\u017cna by\u0142oby pozna\u0107 identyfikator procesu, kt\u00f3ry je stworzy\u0142, a po identyfikatorze procesu dowiedzie\u0107 si\u0119, kt\u00f3ra komenda go stworzy\u0142a, mo\u017cna by by\u0142o zautomatyzowa\u0107 konfiguracj\u0119. W rzeczywisto\u015bci nie zg\u0142\u0119bia\u0142em tej kwestii, czy to, co napisa\u0142em w tym akapicie, jest mo\u017cliwe. Chodzi o to, \u017ce osobi\u015bcie zadowala mnie to, jak to dzia\u0142a teraz. Ale je\u015bli kto\u015b poza mn\u0105 uzna ten spos\u00f3b za wygodny i uda mu si\u0119 go poprawi\u0107, ch\u0119tnie skorzystam z lepszego rozwi\u0105zania.<\/p>\n<p><\/p>\n<p>Innym problemem, jak ju\u017c pisa\u0142em, jest to, \u017ce w niekt\u00f3rych przypadkach okna nie mog\u0105 by\u0107 od siebie odr\u00f3\u017cniane. Na razie zaobserwowa\u0142em to tylko w trybie incognito w Chrome\/Chromium, ale by\u0107 mo\u017ce gdzie indziej te\u017c takie co\u015b wyst\u0119puje. W ostateczno\u015bci zawsze s\u0105 uniwersalne kombinacje klawiszy. <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>Znowu, korzystam z Firefoksa i dla mnie ta kwestia nie jest istotna.<\/p>\n<p><\/p>\n<p>Natomiast powa\u017cnym problemem dla mnie jest to, \u017ce w pracy u\u017cywam Mac OS i nie uda\u0142o mi si\u0119 tam skonfigurowa\u0107 nic podobnego. Narz\u0119dzie <em>wmctrl<\/em> wydaje si\u0119, \u017ce mog\u0142em zainstalowa\u0107, ale nie dzia\u0142a ono dobrze na Mac OS. Co\u015b mo\u017cna zrobi\u0107 z aplikacj\u0105 <em>Automator<\/em>, ale tak strasznie si\u0119 zacina, \u017ce korzystanie z niej jest niewygodne nawet, gdy dzia\u0142a. Nie uda\u0142o mi si\u0119 tak\u017ce skonfigurowa\u0107 kombinacji klawiszy, aby dzia\u0142a\u0142y we wszystkich programach. Je\u015bli kto\u015b wymy\u015bli rozwi\u0105zanie \u2013 z ch\u0119ci\u0105 z niego skorzystam.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">Zamiast zako\u0144czenia<\/h2>\n<p><\/p>\n<p>Niespodziewanie wysz\u0142o mi sporo s\u0142\u00f3w na temat tak zdawa\u0142oby si\u0119 prostej funkcjonalno\u015bci. Chcia\u0142em przekaza\u0107 pomys\u0142 i nie przeci\u0105\u017ca\u0107 tekstu, ale na razie nie wymy\u015bli\u0142em, jak \u0142atwiej to opowiedzie\u0107. Mo\u017ce w formacie wideo by\u0142oby lepiej, ale tutaj tego nie lubi\u0105.<\/p>\n<p><\/p>\n<p>Troch\u0119 opowiedzia\u0142em o tym, co kryje si\u0119 w skrypcie i jak go skonfigurowa\u0107. Nie wdawa\u0142em si\u0119 w szczeg\u00f3\u0142y samego skryptu, ale ma on zaledwie 50 linii, wi\u0119c \u0142atwo si\u0119 w nim odnale\u017a\u0107. <\/p>\n<p><\/p>\n<p>Mam nadziej\u0119, \u017ce kto\u015b jeszcze przetestuje ten pomys\u0142 i by\u0107 mo\u017ce go doceni. Mog\u0119 powiedzie\u0107, \u017ce skrypt zosta\u0142 napisany oko\u0142o 3 lata temu i jest dla mnie BARDZO wygodny. Tak wygodny, \u017ce odczuwam powa\u017cny dyskomfort podczas pracy na obcych komputerach. I z moim s\u0142u\u017cbowym MacBookiem. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Link do skrypt\u00f3w<\/a><\/noindex><\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483846\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443. \u042f \u0431\u044b \u0434\u0430\u0436\u0435 \u0445\u043e\u0442\u0435\u043b 2 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438: \u043e\u0434\u043d\u0443 \u0431\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438, \u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u0439. \u041d\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55206","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-14T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Alternatywne zarz\u0105dzanie oknami w Linuxie | ProHoster","description":"Jestem jedn\u0105 z tych os\u00f3b, kt\u00f3re ustawiaj\u0105 prze\u0142\u0105czanie uk\u0142adu na Caps Lock, poniewa\u017c leniwie naciskam 2 klawisze, gdy mo\u017cna nacisn\u0105\u0107 jeden.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430\u043c\u0438 \u0432 Linux | ProHoster","og:description":"\u042f \u0438\u0437 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 Caps Lock \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c 2 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c \u043e\u0434\u043d\u0443.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-14T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55206","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:48:29","updated":"2022-09-30 14:18:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}