Aggiornamento 7 aprile: una versione diversa aggiunta e trovata Albert, vedi aggiornamento e Bonus qui sotto !!!
Per quanto riguarda la funzionalità del trattino : è stato chiesto " Esiste un modo per 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 dell'ambito di unità che sarebbe disposto a implementarlo, potresti avvicinarti a loro o svilupparne uno tu stesso se hai determinazione e voglia di imparare. Le mie capacità di programmazione sono molto modeste, quindi uso come scripting shell shell e il front-end grafico disponibile per gli script.
Informazioni correlate
Post originale:
Ho scritto una sceneggiatura che utilizza il dialogo zenity 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 capisco Alfred fa esattamente la stessa cosa. È possibile creare un collegamento sul desktop ad esso o il collegamento di avvio ad esso, 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 /ubuntu//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 uscivano correttamente. Come suggerito da Muru (dalla modifica), ho cambiato il codice in una versione un po 'più compatta, quindi ti suggerisco di dare un'occhiata alla versione precedente e alla corrente.
Inoltre, in precedenza wmctrl -a $MYPROG
non funzionava con i test di google-chrome o chromium-browser; per qualche stupida ragione alcuni programmi hanno la proprietà WM_CLASS della finestra maiuscola, mentre il programma come elencato dpkg --get-selections
è in minuscolo (basta leggere man wmctrl
ed eseguire wmctrl -lx
, lo saprai). Aggiungendo che -ax dovrebbe occuparsene. La sceneggiatura fa apparire la finestra di cromo già aperta come dovrebbe
Un'altra cosa - wmctlr è alquanto strano in quanto a volte ha bisogno di un ritardo (ha avuto esperienza con esso in un altro script), quindi ho dovuto aggiungere una sleep 1
riga. In precedenza sarebbe stato un po 'acceso e spento con Firefox, ma ora funziona a meraviglia.
La sceneggiatura in azione
Nell'animazione qui sotto puoi vedere che alla prima esecuzione dello script, c'è un'istanza di firefox aperta e gli script passano su quella finestra; nel secondo test, apro una nuova istanza di google-chrome, che non è stata aperta in precedenza. (Nota a margine: se sei curioso del desktop, a proposito, questo è openbox con il dock cairo)
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 migliorato un po 'lo script per rendere tutti i programmi elencati nella casella di inserimento a discesa di zenity. Ora l'utente non deve memorizzare ciascun programma, ma può semplicemente scorrere un elenco di essi usando i tasti freccia o semplicemente aprire il menu a discesa. Inoltre, questa versione migliorata genera finestre non per nome, ma per id finestra, che offre prestazioni molto migliori. Nota, il modo in cui passo attraverso i file .desktop è un po 'ridondante, usando due volte il comando cut, ma dal momento che il mio script-fu non è poi così buono, questo è tutto ciò che posso fare. Suggerimenti di miglioramento sono ben accetti!
#!/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 /ubuntu//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 Jacob ha già notato, è ancora difettoso.
Esiste un'app chiamata Gnome-Do, che appare graficamente simile ad Alfred, tuttavia non ha le stesse funzionalità di questo script.
Fammi sapere se ti piace questo script, se c'è qualcosa che deve essere riparato e non dimenticare di votare la risposta se lo trovi utile