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.
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