GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Avviare l'app solo se non è già aperta?

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.

Correlati:Bluetooth su Ubuntu 16.04?

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


Ubuntu
  1. Come aprire Appimage in Linux

  2. Keepassx 0.4.3 su 11.10 (unità) non visibile in Task Switcher (alt-tab)?

  3. Perché Files (nautilus) apre una nuova finestra anche se ce n'è già una aperta?

  4. Rimuovi solo i file nella directory su Linux NOT directory

  5. aggiungi riga a un file SOLO se non è già nel file

Apri le cartelle in qualsiasi app terminale di Nautilus

Come aprire una finestra di un terminale Linux

5 modi per aprire o avviare un'applicazione in Debian

18.04:Emoji a colori non vengono visualizzati affatto in Chrome, solo parzialmente in Firefox?

Windows non focalizzato non risponde ai clic del mouse?

Gedit In 16.04:Mostra scheda con nome file quando viene aperto un solo file?