GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Lancer l'application uniquement si elle n'est pas déjà ouverte ?

Je voudrais imiter l'utilisation d'Alfred sur Mac OS X, où si vous essayez d'ouvrir une application après l'avoir recherchée, elle n'ouvrira une nouvelle fenêtre que si le programme n'est pas déjà en cours d'exécution, sinon il mettra l'accent sur le instance en cours d'exécution de cette application. Existe-t-il un moyen de modifier le comportement par défaut du lanceur pour vérifier cela avant d'ouvrir une nouvelle fenêtre ?

Meilleure réponse

Mise à jour du 7 avril :Une version différente a été ajoutée et a trouvé Albert, voir la mise à jour et le bonus ci-dessous !!!

Concernant la fonctionnalité du tableau de bord :
Vous avez demandé ” Est-il possible de changer le comportement par défaut du lanceur pour vérifier cela avant d'ouvrir une nouvelle fenêtre “. La réponse de base est non, en tant qu'utilisateur régulier, vous n'avez aucun moyen d'ajouter ce comportement à Dash. Cependant, s'il y avait un développeur de portée d'unité qui serait prêt à l'implémenter, vous pouvez l'approcher ou en développer un vous-même si vous avez la volonté et la volonté d'apprendre. Mes compétences en codage sont très modestes, c'est pourquoi j'utilise les scripts shell et l'interface graphique disponible pour les scripts comme solution de contournement.

Informations associées

Message d'origine :

J'ai écrit un script qui utilise le dialogue zenity et wmctrl pour réaliser ce que vous avez demandé. Notez qu'il s'agit d'un script graphique, ce qui signifie qu'il ne fonctionnera qu'avec Windows, dans l'interface graphique, et ne fonctionnera pas si vous essayez de lancer quelque chose dans tty. D'ailleurs, d'après ce que j'ai compris, Alfred fait exactement la même chose. Vous pouvez créer un raccourci sur le bureau ou un raccourci vers le lanceur, comme décrit ici et ici.

Le scénario :

#!/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

Notes annexes : dans la version précédente, le script utilisait echo $?, pour tester si les expressions précédentes se terminaient avec succès. Selon la suggestion de muru (de l'édition), j'ai changé le code en une version un peu plus compacte, donc je vous suggère de jeter un œil à la version précédente et à la version actuelle.

Aussi, auparavant wmctrl -a $MYPROG n'a pas fonctionné avec les tests google-chrome ou chrome-browser ; pour une raison stupide, certains programmes ont la propriété WM_CLASS de la fenêtre en majuscule, tandis que le programme répertorié par dpkg --get-selections est en minuscule (il suffit de lire man wmctrl et exécutez wmctrl -lx , tu sauras). Ajouter que -ax devrait s'en occuper. Le script affiche la fenêtre Chrome déjà ouverte comme il se doit

Une autre chose - wmctlr est un peu bizarre en ce sens qu'il a parfois besoin d'un délai (j'en ai eu l'expérience dans un autre script), j'ai donc dû ajouter sleep 1 doubler. Auparavant, il était en quelque sorte activé et désactivé avec Firefox, mais fonctionne désormais parfaitement.

En relation :Bluetooth sur Ubuntu 16.04 ?

Le script en action

Dans l'animation ci-dessous, vous pouvez voir que lors de la première exécution du script, une instance de firefox est ouverte et que le script bascule le focus sur cette fenêtre ; lors du deuxième test, j'ouvre une nouvelle instance de google-chrome, qui n'a pas été ouverte auparavant.
(Remarque :si vous êtes curieux à propos du bureau, au fait, c'est openbox avec cairo dock)

Par suggestion dans les commentaires, animation intégrée supprimée, lien publié uniquement. Signalez s'il est cassé s'il vous plaît ! http://i.stack.imgur.com/puuPZ.gif

Mise à jour, 7 avril

J'ai quelque peu amélioré le script pour que tous les programmes soient répertoriés dans la zone de saisie déroulante de zenity. Désormais, l'utilisateur n'a pas à mémoriser chaque programme, mais peut simplement faire défiler une liste d'entre eux à l'aide des touches fléchées ou simplement ouvrir le menu déroulant. De plus, cette version améliorée lève les fenêtres non pas par nom, mais par identifiant de fenêtre, ce qui donne de bien meilleures performances. Notez que la façon dont je parcours les fichiers .desktop est un peu redondante, en utilisant la commande cut deux fois, mais comme mon script-fu n'est pas si bon jusqu'à présent, c'est tout ce que je peux faire. Les suggestions d'amélioration sont les bienvenues !

#!/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 :

J'ai en fait trouvé Albert , qui est la version Linux d'Alfred, mais je ne l'ai pas essayé moi-même. Ça vaut le coup de vérifier cependant. Cependant, comme Jacob l'a déjà noté, il y a toujours des bugs.

Il existe une application appelée Gnome-Do, qui ressemble graphiquement à Alfred, mais elle n'a pas la même fonctionnalité que ce script.

Faites-moi savoir si vous aimez ce script, s'il y a quelque chose à corriger, et n'oubliez pas de voter pour la réponse si vous le trouvez utile


Ubuntu
  1. Apache 2 n'a pas pu se lier, adresse déjà utilisée ?

  2. Comment faire en sorte que Alt-w ferme l'onglet actuel, pas la fenêtre actuelle, dans Gnome Shell ?

  3. Pourquoi les fichiers (nautilus) ouvrent-ils une nouvelle fenêtre alors qu'il y en a déjà une ouverte ?

  4. L'émulateur -avd ne lance pas le périphérique virtuel ?

  5. Ajouter une ligne à un fichier uniquement s'il n'existe pas déjà

Ouvrir des dossiers dans n'importe quelle application de terminal de Nautilus

Comment ouvrir une fenêtre de terminal Linux

5 façons d'ouvrir ou de lancer une application dans Debian

18.04 :Les émoticônes de couleur ne s'affichent pas du tout dans Chrome, seulement partiellement dans Firefox ?

Windows non focalisé ne répond pas aux clics de souris ?

Gedit dans 16.04 :Afficher l'onglet avec le nom de fichier lorsqu'un seul fichier est ouvert ?