{"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\/it\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","title":{"rendered":"Controllo alternativo delle finestre in Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Io sono uno di quelli che imposta il Caps Lock per cambiare la lingua, perch\u00e9 \u00e8 pi\u00f9 comodo premere un tasto piuttosto che due. Vorrei avere anche due tasti inutili: uno lo userei per attivare la lingua inglese e l'altro per la lingua russa. Ma il secondo tasto inutile \u00e8 la chiamata del menu contestuale, che \u00e8 cos\u00ec superflua che viene rimossa da molti produttori di laptop. Quindi bisogna accontentarsi di ci\u00f2 che c'\u00e8. <\/p>\n<p><\/p>\n<p>E non voglio nemmeno cercare le icone delle finestre nella barra delle applicazioni quando cambio finestra, ma desidero premere una combinazione di tasti (ideale sarebbe un solo tasto, ma non ci sono tasti inutili disponibili) e accedere immediatamente alla finestra desiderata. Ad esempio: <em>Alt+Tab<\/em>, scorrere i desktop e cos\u00ec via. Voglio premere una combinazione di tasti (ideale sarebbe un solo tasto, ma non ci sono tasti inutili disponibili) e entrare direttamente nella finestra che mi serve. Ad esempio:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: Firefox<\/li>\n<li>Alt+D: Firefox (Navigazione in Private)<\/li>\n<li>Alt+T: Terminale<\/li>\n<li>Alt+M: Calcolatrice<\/li>\n<li>Alt+E: IntelliJ Idea<\/li>\n<li>e cos\u00ec via.<\/li>\n<\/ul>\n<p><\/p>\n<p>Inoltre, premendo, ad esempio, su <em>Alt+M<\/em> voglio vedere la calcolatrice indipendentemente dal fatto che questo programma sia attualmente in esecuzione. Se \u00e8 avviato, la finestra deve ricevere il focus, altrimenti deve avviare il programma desiderato e ricevere il focus quando viene caricato.<\/p>\n<p><\/p>\n<p>Per i casi non coperti dallo scenario precedente, voglio avere combinazioni di tasti universali, a cui posso facilmente assegnare qualsiasi finestra aperta. Ad esempio, ho assegnato 10 combinazioni da <em>Alt+1<\/em> fino a <em>Alt+0<\/em>, che non sono legate a nessun programma. Posso semplicemente premere <em>Alt+1<\/em> e la finestra che attualmente ha il focus ricever\u00e0 il focus quando premo. <em>Alt+1<\/em>.<\/p>\n<p><\/p>\n<p>In seguito ci sono descritte altre paia di funzionalit\u00e0 e una risposta su come fare tutto questo. Ma avverto subito che una personalizzazione del genere pu\u00f2 creare forte dipendenza e persino crisi d'astinenza se si deve utilizzare Windows, Mac OS o anche un computer straniero con Linux.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>In realt\u00e0, se ci pensiamo, non usiamo cos\u00ec tanti programmi quotidianamente. Browser, terminale, IDE, qualche messenger, gestore di file, calcolatrice e, a pensarci bene, \u00e8 quasi tutto. Non servono cos\u00ec tante combinazioni di tasti per coprire il 95% delle attivit\u00e0 quotidiane.<\/p>\n<p><\/p>\n<p>Per i programmi che hanno pi\u00f9 finestre aperte, una di esse pu\u00f2 essere impostata come principale. Ad esempio, se ho aperte pi\u00f9 finestre di IntelliJ Idea, posso assegnarle a <em>Alt+E<\/em>. In condizioni normali, premendo su <em>Alt+E<\/em> si aprir\u00e0 qualche finestra di questo programma, probabilmente quella che \u00e8 stata aperta per prima. Tuttavia, se si preme su <em>Alt+E<\/em> quando una delle finestre di questo programma \u00e8 gi\u00e0 in primo piano, sar\u00e0 proprio quella finestra a essere designata come principale e sar\u00e0 a essa che verr\u00e0 passato il focus durante le successive combinazioni di tasti. <\/p>\n<p><\/p>\n<p>La finestra principale pu\u00f2 essere ripristinata. Per farlo, la combinazione deve prima essere azzerata e poi si pu\u00f2 designare un'altra finestra come principale. Per azzerare la combinazione, \u00e8 necessario premere la combinazione stessa e poi una combinazione speciale di ripristino, che per me \u00e8 impostata su <em>Alt+Backspace<\/em>. Questo attiver\u00e0 uno script che annuller\u00e0 l\u2019assegnazione della finestra principale per la combinazione precedente. Successivamente, si pu\u00f2 designare una nuova finestra principale come descritto nel paragrafo precedente. Il ripristino della finestra associata alle combinazioni universali avviene in modo simile.<\/p>\n<p><\/p>\n<p>L'introduzione \u00e8 stata lunga, ma volevo prima spiegare cosa faremo e poi come farlo.<\/p>\n<p><\/p>\n<h2 id=\"dlya-teh-komu-nadoelo-chitat\">Per coloro che si sono stancati di leggere<\/h2>\n<p><\/p>\n<p>In breve, il link agli script \u00e8 alla fine dell'articolo.<\/p>\n<p><\/p>\n<p>Ma non sar\u00e0 possibile installare e utilizzare subito. Prima sar\u00e0 necessario capire come lo script trova la finestra desiderata. Senza questo, non sar\u00e0 possibile indicare allo script dove deve passare il focus. \u00c8 anche importante capire cosa fare se non si trova una finestra adatta.<\/p>\n<p><\/p>\n<p>Inoltre, non mi soffermer\u00f2 su come configurare l'esecuzione degli script premendo combinazioni di tasti. Ad esempio, in KDE questo si trova in Impostazioni di sistema \u2192 Scorciatoie \u2192 Scorciatoie personalizzate. Anche in altri gestori di finestre dovrebbe esserci una cosa simile.<\/p>\n<p><\/p>\n<h2 id=\"znakomstvo-s-wmctrl\">Introduzione a wmctrl<\/h2>\n<p><\/p>\n<p><em>Wmctrl<\/em> \u00e8 un'utilit\u00e0 da riga di comando per interagire con X Window Manager. \u00c8 il programma chiave per lo script. Diamo un'occhiata rapida a come pu\u00f2 essere utilizzato.<\/p>\n<p><\/p>\n<p>Per iniziare, visualizziamo un elenco delle finestre aperte:<\/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 Traduttore - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Migliori articoli dell'ultimo giorno \/ Habr - Mozilla Firefox (Navigazione privata)\n...<\/code><\/pre>\n<p><\/p>\n<p>Opzione <em>-l<\/em> visualizza un elenco di tutte le finestre aperte, e <em>-h<\/em> aggiunge all'output il nome della classe (<em>skype.Skype<\/em>, <em>Navigator.Firefox<\/em> ecc.). Ci serviranno l'id della finestra (colonna 1), il nome della classe (colonna 3) e il titolo della finestra (ultima colonna).<\/p>\n<p><\/p>\n<p>Si pu\u00f2 provare ad attivare una finestra usando l'opzione <em>-a<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ wmctrl -a skype.Skype -x<\/code><\/pre>\n<p><\/p>\n<p>Se tutto \u00e8 andato secondo i piani, sullo schermo dovrebbe apparire una finestra di Skype. Se invece dell'opzione <em>-x<\/em> usa l'opzione <em>-i<\/em>, si pu\u00f2 indicare l'id della finestra invece del nome della classe. Il problema con l'id \u00e8 che cambia ad ogni avvio dell'applicazione e non possiamo conoscerlo in anticipo. D'altra parte, questo attributo indica in modo univoco la finestra, il che pu\u00f2 essere importante quando l'applicazione apre pi\u00f9 di una finestra. Di questo parleremo pi\u00f9 avanti.<\/p>\n<p><\/p>\n<p>A questo punto dobbiamo ricordare che cercheremo la finestra desiderata con un regex mediante l'output <em>wmctrl -lx<\/em>. Ma non significa che dobbiamo necessariamente usare qualcosa di complesso. Di solito \u00e8 sufficiente il nome della classe o il titolo della finestra. <\/p>\n<p><\/p>\n<p>Fondamentalmente, l'idea principale dovrebbe essere gi\u00e0 chiara. Nelle impostazioni dei tasti di scelta rapida globali per il tuo gestore di finestre, configuriamo la combinazione necessaria per eseguire lo script.<\/p>\n<p><\/p>\n<h2 id=\"kak-polzovatsya-skriptami\">Come usare gli script<\/h2>\n<p><\/p>\n<p>Per iniziare, \u00e8 necessario installare gli strumenti da console <em>wmctrl<\/em> e <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>Poi bisogna scaricare gli script e aggiungerli a <em>$PATH<\/em>. Di solito li metto in <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>Se la cartella <em>~\/bin<\/em> non esiste, allora bisogna crearla e riavviarsi (o rieseguire il login), altrimenti <em>~\/bin<\/em> non verr\u00e0 inclusa in <em>$PATH<\/em>. Se tutto \u00e8 stato fatto correttamente, gli script dovrebbero essere disponibili dalla console e l'autocompletamento dovrebbe funzionare con il tasto Tab.<\/p>\n<p><\/p>\n<p>Lo script principale <strong>showwin<\/strong> accetta 2 parametri: il primo \u00e8 il regex con cui cercheremo la finestra desiderata, e il secondo parametro \u00e8 il comando da eseguire se non viene trovata la finestra richiesta. <\/p>\n<p><\/p>\n<p>Si pu\u00f2 provare a eseguire lo script, per esempio:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ showwin \"Mozilla Firefox$\" firefox<\/code><\/pre>\n<p><\/p>\n<p>Se Firefox \u00e8 installato, la finestra dovrebbe ricevere il focus. Anche se Firefox non era stato avviato, dovrebbe avviarsi.<\/p>\n<p><\/p>\n<p>Se funziona, si pu\u00f2 provare a configurare l'esecuzione dei comandi su combinazioni. Nelle impostazioni dei tasti di scelta rapida globali aggiungiamo:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+F: mostra finestra &#171;Mozilla Firefox$&#187; firefox<\/li>\n<li>Alt+D: mostra finestra &#171;Mozilla Firefox (Navigazione Privata)$&#187; &#171;firefox -private-window&#187;<\/li>\n<li>Alt+C: mostra finestra &#171;chromium-browser.Chromium-browser N*&#187; chromium-browser<\/li>\n<li>Alt+X: mostra finestra &#171;chromium-browser.Chromium-browser I*&#187; &#171;chromium-browser -incognito&#187;<\/li>\n<li>Alt+S: mostra finestra &#171;skype.Skype&#187; skypeforlinux<\/li>\n<li>Alt+E: mostra finestra &#171;jetbrains-idea&#187; idea.sh<\/li>\n<\/ul>\n<p><\/p>\n<p>E cos\u00ec via. Ognuno pu\u00f2 personalizzare combinazioni di tasti e software come preferisce.<br \/>\nSe tutto funziona correttamente, con le combinazioni sopra indicate potremo passare tra le finestre semplicemente premendo i tasti.<\/p>\n<p><\/p>\n<p>Deluder\u00f2 gli amanti del chrome: una normale finestra in incognito non pu\u00f2 essere distinta dall'uscita <em>wmctrl<\/em> non \u00e8 possibile, poich\u00e9 hanno gli stessi nomi di classi e titoli delle finestre. Nei regex proposti, i simboli N* e I* sono necessari solo affinch\u00e9 questi regolari si distingano l'uno dall'altro e possano essere assegnati finestre diverse come principali.<\/p>\n<p><\/p>\n<p>Per ripristinare la finestra principale della combinazione precedente (di fatto per il regex che <strong>showwin<\/strong> \u00e8 stato chiamato l'ultima volta) \u00e8 necessario richiamare lo script <strong>showwinDetach<\/strong>. Ho assegnato questo script a una combinazione di tasti <em>Alt+Backspace<\/em>. <\/p>\n<p><\/p>\n<p>Lo script <strong>showwin<\/strong> ha un'altra funzione. Quando viene chiamato con un parametro (in questo caso il parametro \u00e8 semplicemente un identificatore), non controlla affatto il regex e considera tutte le finestre idonee. Questo potrebbe sembrare inutile, ma in questo modo possiamo assegnare qualsiasi finestra come principale e passare rapidamente a essa.<\/p>\n<p><\/p>\n<p>Ho impostato queste combinazioni:<\/p>\n<p><\/p>\n<ul>\n<li>Alt+1: mostra finestra &#171;CustomKey1&#187;<\/li>\n<li>Alt+2: mostra finestra &#171;CustomKey2&#187;<\/li>\n<li>\u2026<\/li>\n<li>Alt+0: mostra finestra &#171;CustomKey0&#187;<\/li>\n<li>Alt+Backspace: showwinDetach<\/li>\n<\/ul>\n<p><\/p>\n<p>In questo modo posso legare qualsiasi finestra a combinazioni <em>Alt+1<\/em>&#8230;<em>Alt+0<\/em>. Basta premere <em>Alt+1<\/em> associo la finestra corrente a questa combinazione. Posso annullare l'associazione premendo <em>Alt+1<\/em>, e poi <em>Alt+Backspace<\/em>. Oppure chiudere la finestra, funziona anche cos\u00ec.<\/p>\n<p><\/p>\n<p>Poi parler\u00f2 un po' di dettagli tecnici. Non \u00e8 necessario leggerli, puoi semplicemente provare a configurare e vedere. Ma consiglierei comunque di capire gli script di qualcun altro prima di eseguirli sul tuo computer :).<\/p>\n<p><\/p>\n<h2 id=\"kak-razlichat-raznye-okna-odnogo-prilozheniya\">Come distinguere le diverse finestre di una sola applicazione<\/h2>\n<p><\/p>\n<p>In linea di principio, il primo esempio \u00abwmctrl -a skype.Skype -x\u00bb funzionava e pu\u00f2 essere utilizzato. Ma diamo un'altra occhiata all'esempio con Firefox, che ha 2 finestre aperte:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">0x04400003  0 Navigator.Firefox                   N\/A Google Traduttore - Mozilla Firefox\n0x04400218  0 Navigator.Firefox                   N\/A Le migliori pubblicazioni della giornata \/ Habr - Mozilla Firefox (Navigazione Privata)<\/code><\/pre>\n<p><\/p>\n<p>La prima finestra \u00e8 in modalit\u00e0 normale, mentre la seconda \u00e8 in Navigazione Privata. Vorremmo considerare queste finestre come applicazioni diverse e passare a esse con diverse combinazioni di tasti. <\/p>\n<p><\/p>\n<p>\u00c8 necessario complicare lo script che commuta le finestre. Ho utilizzato questa soluzione: elencare tutte le finestre, creare <em>grep<\/em> un regex, prendere la prima riga con <em>head<\/em>, estrarre la prima colonna (questo sar\u00e0 l'id della finestra) usando <em>cut<\/em>, passare alla finestra per id.<\/p>\n<p><\/p>\n<p>Qui dovrebbe esserci una battuta sulle espressioni regolari e due problemi, ma in realt\u00e0 non utilizzo nulla di complesso. Le espressioni regolari mi servono per poter indicare la fine della stringa (il simbolo \u00ab$\u00bb) e distinguere \u00abMozilla Firefox$\u00bb da \u00abMozilla Firefox (Private Browsing)$\u00bb.<\/p>\n<p><\/p>\n<p>Il comando appare pi\u00f9 o meno cos\u00ec:<\/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>Gi\u00e0 qui si pu\u00f2 intuire la seconda caratteristica dello script: se grep non ha restituito nulla, significa che l'applicazione desiderata non \u00e8 aperta e deve essere avviata eseguendo il comando dal secondo parametro. E poi controllare periodicamente se \u00e8 stata aperta la finestra desiderata, per darle il focus. Non mi dilungher\u00f2 su questo, chi \u00e8 interessato pu\u00f2 guardare il codice sorgente.<\/p>\n<p><\/p>\n<h2 id=\"kogda-okna-prilozheniya-ne-razlichimy\">Quando le finestre dell'applicazione non sono distinguibili<\/h2>\n<p><\/p>\n<p>Quindi, abbiamo imparato a dare il focus alla finestra dell'applicazione desiderata. Ma cosa fare se ci sono pi\u00f9 di una finestra aperta dell'applicazione? A quale di esse dare il focus? Lo script sopra probabilmente dar\u00e0 il focus alla prima finestra aperta. Tuttavia, vorremmo maggiore flessibilit\u00e0. Vorremmo avere la possibilit\u00e0 di ricordare quale finestra ci serve e passare esattamente a quella finestra.<\/p>\n<p><\/p>\n<p>L'idea era questa: Se vogliamo memorizzare per una combinazione di tasti una finestra specifica, dobbiamo premere quella combinazione quando la finestra desiderata \u00e8 in focus. In seguito, premendo questa combinazione, il focus sar\u00e0 dato proprio a quella finestra. Fintanto che la finestra non si chiude o non ripristiniamo questa combinazione nello script. <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<p>L'algoritmo dello script <strong>showwin<\/strong> \u00e8 all'incirca il seguente:<\/p>\n<p><\/p>\n<ul>\n<li>Controllare se abbiamo gi\u00e0 memorizzato in precedenza l'ID della finestra a cui dobbiamo dare il focus.<br \/>\nSe lo abbiamo memorizzato e quella finestra esiste ancora, le diamo il focus e usciamo. <\/li>\n<li>Guardiamo quale finestra \u00e8 attualmente in focus, e se corrisponde alla nostra richiesta, memorizziamo il suo ID per poterci tornare in seguito e usciamo.<\/li>\n<li>Passiamo a qualche finestra adatta se esiste o apriamo l'applicazione desiderata.<\/li>\n<\/ul>\n<p><\/p>\n<p>Possiamo scoprire quale finestra \u00e8 attualmente in focus utilizzando l'utilit\u00e0 da console xdotool, convertendo la sua uscita in formato esadecimale:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ printf \"0xx\" `xdotool getwindowfocus`<\/code><\/pre>\n<p><\/p>\n<p>Memorizzare qualcosa in bash \u00e8 pi\u00f9 semplice creando file in un file system virtuale che si trova in memoria. In Ubuntu, questo \u00e8 attivato per default in <em>\/dev\/shm\/<\/em>. Non posso dire nulla su altri distribuzioni, spero che simile sia presente anche l\u00ec. Puoi controllare con il comando:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ mount -l | grep tmpfs<\/code><\/pre>\n<p><\/p>\n<p>Lo script creer\u00e0 directory vuote in questa cartella, come queste: <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX\/$WINDOW_ID<\/em>. Inoltre, ad ogni chiamata creer\u00e0 un symlink <em>\/dev\/shm\/$USER\/showwin\/showwin_last<\/em> in <em>\/dev\/shm\/$USER\/showwin\/$SEARCH_REGEX<\/em>. Questo sar\u00e0 necessario per rimuovere l'ID della finestra per una determinata combinazione utilizzando lo script <strong>showwinDetach<\/strong>.<\/p>\n<p><\/p>\n<h2 id=\"chto-mozhno-uluchshit\">Cosa si pu\u00f2 migliorare<\/h2>\n<p><\/p>\n<p>In primo luogo, gli script devono essere configurati manualmente. Sicuramente, a causa della necessit\u00e0 di entrare nei dettagli e fare molte cose manualmente, molti di voi potrebbero non provare nemmeno a configurare il sistema. Se ci fosse stata la possibilit\u00e0 di installare semplicemente un pacchetto e configurare tutto pi\u00f9 facilmente, forse questo avrebbe guadagnato certa popolarit\u00e0. Cos\u00ec, si potrebbe anche pensare che avrebbero integrato l'applicazione nei normali distribuzioni.<\/p>\n<p><\/p>\n<p>E, forse, potrebbe essere fatto in modo pi\u00f9 semplice. Se dall'ID della finestra si pu\u00f2 risalire all'ID del processo che l'ha creata, e dall'ID del processo si pu\u00f2 capire quale comando lo ha generato, si potrebbe automatizzare la configurazione. In realt\u00e0, non mi sono dedicato a capire se quanto scritto in questo paragrafo sia fattibile. Il fatto \u00e8 che, personalmente, mi va bene come funziona adesso. Ma se a qualcuno, oltre a me, l'approccio sembra conveniente e qualcuno lo migliora, sarei felice di usare la soluzione migliore.<\/p>\n<p><\/p>\n<p>Un altro problema, come ho gi\u00e0 scritto, \u00e8 che in alcuni casi le finestre non possono essere distinte l'una dall'altra. Finora ho osservato questo solo con la modalit\u00e0 incognito in Chrome\/Chromium, ma forse esistono simili situazioni in altri ambiti. In ogni caso, esiste sempre la possibilit\u00e0 di combinazioni universali <em>Alt+1<\/em>&#8230;<em>Alt+0<\/em>. Ancora una volta, io uso Firefox e personalmente questo problema per me non \u00e8 significativo.<\/p>\n<p><\/p>\n<p>Un problema significativo per me \u00e8 che a lavoro utilizzo Mac OS e l\u00ec non sono riuscito a configurare nulla di simile. L'utilit\u00e0 <em>wmctrl<\/em> sembra che abbia potuto installarla, ma non funziona correttamente su Mac OS. Si pu\u00f2 fare qualcosa con l'applicazione <em>Automator<\/em>, ma \u00e8 cos\u00ec lenta che non \u00e8 pratico usarla anche quando funziona. Non sono riuscito nemmeno a configurare le combinazioni di tasti affinch\u00e9 funzionassero in tutti i programmi. Se qualcuno riuscisse a trovare una soluzione \u2013 sarei felice di usarla.<\/p>\n<p><\/p>\n<h2 id=\"vmesto-zaklyucheniya\">In conclusione<\/h2>\n<p><\/p>\n<p>\u00c8 venuto fuori inaspettatamente un gran numero di parole per una funzionalit\u00e0 che, a prima vista, sembrava semplice. Volevo trasmettere l'idea senza appesantire il testo, ma non ho ancora trovato un modo per raccontarla pi\u00f9 semplicemente. Forse, in formato video sarebbe stato meglio, ma qui non \u00e8 cos\u00ec apprezzato.<\/p>\n<p><\/p>\n<p>Ho parlato un po' di cosa c'\u00e8 sotto il cofano dello script e come configurarlo. Non sono andato nei dettagli dello script stesso, ma \u00e8 di sole 50 righe, quindi \u00e8 facile da comprendere. <\/p>\n<p><\/p>\n<p>Spero che qualcun altro provi questa idea e, forse, la valuta anche. Posso dire di me stesso che lo script \u00e8 stato scritto circa 3 anni fa e mi \u00e8 MOLTO comodo. Cos\u00ec tanto che crea un serio disagio quando lavoro su computer di altri. E con il mio MacBook di lavoro. <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/masyamandev\/Showwin-script\">Link agli script<\/a><\/noindex><\/p>\n<p>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Gestione alternativa delle finestre in Linux | ProHoster","description":"Sono di quelli che impostano il Caps Lock per cambiare layout perch\u00e9 \u00e8 noioso premere 2 tasti quando si pu\u00f2 premere uno solo.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/alternativnoe-upravlenie-oknami-v-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/55206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=55206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/55206\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=55206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=55206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=55206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}