Gestione alternativa delle finestre in Linux

Sono uno di quelli che impostano Caps Lock per cambiare layout perché sono troppo pigro per premere 2 tasti quando posso premerne uno. Vorrei anche 2 tasti non necessari: ne userei uno per attivare il layout inglese e il secondo per il russo. Ma il secondo tasto non necessario è richiamare il menu contestuale, che è così inutile che molti produttori di laptop lo eliminano. Quindi devi accontentarti di quello che hai.

Inoltre, non voglio cercare le loro icone sulla barra delle applicazioni quando si cambia finestra o individuare i nomi durante lo scorrimento Alt + Tab, scorrere i desktop, ecc. Voglio premere una combinazione di tasti (idealmente solo una, ma non ci sono più tasti gratuiti non necessari) e accedere immediatamente alla finestra di cui ho bisogno. Ad esempio in questo modo:

  • Alt+F: Firefox
  • Alt+D: Firefox (navigazione privata)
  • Alt+T: terminale
  • Alt+M: Calcolatrice
  • Alt+E: Idea IntelliJ
  • eccetera.

Inoltre, premendo, ad esempio, su Alt+M Voglio vedere la calcolatrice indipendentemente dal fatto che questo programma sia attualmente in esecuzione. Se è in esecuzione, è necessario focalizzare la sua finestra e, in caso contrario, eseguire il programma desiderato e trasferire il focus quando viene caricato.

Per i casi non coperti dallo script precedente, voglio avere combinazioni di tasti universali che possano essere facilmente assegnate a qualsiasi finestra aperta. Ad esempio, ho 10 combinazioni assegnate da Alt + 1 a Alt + 0, che non sono legati ad alcun programma. Posso semplicemente fare clic Alt + 1 e la finestra attualmente a fuoco verrà messa a fuoco quando si fa clic Alt + 1.

Sotto il taglio c'è una descrizione di un paio di altre funzionalità e una risposta a come farlo. Ma ti avvertirò immediatamente che tale personalizzazione "per te stesso" può causare grave dipendenza e persino astinenza se hai bisogno di utilizzare Windows, Mac OS o anche il computer di qualcun altro con Linux.

In effetti, se ci pensi, non utilizziamo così tanti programmi ogni giorno. Un browser, un terminale, un IDE, una sorta di messenger, un file manager, una calcolatrice e, forse, è quasi tutto. Non sono necessarie molte combinazioni di tasti per coprire il 95% delle attività quotidiane.

Per i programmi che hanno più finestre aperte, una di esse può essere designata come principale. Ad esempio, hai più finestre IntelliJ Idea aperte e assegnate Alt + E. In condizioni normali, quando si preme Alt + E si aprirà una finestra di questo programma, molto probabilmente quella aperta per prima. Tuttavia, se fai clic su Alt + E quando una delle finestre di questo programma è già focalizzata, allora questa particolare finestra verrà assegnata come principale e sarà quella che verrà messa a fuoco quando verranno premute le combinazioni successive.

La finestra principale può essere riassegnata. Per fare ciò, devi prima reimpostare la combinazione, quindi assegnarle un'altra finestra come finestra principale. Per ripristinare una combinazione, è necessario premere la combinazione stessa, quindi una speciale combinazione di ripristino a cui l'ho assegnata Alt+Backspace. Questo chiamerà uno script che annullerà l'assegnazione della finestra principale per la combinazione precedente. E poi puoi assegnare una nuova finestra principale come descritto nel paragrafo precedente. La reimpostazione di una finestra collegata su combinazioni universali avviene allo stesso modo.

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

Per chi è stanco di leggere

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

Ma non sarai comunque in grado di installarlo e utilizzarlo subito. Dovrai prima capire come lo script trova la finestra desiderata. Senza questo, non sarà possibile dire alla sceneggiatura dove esattamente deve essere trasferito il focus. E devi capire cosa fare se all'improvviso non viene trovata una finestra adatta.

E non mi concentrerò su come configurare l'esecuzione degli script premendo combinazioni di tasti. Ad esempio, in KDE è in Impostazioni di sistema → Scorciatoie → Scorciatoie personalizzate. Questo dovrebbe essere il caso anche in altri gestori di finestre.

Presentazione di wmctrl

Wmctrl — utilità della console per interagire con X Window Manager. Questo è il programma chiave per lo script. Diamo una rapida occhiata a come puoi usarlo.

Innanzitutto, visualizziamo un elenco di 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 Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

Opzione -l visualizza un elenco di tutte le finestre aperte e -NS aggiunge il nome della classe all'output (skype.Skype, Navigator.Firefox eccetera). Qui abbiamo bisogno dell'ID della finestra (colonna 1), del nome della classe (colonna 3) e del nome della finestra (ultima colonna).

Puoi provare ad attivare qualche finestra usando l'opzione -a:

$ wmctrl -a skype.Skype -x

Se tutto è andato secondo i piani, sullo schermo dovrebbe apparire la finestra di Skype. Se invece dell'opzione -x utilizzare l'opzione -i, quindi al posto del nome della classe puoi specificare l'id della finestra. Il problema con id è che l'id della finestra cambia ogni volta che si avvia l'applicazione e non possiamo saperlo in anticipo. D'altro canto, questo attributo identifica in modo univoco una finestra, il che può essere importante quando un'applicazione apre più di una finestra. Ne parleremo più avanti un po'.

In questa fase dobbiamo ricordare che cercheremo la finestra desiderata utilizzando regex in uscita wmctrl -lx. Ma ciò non significa che dobbiamo usare qualcosa di complicato. Di solito è sufficiente il nome della classe o della finestra.

Fondamentalmente l’idea principale dovrebbe essere già chiara. Nelle impostazioni globali dei tasti di scelta rapida/scorciatoie per il tuo gestore di finestre, configura la combinazione richiesta per eseguire lo script.

Come utilizzare gli script

Per prima cosa devi installare le utilità della console wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Successivamente è necessario scaricare gli script e aggiungerli a $ PERCORSO. Di solito li inserisco ~/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 era presente, è necessario crearlo e riavviare (o effettuare nuovamente l'accesso), altrimenti ~/bin non colpirà $ PERCORSO. Se tutto è stato eseguito correttamente, gli script dovrebbero essere accessibili dalla console e il completamento tramite scheda dovrebbe funzionare.

Sceneggiatura principale showwin accetta 2 parametri: il primo è una regex, con la quale cercheremo la finestra richiesta, e il secondo parametro è un comando che deve essere eseguito se la finestra richiesta non viene trovata.

Puoi provare a eseguire uno script, ad esempio:

$ showwin "Mozilla Firefox$" firefox

Se Firefox è installato, la sua finestra dovrebbe essere focalizzata. Anche se Firefox non fosse in esecuzione, dovrebbe essere avviato.

Se funziona, puoi provare a configurare l'esecuzione dei comandi sulle combinazioni. Nelle impostazioni globali dei tasti di scelta rapida/scorciatoie aggiungi:

  • Alt+F: mostra il firefox “Mozilla Firefox$”.
  • Alt+D: showwin "Mozilla Firefox (navigazione privata)$" "firefox -private-window"
  • Alt+C: showwin "browser-cromo.Browser-cromo N*" browser-cromo
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: mostrawin “skype.Skype” skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

Ecc. Tutti possono configurare combinazioni di tasti e software come meglio credono.
Se tutto ha funzionato correttamente, utilizzando le combinazioni di cui sopra saremo in grado di passare da una finestra all'altra semplicemente premendo i tasti.

Deluderò gli amanti di Chrome: può distinguere in incognito una finestra normale dal suo output wmctrl Non puoi, hanno gli stessi nomi di classe e titoli di finestra. Nella regex proposta, i caratteri N* e I* sono necessari solo affinché queste espressioni regolari differiscano l'una dall'altra e possano essere assegnate come finestre principali.

Per reimpostare la finestra principale della combinazione precedente (infatti per le regex, which showwin chiamato l'ultima volta) è necessario chiamare lo script showwinDetach. Ho questo script assegnato a una combinazione di tasti Alt+Backspace.

Alla sceneggiatura showwin c'è un'altra funzione. Quando viene chiamato con un parametro (in questo caso il parametro è solo un identificatore), non controlla affatto la regex, ma considera adatte tutte le finestre. Di per sé questo sembra inutile, ma in questo modo possiamo designare qualsiasi finestra come principale e passare rapidamente a quella particolare finestra.

Ho configurato le seguenti combinazioni:

  • Alt+1: mostrawin "CustomKey1"
  • Alt+2: mostrawin "CustomKey2"
  • ...
  • Alt+0: mostrawin "CustomKey0"
  • Alt+Backspace: mostrawinDetach

In questo modo posso associare qualsiasi finestra alle combinazioni Alt + 1...Alt + 0. Semplicemente facendo clic Alt + 1 Lego la finestra corrente a questa combinazione. Posso annullare l'associazione facendo clic Alt + 1e poi Alt+Backspace. Oppure chiudi la finestra, funziona anche questo.

Successivamente vi dirò alcuni dettagli tecnici. Non devi leggerli, ma prova solo a impostarli e vedere. Ma consiglierei comunque di comprendere gli script di altre persone prima di eseguirli sul tuo computer :).

Come distinguere tra diverse finestre della stessa applicazione

In linea di principio, il primo esempio "wmctrl -a skype.Skype -x" funzionava e può essere utilizzato. Ma torniamo all'esempio con Firefox, in cui sono aperte 2 finestre:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

La prima finestra è la modalità normale e la seconda è la navigazione privata. Vorrei considerare queste finestre come applicazioni diverse e passare ad esse utilizzando diverse combinazioni di tasti.

È necessario complicare lo script che cambia finestra. Ho usato questa soluzione: visualizza un elenco di tutte le finestre, fai grep da regex, prendi la prima riga con capo, ottieni la prima colonna (questo sarà l'ID della finestra) utilizzando taglio, passa alla finestra tramite id.

Dovrebbe esserci una battuta sulle espressioni regolari e due problemi, ma in realtà non sto usando nulla di complicato. Ho bisogno di espressioni regolari per poter indicare la fine della riga (il simbolo "$") e distinguere "Mozilla Firefox$" da "Mozilla Firefox (navigazione privata)$".

Il comando è simile al seguente:

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

Qui puoi già intuire la seconda caratteristica dello script: se grep non restituisce nulla, l'applicazione desiderata non è aperta ed è necessario avviarla eseguendo il comando dal secondo parametro. Quindi controlla periodicamente se la finestra richiesta è stata aperta per trasferire lo stato attivo su di essa. Non mi concentrerò su questo; chiunque ne abbia bisogno guarderà le fonti.

Quando le finestre dell'applicazione non sono distinguibili

Quindi, abbiamo imparato come trasferire lo stato attivo sulla finestra dell'applicazione desiderata. Ma cosa succede se un'applicazione ha più di una finestra aperta? Su quale dovrei concentrarmi? Molto probabilmente lo script sopra verrà trasferito alla prima finestra aperta. Vorremmo però maggiore flessibilità. Vorrei essere in grado di ricordare quale finestra abbiamo bisogno e passare a quella particolare finestra.

L'idea era questa: se vogliamo ricordare una finestra specifica per una combinazione di tasti, dobbiamo premere questa combinazione quando la finestra desiderata è a fuoco. In futuro, quando si preme questa combinazione, il focus verrà focalizzato su questa finestra. Fino alla chiusura della finestra o al ripristino di questa combinazione di script showwinDetach.

Algoritmo di script showwin qualcosa come questo:

  • Controlla se abbiamo precedentemente ricordato l'id della finestra su cui trasferire il focus.
    Se ricordi ed esiste ancora una finestra del genere, trasferiamo lo stato attivo su di essa e usciamo.
  • Osserviamo quale finestra è attualmente attiva e, se corrisponde alla nostra richiesta, ricordiamo il suo ID per accedervi in ​​futuro ed uscire.
  • Andiamo almeno in una finestra adatta se esiste o apriamo l'applicazione desiderata.

Puoi scoprire quale finestra è attualmente attiva utilizzando l'utilità della console xdotool convertendo il suo output in formato esadecimale:

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

Il modo più semplice per ricordare qualcosa in bash è creare file in un file system virtuale situato in memoria. In Ubuntu questo è abilitato per impostazione predefinita in /dev/shm/. Non posso dire nulla su altre distribuzioni, spero che ci sia anche qualcosa di simile. Puoi guardare con il comando:

$ mount -l | grep tmpfs

Lo script creerà directory vuote in questa cartella, in questo modo: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Inoltre, ogni volta che viene chiamato creerà un collegamento simbolico /dev/shm/$USER/showwin/showwin_last su /dev/shm/$USER/showwin/$SEARCH_REGEX. Ciò sarà necessario per rimuovere, se necessario, l'ID della finestra per una determinata combinazione utilizzando uno script showwinDetach.

Cosa si può migliorare

Innanzitutto, gli script devono essere configurati manualmente. Sicuramente, a causa della necessità di approfondire e fare molto con le proprie mani, molti di voi non proveranno nemmeno a configurare il sistema. Se fosse possibile installare semplicemente il pacchetto e configurare tutto più facilmente, forse guadagnerebbe una certa popolarità. E poi guarda, l'applicazione verrebbe rilasciata nelle distribuzioni standard.

E forse si può fare più facilmente. Se dall'id di una finestra puoi scoprire l'id del processo che l'ha creata e dall'id del processo puoi scoprire quale comando l'ha creata, allora sarebbe possibile automatizzare la configurazione. Infatti non ho capito se quello che ho scritto in questo paragrafo fosse possibile. Il fatto è che personalmente sono soddisfatto di come funziona adesso. Ma se qualcuno diverso da me trova conveniente l'intero approccio e qualcuno lo migliora, allora sarò felice di utilizzare una soluzione migliore.

Un altro problema, come ho già scritto, è che in alcuni casi le finestre non si distinguono l'una dall'altra. Finora l'ho osservato solo con la navigazione in incognito in chrome/chromium, ma forse c'è qualcosa di simile da qualche altra parte. Come ultima risorsa esiste sempre la possibilità di combinazioni universali Alt + 1...Alt + 0. Ancora una volta, utilizzo Firefox e per me personalmente questo problema non è significativo.

Ma il problema più significativo per me è che utilizzo Mac OS per lavoro e lì non riesco a configurare nulla del genere. utilità wmctrl Penso di essere riuscito a installarlo, ma non funziona davvero su Mac OS. Si può fare qualcosa con l'applicazione Automator, ma è così lento che non è comodo da usare anche quando funziona. Inoltre, non sono riuscito a impostare combinazioni di tasti in modo che funzionassero in tutti i programmi. Se qualcuno improvvisamente trova una soluzione, sarò felice di usarla.

Invece di una conclusione

Si è rivelato essere un numero inaspettatamente elevato di parole per una funzionalità così apparentemente semplice. Volevo trasmettere l’idea e non sovraccaricare il testo, ma non ho ancora capito come raccontarla in modo più semplice. Forse sarebbe meglio in formato video, ma qui alla gente non piace così.

Ho parlato un po' di cosa c'è dietro lo script e di come configurarlo. Non sono entrato nei dettagli della sceneggiatura in sé, ma sono solo 50 righe, quindi non è difficile da capire.

Spero che qualcun altro provi questa idea e magari la apprezzi. Posso dire di me stesso che la sceneggiatura è stata scritta circa 3 anni fa ed è MOLTO conveniente per me. Così comodo da causare gravi disagi quando si lavora con i computer di altre persone. E con un MacBook funzionante.

Collegamento agli script

Fonte: habr.com

Aggiungi un commento