{"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\/hr\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Alternativno upravljanje prozorima u Linuxu","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ja sam tip koji postavlja Caps Lock za prebacivanje jezika jer mi se ne da pritisnuti 2 tipke kada mogu pritisnuti jednu. \u010cak bih volio imati 2 bespotrebne tipke: jednu za uklju\u010divanje engleskog jezika, a drugu za ruski. No, druga bespotrebna tipka je poziv kontekstnog izbornika, koja je toliko bespotrebna da ju mnogi proizvo\u0111a\u010di prijenosnih ra\u010dunala gube. Tako da se moram zadovoljiti onim \u0161to imam. <\/p>\n<p><\/p>\n<p>Tako\u0111er, ne \u017eelim pri prebacivanju prozora tra\u017eiti njihove ikone na traci zadataka, uhvatiti pogled na nazive dok listam kroz <em>Alt+Tab<\/em>, listati radne povr\u0161ine itd. \u017delim pritisnuti kombinaciju tipki (idealno jednu, ali slobodnih bespotrebnih tipki vi\u0161e nema) i odmah do\u0107i do prozora koji mi treba. Na primjer ovako:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Privatno pretra\u017eivanje)<\/li>\n<li>Alt+T: Terminal<\/li>\n<li>Alt+M: Kalkulator<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>i tako dalje.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0160tovi\u0161e, pritiskom na, na primjer, <em>Alt+M<\/em> \u017eelim vidjeti kalkulator bez obzira na to je li ova aplikacija trenutno otvorena. Ako je otvorena, njenom prozoru treba dati fokus, a ako nije \u2014 pokrenuti potrebnu aplikaciju i prenijeti fokus kada se u\u010dita.<\/p>\n<p><\/p>\n<p>Za slu\u010dajeve koje ne pokriva prethodni scenarij, \u017eelim imati univerzalne kombinacije tipki na koje mogu lako dodijeliti bilo koji od otvorenih prozora. Na primjer, dodijelio sam 10 kombinacija od <em>Alt+1<\/em> do <em>Alt+0<\/em>, koje nisu vezane uz nikakve programe. Mogu jednostavno pritisnuti <em>Alt+1<\/em> i prozor koji je trenutno u fokusu dobit \u0107e fokus kada pritisnem <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>Ispod je opis jo\u0161 nekoliko zna\u010dajki i odgovor na to kako to mo\u017eete u\u010diniti. Ali odmah \u0107u upozoriti da ovakva prilagodba \"za sebe\" mo\u017ee izazvati sna\u017enu ovisnost i \u010dak simptome povla\u010denja ako treba koristiti Windows, Mac OS ili \u010dak tu\u0111i ra\u010dunalni sustav s Linuxom.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Zapravo, ako malo razmislimo, ne koristimo toliko programa svakodnevno. Preglednik, terminal, IDE, neki messenger, upravitelj datoteka, kalkulator i, mo\u017ee se re\u0107i, to je skoro sve. Nije potrebna velika koli\u010dina kombinacija tipki da pokrijemo 95% svakodnevnih zadataka.<\/p>\n<p><\/p>\n<p>Za programe koji imaju otvoreno vi\u0161e prozora, jedan od njih mo\u017ee biti postavljen kao glavni. Na primjer, otvoreno je vi\u0161e prozora IntelliJ Idea, postavljenih na <em>Alt+E<\/em>. U obi\u010dnim uvjetima pritiskom na <em>Alt+E<\/em> otvorit \u0107e se neki prozor te aplikacije, vjerovatno onaj koji je otvoren prvi. <em>Alt+E<\/em> Kada je jedno od prozora ovog programa ve\u0107 u fokusu, to \u0107e prozor biti ozna\u010den kao glavni i to\u010dno njemu \u0107e se davati fokus prilikom sljede\u0107ih pritisaka kombinacije. <\/p>\n<p><\/p>\n<p>Glavno prozor se mo\u017ee ponovo odrediti. Da bi to u\u010dinili, prvo je potrebno resetirati kombinaciju, a zatim odrediti drugo prozor kao glavno. Za resetiranje kombinacije potrebno je pritisnuti samu kombinaciju, a zatim posebnu resetiraju\u0107u kombinaciju, koja je kod mene postavljena na <em>Alt+Backspace<\/em>. Ovo \u0107e pokrenuti skriptu koja \u0107e ukloniti oznaku glavnog prozora za prethodnu kombinaciju. A zatim se mo\u017ee postaviti novo glavno prozor kao \u0161to je opisano u prethodnom odlomku. Resetiranje vezanog prozora na univerzalne kombinacije doga\u0111a se na sli\u010dan na\u010din.<\/p>\n<p><\/p>\n<p>Uvod je ispao dug, ali sam prvo \u017eelio re\u0107i \u0161to \u0107emo raditi, a zatim objasniti kako to raditi.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">Za one kojima je dosadno \u010ditati<\/h2>\n<p><\/p>\n<p>Ukratko, link na skripte je na kraju \u010dlanka.<\/p>\n<p><\/p>\n<p>No, isto tako, ne\u0107ete mo\u0107i odmah instalirati i koristiti. Prvo \u0107ete se morati sna\u0107i kako skripta nalazi potrebno prozor. Bez toga ne\u0107ete mo\u0107i odrediti skriptu kamo to\u010dno treba prenijeti fokus. I potrebno je razumjeti \u0161to u\u010diniti ako odgovaraju\u0107i prozor nije prona\u0111en.<\/p>\n<p><\/p>\n<p>Osim toga, ne\u0107u se usredoto\u010diti na to kako postaviti izvo\u0111enje skripti pritiskom na kombinacije tipki. Na primjer, u KDE-u to se nalazi u System Settings \u2192 Shortcuts \u2192 Custom Shortcuts. U drugim upraviteljima prozora bi to tako\u0111er trebalo biti.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Upoznavanje s wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> \u2014 konzolna alatka za interakciju s X Window Managerom. To je klju\u010dni program za skriptu. Pogledajmo kako se mo\u017ee koristiti.<\/p>\n<p><\/p>\n<p>Za po\u010detak, ispisujemo popis otvorenih prozora:<\/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 Google Translate - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Najbolje objave u posljednja 24 sata \/ Habr - Mozilla Firefox (Privatno pregledavanje)\n...<\/code><\/pre>\n<p><\/p>\n<p>Opcija <em>-l<\/em> ispisuje popis svih otvorenih prozora, a <em>-x<\/em> dodaje naziv klase (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> itd.). Ovdje \u0107e nam trebati id prozora (stupac 1), ime klase (stupac 3) i naziv prozora (posljednji stupac).<\/p>\n<p><\/p>\n<p>Mo\u017eete poku\u0161ati aktivirati neko prozor koriste\u0107i opciju <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>Ako je sve i\u0161lo po planu, na ekranu bi se trebala pojaviti prozor Skype. Ako umjesto opcije <em>-x<\/em> koristite opciju <em>-i<\/em>, umjesto imena klase, mo\u017eete navesti id prozora. Problem s id-om je taj \u0161to se id prozora mijenja prilikom svakog pokretanja aplikacije i ne mo\u017eemo ga unaprijed znati. S druge strane, ovaj atribut jasno identificira prozor, \u0161to mo\u017ee biti va\u017eno kada aplikacija otvara vi\u0161e prozora. O tome ne\u0161to kasnije.<\/p>\n<p><\/p>\n<p>U ovoj fazi trebamo zapamtiti da \u0107emo tra\u017eiti odgovaraju\u0107i prozor pomo\u0107u regexa na outputu <em>wmctrl -lx<\/em>. No, to ne zna\u010di da moramo nu\u017eno koristiti ne\u0161to slo\u017eeno. Obi\u010dno je dovoljno ime klase ili naziv prozora. <\/p>\n<p><\/p>\n<p>U principu, osnovna ideja bi trebala biti jasna. U postavkama globalnih pre\u010daca\/shortcuta za va\u0161 windows menad\u017eer postavite odgovaraju\u0107u kombinaciju za izvr\u0161avanje skripte.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">Kako koristiti skripte<\/h2>\n<p><\/p>\n<p>Prvo treba instalirati konzolne alate <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>Nakon toga treba preuzeti skripte i dodati ih u <em>$PATH<\/em>. Obi\u010dno ih stavljam u <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>Ako direktorij <em>~\/bin<\/em> nije postojao, treba ga stvoriti i ponovno se prijaviti (ili se ponovno prijaviti), ina\u010de <em>~\/bin<\/em> ne\u0107e biti dostupan u <em>$PATH<\/em>. Ako je sve u\u010dinjeno ispravno, skripte bi trebale biti dostupne iz konzole i automatsko dovr\u0161avanje Tab bi trebalo raditi.<\/p>\n<p><\/p>\n<p>Glavna skripta <strong>showwin<\/strong> prima 2 parametra: prvi je regex prema kojem \u0107emo tra\u017eiti odgovaraju\u0107i prozor, a drugi parametar je naredba koju treba izvr\u0161iti ako odgovaraju\u0107i prozor nije prona\u0111en. <\/p>\n<p><\/p>\n<p>Mo\u017eete poku\u0161ati izvr\u0161iti skriptu, na primjer:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>Ako je Firefox instaliran, prozoru bi trebao biti dodijeljen fokus. \u010cak i ako Firefox nije bio pokrenut, trebao bi se pokrenuti.<\/p>\n<p><\/p>\n<p>Ako je uspjelo, mo\u017eete poku\u0161ati postaviti izvr\u0161avanje naredbi na kombinacije tipki. U postavkama globalnih pre\u010daca\/shortcuta dodajemo:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: poka\u017ei prozor &#171;Mozilla Firefox$&#187; firefox<\/li>\n<li>Alt+D: poka\u017ei prozor &#171;Mozilla Firefox (Privatno pregledavanje)$&#187; &#171;firefox -private-window&#187;<\/li>\n<li>Alt+C: poka\u017ei prozor &#171;chromium-browser. Chromium-browser N*&#187; chromium-browser<\/li>\n<li>Alt+X: poka\u017ei prozor &#171;chromium-browser. Chromium-browser I*&#187; &#171;chromium-browser -incognito&#187;<\/li>\n<li>Alt+S: poka\u017ei prozor &#171;skype. Skype&#187; skypeforlinux<\/li>\n<li>Alt+E: poka\u017ei prozor &#171;jetbrains-idea&#187; idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>I tako dalje. Svaka osoba mo\u017ee postaviti kombinacije tipki i softvera prema vlastitim \u017eeljama.<br \/>\nAko je sve ispravno napravljeno, putem gore navedenih kombinacija mo\u017eemo se jednostavno prebacivati izme\u0111u prozora samo pritiskom na tipke.<\/p>\n<p><\/p>\n<p>Razo\u010darat \u0107u ljubitelje Chromea: obi\u010dno prozori ne mogu se razlikovati u inkognito na\u010dinu rada prema outputu. <em>wmctrl<\/em> nije mogu\u0107e, imaju iste nazive klasa i naslove prozora. U predlo\u017eenim regex simboli N* i I* su potrebni samo da bi se ti regularni izrazi razlikovali jedan od drugog i mogli smo im dodijeliti razli\u010dita glavna prozora.<\/p>\n<p><\/p>\n<p>Za resetiranje glavnog prozora prethodne kombinacije (zapravo za regex koji <strong>showwin<\/strong> je pozvan posljednji put) potrebno je pozvati skriptu <strong>showwinDetach<\/strong>. Ova skripta je dodijeljena na kombinaciju tipki <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>Skripta <strong>showwin<\/strong> ima jo\u0161 jednu funkciju. Kada se poziva s jednim parametrom (u ovom slu\u010daju je parametar samo identifikator), ne provjerava regex, nego smatra sva prozora prikladnima. To se samo po sebi \u010dini beskorisnim, me\u0111utim tako mo\u017eemo dodijeliti bilo koje prozore kao glavne i brzo se prebacivati na taj prozor.<\/p>\n<p><\/p>\n<p>Imam postavljene takve kombinacije:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: poka\u017ei prozor &#171;CustomKey1&#187;<\/li>\n<li>Alt+2: poka\u017ei prozor &#171;CustomKey2&#187;<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: poka\u017ei prozor &#171;CustomKey0&#187;<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>Tako mogu povezati bilo koje prozore s kombinacijama <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Samo pritiskom <em>Alt+1<\/em> povezujem trenutni prozor s tom kombinacijom. Poni\u0161titi vezu mogu pritiskom <em>Alt+1<\/em>, a zatim <em>Alt+Backspace<\/em>. Ili jednostavno zatvoriti prozor, to tako\u0111er funkcionira.<\/p>\n<p><\/p>\n<p>Nadalje \u0107u re\u0107i malo tehni\u010dkih detalja. To mo\u017eete ne \u010ditati, ve\u0107 jednostavno poku\u0161ati postaviti i vidjeti. No ipak bih preporu\u010dio razumjeti strane skripte prije nego \u0161to ih pokrenete na svom ra\u010dunalu :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">Kako razlikovati razli\u010dite prozore jedne aplikacije<\/h2>\n<p><\/p>\n<p>U biti, prvi primjer \u00abwmctrl -a skype.Skype -x\u00bb bio je operativan i mo\u017ee se koristiti. Ali hajde jo\u0161 jednom pogleda na primjer s Firefoxom, u kojem su otvorena 2 prozora:<\/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 Najbolje objave u posljednja 24 sata \/ Habr - Mozilla Firefox (Privatno pregledavanje)<\/code><\/pre>\n<p><\/p>\n<p>Prvi prozor \u2014 obi\u010dni na\u010din, a drugi \u2014 Privatno pregledavanje. Te prozore bismo \u017eeljeli smatrati razli\u010ditim aplikacijama i prebacivati se me\u0111u njima pomo\u0107u razli\u010ditih kombinacija tipki. <\/p>\n<p><\/p>\n<p>Potrebno je zakomplicirati skriptu koja prebacuje prozore. Koristio sam ovakvo rje\u0161enje: izlistati sve prozore, napraviti <em>grep<\/em> po regexu, uzeti prvu liniju pomo\u0107u <em>head<\/em>, izvu\u0107i prvu kolonu (to \u0107e biti id prozora) pomo\u0107u <em>cut<\/em>, prebaciti se na prozor prema id-u.<\/p>\n<p><\/p>\n<p>Ovdje bi trebala biti \u0161ala o regularnim izrazima i dva problema, ali zapravo ne koristim ni\u0161ta slo\u017eeno. Regularni izrazi su mi potrebni da bih mogao odrediti kraj niza (simbol \u00ab$\u00bb) i razlikovati \u00abMozilla Firefox$\u00bb od \u00abMozilla Firefox (Privatno pregledavanje)$\u00bb.<\/p>\n<p><\/p>\n<p>Tim izgleda otprilike ovako:<\/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>Ovdje se ve\u0107 mo\u017ee naslutiti druga osobina skripta: ako grep ni\u0161ta ne ispi\u0161e, to zna\u010di da potrebno aplikacija nije otvorena i treba je pokrenuti izvr\u0161avanjem komande iz drugog parametra. Zatim, periodi\u010dno treba provjeravati nije li se otvorio potreban prozor kako bismo mu dali fokus. Ne\u0107u se previ\u0161e zadr\u017eavati na tome, tko \u017eeli, neka pogleda izvorne datoteke.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">Kada su prozori aplikacije neprepoznatljivi<\/h2>\n<p><\/p>\n<p>Dakle, nau\u010dili smo kako prenijeti fokus na prozor potrebne aplikacije. No \u0161to ako je otvoreno vi\u0161e od jednog prozora te aplikacije? Na koji od njih prenijeti fokus? Skript iznad \u0107e vjerojatno prenijeti fokus na prvi otvoreni prozor. Me\u0111utim, \u017eelimo ve\u0107u fleksibilnost. Voljeli bismo imati mogu\u0107nost zapamtiti koji nam prozor treba i prebaciti se upravo na taj prozor.<\/p>\n<p><\/p>\n<p>Ideja je bila ovakva: Ako \u017eelimo zapamtiti odre\u0111eni prozor za kombinaciju tipki, trebamo pritisnuti tu kombinaciju kada je potreban prozor u fokusu. Kasnije, kada pritisnemo tu kombinaciju, fokus \u0107e se predavati upravo tom prozoru. Dok prozor ne zatvorimo ili ne resetiramo tu kombinaciju skripta. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>Algoritam skripta <strong>showwin<\/strong> pribli\u017eno je ovakav:<\/p>\n<p><\/p>\n<ul>\n<li>Provjeriti jesmo li ranije zapamtili id prozora kojem treba prenijeti fokus.<br \/>\nAko smo zapamtili i takav prozor jo\u0161 uvijek postoji, onda mu prenosimo fokus i izlazimo. <\/li>\n<li>Gledamo koji prozor je trenutno u fokusu, i ako odgovara na\u0161em zahtjevu, zapamtit \u0107emo njegov id za kasniji prijelaz na njega i izlazimo.<\/li>\n<li>Idemo na neki odgovaraju\u0107i prozor ako postoji, ili otvaramo potrebnu aplikaciju.<\/li>\n<\/ul>\n<p><\/p>\n<p>Saznati koji prozor je trenutno u fokusu mo\u017eemo pomo\u0107i konzolnoj utiliti xdotool, pretvaraju\u0107i njegov ispravak u heksadecimalni format:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>Ne\u0161to zapamtiti u bash-u najlak\u0161e je stvaranjem datoteka u virtualnom datote\u010dnom sustavu koji se nalazi u memoriji. U Ubuntuu je takav prema zadanim postavkama povezan u <em>\/dev\/shm\/<\/em>. O drugim distribucijama ne mogu ni\u0161ta re\u0107i, nadam se da ne\u0161to sli\u010dno tako\u0111er postoji. Mo\u017eete provjeriti komandom:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>Skript \u0107e stvarati prazne direktorije u ovoj mapi, ne\u0161to ovako: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Dodatno, pri svakom pozivu on \u0107e stvarati symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> na <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. To \u0107e biti potrebno kako bismo po potrebi uklonili id prozora za odre\u0111enu kombinaciju pomo\u0107u skripta. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">\u0160to se mo\u017ee pobolj\u0161ati<\/h2>\n<p><\/p>\n<p>Prvo, skripte je potrebno ru\u010dno konfigurirati. Vjerojatno, zbog potrebe da se razumije i u\u010dini mnogo toga ru\u010dno, mnogi od vas \u0107e se mo\u017eda obeshrabriti i ne poku\u0161ati postaviti sustav. Da postoji mogu\u0107nost jednostavnog instaliranja paketa i jednostavnije konfiguracije, to bi mo\u017eda steklo odre\u0111enu popularnost. A tko zna, mo\u017eda bi se \u010dak i aplikacija uvrstila u standardne distribucije.<\/p>\n<p><\/p>\n<p>I, vjerojatno, moglo bi se napraviti jednostavnije. Ako se po ID-u prozora mo\u017ee 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\u017eemo li ostvariti ono \u0161to sam napisao u ovom odlomku. \u010cinjenica je da meni osobno odgovara na\u010din na koji sada radi. No, ako se nekome osim mene \u010ditav pristup u\u010dini prakti\u010dnim i ako netko to pobolj\u0161a, rado \u0107u koristiti bolje rje\u0161enje.<\/p>\n<p><\/p>\n<p>Drugi problem, kao \u0161to sam ve\u0107 spomenuo, je taj \u0161to se u nekim slu\u010dajevima prozori ne mogu razlikovati jedni od drugih. Do sada sam takvo ne\u0161to primijetio samo s incognito prozorima u chrome\/chromiumu, ali, mo\u017eda, ima i drugdje sli\u010dno. U najgorem slu\u010daju, uvijek postoji mogu\u0107nost univerzalnih kombinacija. <em>Alt+1<\/em>\u2026<em>Alt+0<\/em>. Opet, koristim Firefox i osobno mi ovaj problem nije zna\u010dajan.<\/p>\n<p><\/p>\n<p>Me\u0111utim, zna\u010dajan problem za mene je to \u0161to na poslu koristim Mac OS i tamo nisam mogao postaviti ni\u0161ta sli\u010dno. Alat <em>wmctrl<\/em> \u010dini se da sam uspio instalirati, ali ne radi kako treba na Mac OS-u. Mo\u017eda se ne\u0161to mo\u017ee u\u010diniti s aplikacijom <em>Automator<\/em>, ali toliko usporava da nije prikladno koristiti ga \u010dak i kada radi. Tako\u0111er, nisam mogao postaviti kombinacije tipki tako da rade u svim programima. Ako netko slu\u010dajno smisli rje\u0161enje - rado \u0107u ga koristiti.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">Umjesto zaklju\u010dka<\/h2>\n<p><\/p>\n<p>Iznena\u0111uju\u0107e je mnogo rije\u010di za takvu, naizgled, jednostavnu funkcionalnost. \u017delio sam prenijeti ideju a da ne optere\u0107ujem tekst, ali jo\u0161 nisam smislio kako jednostavnije ispri\u010dati. Mo\u017eda bi u formatu videa bilo bolje, ali ovdje to ba\u0161 ne vole.<\/p>\n<p><\/p>\n<p>Malo sam govorio o tome \u0161to se nalazi ispod haube skripte i kako je konfigurirati. Nisam ulazio u detalje same skripte, ali ona ima samo 50 redaka, nije te\u0161ko razumjeti. <\/p>\n<p><\/p>\n<p>Nadam se da \u0107e netko jo\u0161 isprobati ovu ideju i mo\u017eda je \u010dak i cijeniti. Mogu re\u0107i da je skripta napisana prije otprilike 3 godine i to mi je VEOMA prakti\u010dno. Toliko prakti\u010dno da uzrokuje ozbiljnu nelagodu pri radu na tu\u0111im ra\u010dunalima. I na radnom MacBooku. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Veza na skripte<\/a><\/noindex><\/p>\n<p>Izvor: <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.5 - 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\/hr\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Alternativno upravljanje prozorima u Linuxu | ProHoster","description":"Ja sam jedan od onih koji na Caps Lock postavlja prebacivanje rasporeda tipkovnice zato \u0161to mi se ne da pritiskati 2 tipke kada mogu pritisnuti jednu.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}