Vorrei imitare l'uso di Alfred su Mac OS X, dove se provi ad aprire un'app dopo averla cercata, si aprirà una nuova finestra solo se il programma non è già in esecuzione, altrimenti imposterà il focus sul istanza attualmente in esecuzione di tale applicazione. Esiste comunque la possibilità di modificare il comportamento predefinito del programma di avvio per verificarlo prima di aprire una nuova finestra?
Migliore risposta
Aggiornamento 7 aprile:una versione diversa è stata aggiunta e trovata Albert, vedi aggiornamento e bonus qui sotto!!!
Riguardo alla funzionalità del trattino :
Hai chiesto ” C'è comunque la possibilità di modificare il comportamento predefinito del programma di avvio per verificarlo prima di aprire una nuova finestra “. La risposta di base è no, come utente normale non hai modo di aggiungere quel comportamento al trattino. Tuttavia, se ci fosse uno sviluppatore di ambito unitario disposto a implementarlo, potresti avvicinarlo o svilupparne uno tu stesso se hai determinazione e voglia di imparare. Le mie capacità di programmazione sono molto modeste, quindi utilizzo gli script di shell e il front-end grafico disponibile per gli script come soluzione alternativa.
Informazioni correlate
Post originale:
Ho scritto uno script che utilizza zenity dialog e wmctrl per ottenere ciò che hai chiesto. Si noti che questo è uno script grafico, il che significa che funzionerà solo con Windows, nella GUI e non funzionerà se si tenta di avviare qualcosa in tty. Inoltre, da quello che ho capito, Alfred fa esattamente la stessa cosa. Puoi creare un collegamento sul desktop o un collegamento al programma di avvio, come descritto qui e qui.
Il copione:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
Note a margine: nella versione precedente, lo script utilizzava echo $?, per verificare se le espressioni precedenti erano terminate correttamente. Come da suggerimento di Muru (dalla modifica), ho cambiato il codice in una versione un po' più compatta, quindi ti consiglio di dare un'occhiata alla versione precedente ea quella attuale.
Inoltre, in precedenza wmctrl -a $MYPROG
non ha funzionato con il test di google-chrome o chromium-browser; per qualche stupido motivo alcuni programmi hanno la proprietà WM_CLASS della finestra in maiuscolo, mentre il programma come elencato da dpkg --get-selections
è minuscolo (basta leggere man wmctrl
ed esegui wmctrl -lx
, lo saprai). Aggiungendo che -ax dovrebbe occuparsi di questo. Lo script fa apparire la finestra chromium già aperta come dovrebbe
Un'altra cosa:wmctlr è alquanto strano in quanto a volte ha bisogno di un ritardo (l'ho avuto esperienza in un altro script), quindi ho dovuto aggiungere sleep 1
linea. In precedenza sarebbe stato un po' acceso e spento con Firefox, ma ora funziona a meraviglia.
Lo script in azione
Nell'animazione qui sotto puoi vedere che alla prima esecuzione dello script, c'è un'istanza di Firefox aperta e lo script cambia lo stato attivo su quella finestra; al secondo test, apro una nuova istanza di google-chrome, che non è stata aperta in precedenza.
(Nota a margine:se sei curioso del desktop, tra l'altro, quello è openbox con cairo dock)
Per suggerimento nei commenti, animazione incorporata rimossa, solo link pubblicato. Segnala se è rotto per favore! http://i.stack.imgur.com/puuPZ.gif
Aggiornamento, 7 aprile
Ho leggermente migliorato lo script per creare tutti i programmi elencati nella casella di immissione a discesa di zenity. Ora l'utente non deve memorizzare ogni programma, ma può semplicemente scorrere un elenco di essi utilizzando i tasti freccia o semplicemente aprire il menu a discesa. Inoltre, questa versione migliorata solleva le finestre non per nome, ma per ID finestra, che offre prestazioni molto migliori. Nota, il modo in cui esamino i file .desktop è un po' ridondante, usando il comando cut due volte, ma dal momento che il mio script-fu non è così buono finora, questo è tutto ciò che posso fare. Suggerimenti per migliorare sono i benvenuti!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for https://askubuntu.com/q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi
Bonus:
In realtà ho trovato Albert , che è la versione Linux di Alfred, ma non l'ho provato da solo. Vale la pena dare un'occhiata però. Tuttavia, come ha già notato Jacob, è ancora difettoso.
Esiste un'app chiamata Gnome-Do, che graficamente è simile ad Alfred, tuttavia non ha le stesse funzionalità di questo script.
Fammi sapere se ti piace questo script, se c'è qualcosa da correggere e non dimenticare di votare la risposta se lo trovi utile