Controllo alternativo delle finestre in Linux

Sono uno di quelli che imposta il Caps Lock per cambiare la lingua, perché è noioso premere due tasti quando se ne può premere uno solo. Vorrei addirittura due tasti inutili: uno lo userei per attivare la lingua inglese e l'altro per la russa. Ma il secondo tasto inutile è quello che apre il menu contestuale, così superfluo che molti produttori di laptop lo rimuovono. Quindi mi devo accontentare di ciò che ho.

Inoltre, non voglio cercare le icone delle finestre nella barra delle applicazioni quando le cambio, cercando di cogliere i titoli mentre scorro tramite Alt+Tab, scorrere i desktop, ecc. Voglio premere una combinazione di tasti (idealmente solo uno, ma ormai non ci sono più tasti inutili) e andare subito nella finestra desiderata. Ad esempio così:

  • Alt+F: Firefox
  • Alt+D: Firefox (Navigazione Privata)
  • Alt+T: Terminale
  • Alt+M: Calcolatrice
  • Alt+E: IntelliJ Idea
  • ecc.

Inoltre, quando premo, ad esempio, su Alt+M voglio vedere la calcolatrice indipendentemente dal fatto che quel programma sia aperto al momento. Se è aperto, la finestra deve ricevere il focus, altrimenti deve avviarsi il programma necessario e ricevere il focus quando si carica.

Per le situazioni non coperte dallo scenario precedente, desidero avere delle combinazioni di tasti universali a cui posso facilmente assegnare qualsiasi delle finestre aperte. Ad esempio, ho assegnato 10 combinazioni da Alt+1 fino a Alt+0, che non sono legate a nessun programma specifico. Posso semplicemente premere Alt+1 e la finestra attualmente in focus riceverà il focus quando premo Alt+1.

Di seguito troverai la descrizione di alcune altre funzionalità e la risposta su come poterlo fare. Ma ti avverto subito che una personalizzazione del genere può creare una forte dipendenza e persino sintomi di astinenza quando è necessario usare Windows, Mac OS o anche un computer con Linux di qualcun altro.

In realtà, se ci pensiamo, non utilizziamo così tante applicazioni quotidianamente. Browser, terminale, IDE, un qualche messenger, file manager, calcolatrice e, probabilmente, è praticamente tutto. Non servono molte combinazioni di tasti per coprire il 95% delle attività quotidiane.

Per le applicazioni con più finestre aperte, una di esse può essere impostata come principale. Ad esempio, ho aperto diverse finestre di IntelliJ Idea, assegnate a Alt+E. In condizioni normali, quando si preme Alt+E si aprirà una finestra di questo programma, probabilmente quella che è stata aperta per prima. Tuttavia, se si preme Alt+E quando una delle finestre di questo programma è già in primo piano, quella finestra verrà impostata come principale e riceverà il focus durante le successive combinazioni di tasti.

È possibile ripristinare la finestra principale. Per farlo, è necessario prima resettare la combinazione e poi assegnare un'altra finestra come principale. Per resettare la combinazione, bisogna premere proprio la combinazione e poi una speciale combinazione di reset, che io ho impostato su Alt+Backspace. Questo attiverà uno script che annullerà l'assegnazione della finestra principale per la precedente combinazione. Successivamente, è possibile assegnare una nuova finestra principale come descritto nel paragrafo precedente. Il ripristino della finestra associata alle combinazioni universali avviene in modo analogo.

L'introduzione è stata lunga, ma volevo prima spiegare cosa faremo e poi come farlo.

Per coloro che si sono stufati di leggere

In breve, il link agli script è alla fine dell'articolo.

Tuttavia, non sarà possibile installarlo e utilizzarlo immediatamente. Prima dovremo capire come lo script trova la finestra desiderata. Senza questo, non saremo in grado di indicare allo script dove deve mettere a fuoco. Dobbiamo anche capire cosa fare se non viene trovata una finestra adeguata.

Inoltre, non mi soffermerò su come configurare l'esecuzione degli script tramite combinazioni di tasti. Ad esempio, in KDE si trova in Impostazioni di sistema → Scorciatoie → Scorciatoie personalizzate. Anche in altri gestori di finestre dovrebbe esserci questa opzione.

Introduzione a wmctrl

Wmctrl è un'utilità da riga di comando per interagire con il X Window Manager. È il programma chiave per lo script. Diamo un'occhiata veloce a come usarlo.

Per iniziare, visualizziamo l'elenco delle finestre aperte:

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Translate - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Le migliori pubblicazioni della giornata / Habr - Mozilla Firefox (Navigazione in incognito)
...

Opzione -l mostra un elenco di tutte le finestre aperte, e -x aggiunge al output il nome della classe (skype.Skype, Navigator.Firefox E così via). Qui abbiamo bisogno dell'id della finestra (colonna 1), del nome della classe (colonna 3) e del titolo della finestra (ultima colonna).

Puoi provare ad attivare una finestra con l'opzione -a:

$ wmctrl -a skype.Skype -x

Se tutto è andato secondo i piani, dovrebbe apparire la finestra di Skype. Se invece dell'opzione -x utilizzare l'opzione -i, puoi specificare l'id della finestra invece del nome della classe. Il problema con l'id è 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ò essere importante quando l'applicazione apre più di una finestra. Ne parleremo tra poco.

A questo punto, dobbiamo ricordare che cercheremo la finestra desiderata usando regex dall'output wmctrl -lx. Ma questo non significa che dobbiamo necessariamente usare qualcosa di complesso. Di solito è sufficiente il nome della classe o il titolo della finestra.

In linea di massima, l'idea principale dovrebbe essere chiara. Nelle impostazioni delle hotkey/globali del tuo gestore di finestre, impostiamo la combinazione desiderata per eseguire lo script.

Come utilizzare gli script

Per prima cosa, è necessario installare le utility da console wmctrl e xdotool:

$ sudo apt-get install wmctrl xdotool

Dopo, è necessario scaricare gli script e aggiungerli a $PATH. Di solito li metto in ~/bin:

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

Se la directory ~/bin non esiste, allora deve essere creata e bisogna riavviare (o effettuare nuovamente il login), altrimenti ~/bin non sarà presente in $PATH. Se tutto è stato fatto correttamente, gli script dovrebbero essere accessibili dalla console e l'autocompletamento dovrebbe funzionare con Tab.

Lo script principale showwin accetta 2 parametri: il primo è il regex, che useremo per cercare la finestra desiderata, e il secondo parametro è il comando da eseguire se non si trova la finestra richiesta.

Puoi provare a eseguire lo script, ad esempio:

$ showwin "Mozilla Firefox$" firefox

Se Firefox è installato, allora la finestra di Firefox dovrebbe ricevere il focus. Anche se Firefox non era già aperto, dovrebbe avviarsi.

Se funziona, puoi provare a impostare l'esecuzione dei comandi su combinazioni di tasti. Nelle impostazioni dei tasti rapidi globali aggiungi:

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

Eccetera. Ogni utente può personalizzare le combinazioni di tasti e il software come preferisce.
Se tutto è andato a buon fine, grazie alle combinazioni indicate sopra possiamo passare da una finestra all'altra semplicemente premendo i tasti.

Deluderò i fan di Chrome: non è possibile distinguere una finestra normale da una finestra in incognito per il loro output. wmctrl Non si può, perché hanno nomi di classi e titoli di finestra identici. Nei regex proposti, i caratteri N* e I* sono necessari solo per fare in modo che queste espressioni regolari si distinguano tra loro e possano essere assegnate come finestre principali diverse.

Per ripristinare la finestra principale della combinazione precedente (di fatto per il regex, che è stato chiamato l'ultima volta), è necessario eseguire lo script showwin showwinDetach. Ho assegnato questo script a una combinazione di tasti.Lo script Alt+Backspace.

ha un'altra funzione. Quando viene chiamato con un parametro (in questo caso il parametro è semplicemente un identificatore), non verifica affatto il regex, ma considera tutti le finestre idonee. Di per sé questo sembra inutile, tuttavia in questo modo possiamo impostare qualsiasi finestra come principale e passare rapidamente a quella finestra. showwin Ho impostato queste combinazioni:

Alt+1: showwin «CustomKey1»

  • Alt+2: showwin «CustomKey2»
  • Alt+0: showwin «CustomKey0»
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: mostrarewinDetach

In questo modo posso associare qualsiasi finestra a combinazioni Alt+1Alt+0. Basta premere Alt+1 associo la finestra attuale a questa combinazione. Posso annullare l'associazione premendo Alt+1, e poi Alt+Backspace. Oppure chiudere la finestra, funziona anche così.

Ora darò qualche dettaglio tecnico. Non è necessario leggerli, puoi semplicemente provare a configurare e vedere. Ma ti consiglio comunque di capire gli script altrui prima di eseguirli sul tuo computer :).

Come distinguere diverse finestre di una stessa applicazione

In linea di principio, il primo esempio «wmctrl -a skype.Skype -x» funzionava ed è utilizzabile. Ma diamo un'altra occhiata all'esempio con Firefox, in cui sono aperte 2 finestre:

0x04400003  0 Navigator.Firefox                   N/A Google Traduttore - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Le migliori pubblicazioni di oggi / Habr - Mozilla Firefox (Navigazione privata)

La prima finestra è in modalità normale, la seconda è in Navigazione privata. Queste finestre dovrebbero essere considerate applicazioni diverse e passare a esse con combinazioni di tasti diverse.

Dobbiamo complicare lo script che cambia le finestre. Ho utilizzato questa soluzione: visualizzare l'elenco di tutte le finestre, fare grep tramite regex, prendere la prima riga con head, ottenere la prima colonna (questo sarà l'id della finestra) con taglia, passare alla finestra per id.

Qui dovrebbe esserci una battuta sui regex e due problemi, ma in realtà non uso nulla di così complicato. Mi servono le regex per specificare la fine della stringa (il simbolo «$») e distinguere «Mozilla Firefox$» da «Mozilla Firefox (Navigazione Privata)$».

Il comando è più o meno così:

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

Qui si può già intuire la seconda caratteristica dello script: se grep non restituisce nulla, significa che l'applicazione desiderata non è aperta e deve essere avviata eseguendo il comando dal secondo parametro. E poi controllare periodicamente se la finestra desiderata si è aperta, per darle il focus. Non mi soffermerò su questo, chi è interessato può guardare il codice sorgente.

Quando le finestre dell'applicazione non sono distinguibili

Quindi, abbiamo imparato a passare il focus alla finestra dell'applicazione desiderata. Ma cosa succede se ci sono più finestre aperte dell'applicazione? A quale di esse passare il focus? Lo script sopra probabilmente passerà al primo finestra aperta. Tuttavia, vorremmo maggiore flessibilità. Vorremmo avere la possibilità di memorizzare quale finestra ci serve e passare esattamente a quella finestra.

L'idea era la seguente: se vogliamo memorizzare un certo finestra per una combinazione di tasti, dobbiamo premere quella combinazione quando la finestra desiderata è in focus. In seguito, premendo quella combinazione, il focus verrà dato a quella finestra specifica. Fino a quando la finestra non verrà chiusa o non faremo un reset per quella combinazione di script. Ho assegnato questo script a una combinazione di tasti..

L'algoritmo dello script showwin è all'incirca il seguente:

  • Controllare se abbiamo già memorizzato l'ID della finestra a cui dobbiamo passare il focus.
    Se l'abbiamo memorizzato e quella finestra esiste ancora, allora passiamo il focus ad essa e usciamo.
  • Controlliamo quale finestra è attualmente in focus e, se soddisfa la nostra richiesta, memorizziamo il suo ID per passare successivamente a essa e usciamo.
  • Passiamo a qualsiasi finestra appropriata se esiste o apriamo l'applicazione necessaria.

È possibile scoprire quale finestra è attiva utilizzando l'utilità da console xdotool, convertendo la sua uscita in formato esadecimale:

$ printf "0x%08x" `xdotool getwindowfocus`

Ricordare qualcosa in bash è più semplice creando file in un file system virtuale che si trova in memoria. Su Ubuntu, questo è già montato di default in /dev/shm/. Non posso dire nulla sugli altri distributori, spero che ci sia qualcosa di simile. Puoi controllare con il comando:

$ mount -l | grep tmpfs

Lo script creerà directory vuote in questa cartella, di questo tipo: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Inoltre, ad ogni chiamata, creerà un symlink /dev/shm/$USER/showwin/showwin_last con /dev/shm/$USER/showwin/$SEARCH_REGEX. Questo sarà necessario per rimuovere l'ID della finestra per una determinata combinazione utilizzando lo script Ho assegnato questo script a una combinazione di tasti..

Cosa può essere migliorato

In primo luogo, gli script devono essere configurati manualmente. Sicuramente, a causa della necessità di approfondire e fare molte operazioni manuali, molti di voi potrebbero anche non provare a configurare il sistema. Se ci fosse la possibilità di installare semplicemente un pacchetto e configurare tutto più facilmente, potrebbe diventare più popolare. E chissà, potrebbe anche essere integrato nelle distribuzioni standard.

E, forse, si potrebbe semplificare. Se attraverso l'ID della finestra si può risalire all'ID del processo che l'ha creata, e tramite l'ID del processo si può scoprire quale comando lo ha generato, si potrebbe automatizzare la configurazione. In realtà, non mi sono addentrato se ciò che ho scritto in questo paragrafo sia possibile. Il fatto è che personalmente mi va bene come funziona attualmente. Ma se a qualcun altro oltre a me il metodo appare comodo e qualcuno decide di migliorarlo, sarò felice di adottare la soluzione migliore.

Un altro problema, come ho già scritto, è che in alcuni casi non è possibile distinguere le finestre l'una dall'altra. Finora ho notato questo solo con incognito in Chrome/Chromium, ma potrebbe esserci qualcosa di simile anche altrove. In ogni caso, c'è sempre la possibilità di combinazioni universali. Alt+1Alt+0. Ancora una volta, uso Firefox e per me personalmente questo problema non è significativo.

Un vero problema per me è che per lavoro utilizzo Mac OS e lì non sono riuscito a configurare nulla di simile. L'utility wmctrl sembra che possa essere installata, ma non funziona correttamente su Mac OS. Qualcosa si può fare con l'applicazione. Automator, ma è così lento che non è comodo usarlo anche quando funziona. Non sono riuscito nemmeno a configurare le combinazioni di tasti per farle funzionare in tutti i programmi. Se qualcuno dovesse trovare una soluzione, sarei felice di usarla.

In conclusion

Sono state scritte inaspettatamente molte parole per una funzionalità che sembrava così semplice. Volevo esprimere l'idea senza sovraccaricare il testo, ma non ho ancora trovato un modo più semplice per raccontarlo. Forse in formato video sarebbe meglio, ma qui non è molto apprezzato.

Ho parlato un po' di cosa c'è sotto il cofano dello script e come configurarlo. Non sono entrato nei dettagli dello script, ma sono solo 50 righe, non è difficile capirlo.

Spero che qualcun altro provi questa idea e, forse, la apprezzi anche. Posso dire che lo script è stato scritto circa 3 anni fa e mi è molto comodo. Così comodo che provoca un serio disagio quando lavoro su computer di altre persone. E anche con il mio MacBook di lavoro.

Link agli script

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster