Controllo alternativo delle finestre in Linux

Io sono uno di quelli che imposta il Caps Lock per cambiare la lingua, perché è più 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 è la chiamata del menu contestuale, che è così superflua che viene rimossa da molti produttori di laptop. Quindi bisogna accontentarsi di ciò che c'è.

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: Alt+Tab, scorrere i desktop e così 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:

  • Alt+F: Firefox
  • Alt+D: Firefox (Navigazione in Private)
  • Alt+T: Terminale
  • Alt+M: Calcolatrice
  • Alt+E: IntelliJ Idea
  • e così via.

Inoltre, premendo, ad esempio, su Alt+M voglio vedere la calcolatrice indipendentemente dal fatto che questo programma sia attualmente in esecuzione. Se è avviato, la finestra deve ricevere il focus, altrimenti deve avviare il programma desiderato e ricevere il focus quando viene caricato.

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 Alt+1 fino a Alt+0, che non sono legate a nessun programma. Posso semplicemente premere Alt+1 e la finestra che attualmente ha il focus riceverà il focus quando premo. Alt+1.

In seguito ci sono descritte altre paia di funzionalità e una risposta su come fare tutto questo. Ma avverto subito che una personalizzazione del genere può creare forte dipendenza e persino crisi d'astinenza se si deve utilizzare Windows, Mac OS o anche un computer straniero con Linux.

In realtà, se ci pensiamo, non usiamo così tanti programmi quotidianamente. Browser, terminale, IDE, qualche messenger, gestore di file, calcolatrice e, a pensarci bene, è quasi tutto. Non servono così tante combinazioni di tasti per coprire il 95% delle attività quotidiane.

Per i programmi che hanno più finestre aperte, una di esse può essere impostata come principale. Ad esempio, se ho aperte più finestre di IntelliJ Idea, posso assegnarle a Alt+E. In condizioni normali, premendo su Alt+E si aprirà qualche finestra di questo programma, probabilmente quella che è stata aperta per prima. Tuttavia, se si preme su Alt+E quando una delle finestre di questo programma è già in primo piano, sarà proprio quella finestra a essere designata come principale e sarà a essa che verrà passato il focus durante le successive combinazioni di tasti.

La finestra principale può essere ripristinata. Per farlo, la combinazione deve prima essere azzerata e poi si può designare un'altra finestra come principale. Per azzerare la combinazione, è necessario premere la combinazione stessa e poi una combinazione speciale di ripristino, che per me è impostata su Alt+Backspace. Questo attiverà uno script che annullerà l’assegnazione della finestra principale per la combinazione precedente. Successivamente, si può designare una nuova finestra principale come descritto nel paragrafo precedente. Il ripristino della finestra associata alle combinazioni universali avviene in modo simile.

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

Per coloro che si sono stancati di leggere

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

Ma non sarà possibile installare e utilizzare subito. Prima sarà necessario capire come lo script trova la finestra desiderata. Senza questo, non sarà possibile indicare allo script dove deve passare il focus. È anche importante capire cosa fare se non si trova una finestra adatta.

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

Introduzione a wmctrl

Wmctrl è un'utilità da riga di comando per interagire con X Window Manager. È il programma chiave per lo script. Diamo un'occhiata rapida a come può essere utilizzato.

Per iniziare, visualizziamo un 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 Traduttore - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Migliori articoli dell'ultimo giorno / Habr - Mozilla Firefox (Navigazione privata)
...

Opzione -l visualizza un elenco di tutte le finestre aperte, e -h aggiunge all'output il nome della classe (skype.Skype, Navigator.Firefox ecc.). Ci serviranno l'id della finestra (colonna 1), il nome della classe (colonna 3) e il titolo della finestra (ultima colonna).

Si può provare ad attivare una finestra usando l'opzione -a:

$ wmctrl -a skype.Skype -x

Se tutto è andato secondo i piani, sullo schermo dovrebbe apparire una finestra di Skype. Se invece dell'opzione -x usa l'opzione -i, si può indicare 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. Di questo parleremo più avanti.

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

Fondamentalmente, l'idea principale dovrebbe essere già chiara. Nelle impostazioni dei tasti di scelta rapida globali per il tuo gestore di finestre, configuriamo la combinazione necessaria per eseguire lo script.

Come usare gli script

Per iniziare, è necessario installare gli strumenti da console wmctrl e xdotool:

$ sudo apt-get install wmctrl xdotool

Poi bisogna 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 cartella ~/bin non esiste, allora bisogna crearla e riavviarsi (o rieseguire il login), altrimenti ~/bin non verrà inclusa in $PATH. Se tutto è stato fatto correttamente, gli script dovrebbero essere disponibili dalla console e l'autocompletamento dovrebbe funzionare con il tasto Tab.

Lo script principale showwin accetta 2 parametri: il primo è il regex con cui cercheremo la finestra desiderata, e il secondo parametro è il comando da eseguire se non viene trovata la finestra richiesta.

Si può provare a eseguire lo script, per esempio:

$ showwin "Mozilla Firefox$" firefox

Se Firefox è installato, la finestra dovrebbe ricevere il focus. Anche se Firefox non era stato avviato, dovrebbe avviarsi.

Se funziona, si può provare a configurare l'esecuzione dei comandi su combinazioni. Nelle impostazioni dei tasti di scelta rapida globali aggiungiamo:

  • Alt+F: showwin «Mozilla Firefox$» firefox
  • Alt+D: showwin «Mozilla Firefox (Navigazione Privata)$» «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

E così via. Ognuno può personalizzare combinazioni di tasti e software come preferisce.
Se tutto funziona correttamente, con le combinazioni sopra indicate potremo passare tra le finestre semplicemente premendo i tasti.

Deluderò gli amanti del chrome: una normale finestra in incognito non può essere distinta dall'uscita wmctrl non è possibile, poiché hanno gli stessi nomi di classi e titoli delle finestre. Nei regex proposti, i simboli N* e I* sono necessari solo affinché questi regolari si distingano l'uno dall'altro e possano essere assegnati finestre diverse come principali.

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

Lo script showwin ha un'altra funzione. Quando viene chiamato con un parametro (in questo caso il parametro è 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.

Ho impostato queste combinazioni:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

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

Poi parlerò un po' di dettagli tecnici. Non è 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 :).

Come distinguere le diverse finestre di una sola applicazione

In linea di principio, il primo esempio «wmctrl -a skype.Skype -x» funzionava e può essere utilizzato. Ma diamo un'altra occhiata all'esempio con Firefox, che ha 2 finestre aperte:

0x04400003  0 Navigator.Firefox                   N/A Google Traduttore - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Le migliori pubblicazioni della giornata / Habr - Mozilla Firefox (Navigazione Privata)

La prima finestra è in modalità normale, mentre la seconda è in Navigazione Privata. Vorremmo considerare queste finestre come applicazioni diverse e passare a esse con diverse combinazioni di tasti.

È necessario complicare lo script che commuta le finestre. Ho utilizzato questa soluzione: elencare tutte le finestre, creare grep un regex, prendere la prima riga con head, estrarre la prima colonna (questo sarà l'id della finestra) usando cut, passare alla finestra per id.

Qui dovrebbe esserci una battuta sulle espressioni regolari e due problemi, ma in realtà non utilizzo nulla di complesso. Le espressioni regolari mi servono per poter indicare la fine della stringa (il simbolo «$») e distinguere «Mozilla Firefox$» da «Mozilla Firefox (Private Browsing)$».

Il comando appare più o meno così:

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

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

Quando le finestre dell'applicazione non sono distinguibili

Quindi, abbiamo imparato a dare il focus alla finestra dell'applicazione desiderata. Ma cosa fare se ci sono più di una finestra aperta dell'applicazione? A quale di esse dare il focus? Lo script sopra probabilmente darà il focus alla prima finestra aperta. Tuttavia, vorremmo maggiore flessibilità. Vorremmo avere la possibilità di ricordare quale finestra ci serve e passare esattamente a quella finestra.

L'idea era questa: Se vogliamo memorizzare per una combinazione di tasti una finestra specifica, dobbiamo premere quella combinazione quando la finestra desiderata è in focus. In seguito, premendo questa combinazione, il focus sarà dato proprio a quella finestra. Fintanto che la finestra non si chiude o non ripristiniamo questa combinazione nello script. showwinDetach.

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

  • Controllare se abbiamo già memorizzato in precedenza l'ID della finestra a cui dobbiamo dare il focus.
    Se lo abbiamo memorizzato e quella finestra esiste ancora, le diamo il focus e usciamo.
  • Guardiamo quale finestra è attualmente in focus, e se corrisponde alla nostra richiesta, memorizziamo il suo ID per poterci tornare in seguito e usciamo.
  • Passiamo a qualche finestra adatta se esiste o apriamo l'applicazione desiderata.

Possiamo scoprire quale finestra è attualmente in focus utilizzando l'utilità da console xdotool, convertendo la sua uscita in formato esadecimale:

$ printf "0xx" `xdotool getwindowfocus`

Memorizzare qualcosa in bash è più semplice creando file in un file system virtuale che si trova in memoria. In Ubuntu, questo è attivato per default in /dev/shm/. Non posso dire nulla su altri distribuzioni, spero che simile sia presente anche lì. Puoi controllare con il comando:

$ mount -l | grep tmpfs

Lo script creerà directory vuote in questa cartella, come queste: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Inoltre, ad ogni chiamata creerà un symlink /dev/shm/$USER/showwin/showwin_last in /dev/shm/$USER/showwin/$SEARCH_REGEX. Questo sarà necessario per rimuovere l'ID della finestra per una determinata combinazione utilizzando lo script showwinDetach.

Cosa si può migliorare

In primo luogo, gli script devono essere configurati manualmente. Sicuramente, a causa della necessità 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à di installare semplicemente un pacchetto e configurare tutto più facilmente, forse questo avrebbe guadagnato certa popolarità. Così, si potrebbe anche pensare che avrebbero integrato l'applicazione nei normali distribuzioni.

E, forse, potrebbe essere fatto in modo più semplice. Se dall'ID della finestra si può risalire all'ID del processo che l'ha creata, e dall'ID del processo si può capire quale comando lo ha generato, si potrebbe automatizzare la configurazione. In realtà, non mi sono dedicato a capire se quanto scritto in questo paragrafo sia fattibile. Il fatto è 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.

Un altro problema, come ho già scritto, è che in alcuni casi le finestre non possono essere distinte l'una dall'altra. Finora ho osservato questo solo con la modalità incognito in Chrome/Chromium, ma forse esistono simili situazioni in altri ambiti. In ogni caso, esiste sempre la possibilità di combinazioni universali Alt+1Alt+0. Ancora una volta, io uso Firefox e personalmente questo problema per me non è significativo.

Un problema significativo per me è che a lavoro utilizzo Mac OS e lì non sono riuscito a configurare nulla di simile. L'utilità wmctrl sembra che abbia potuto installarla, ma non funziona correttamente su Mac OS. Si può fare qualcosa con l'applicazione Automator, ma è così lenta che non è pratico usarla anche quando funziona. Non sono riuscito nemmeno a configurare le combinazioni di tasti affinché funzionassero in tutti i programmi. Se qualcuno riuscisse a trovare una soluzione – sarei felice di usarla.

In conclusione

È venuto fuori inaspettatamente un gran numero di parole per una funzionalità che, a prima vista, sembrava semplice. Volevo trasmettere l'idea senza appesantire il testo, ma non ho ancora trovato un modo per raccontarla più semplicemente. Forse, in formato video sarebbe stato meglio, ma qui non è così apprezzato.

Ho parlato un po' di cosa c'è sotto il cofano dello script e come configurarlo. Non sono andato nei dettagli dello script stesso, ma è di sole 50 righe, quindi è facile da comprendere.

Spero che qualcun altro provi questa idea e, forse, la valuta anche. Posso dire di me stesso che lo script è stato scritto circa 3 anni fa e mi è MOLTO comodo. Così tanto che crea un serio disagio quando lavoro su computer di altri. E 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