Actualización 7 de abril: ¡Se agregó una versión diferente y se encontró a Albert, vea la actualización y el bono a continuación!
Con respecto a la funcionalidad del guión : Usted ha preguntado " ¿Hay alguna forma de cambiar el comportamiento predeterminado del iniciador para verificar esto antes de abrir una nueva ventana ". La respuesta básica es, no, como usuario habitual no tiene forma de agregar ese comportamiento al tablero. Sin embargo, si hubiera un desarrollador de alcance de la unidad que estuviera dispuesto a implementar eso, podría acercarse a ellos o desarrollar uno usted mismo si tiene resolución y está dispuesto a aprender. Mis habilidades de codificación son muy modestas, por lo tanto, uso scripts de shell y el front-end gráfico disponible para los scripts como solución alternativa.
Información relacionada
Publicación original:
He escrito un script que usa el diálogo zenity y wmctrl para lograr lo que pediste. Tenga en cuenta que este es un script gráfico, lo que significa que solo funcionará con Windows, en la GUI, y no funcionará si intenta iniciar algo en tty. Además, por lo que entiendo, Alfred hace exactamente lo mismo. Puede crear un acceso directo de escritorio o un acceso directo de iniciador, como se describe aquí y aquí .
La secuencia de comandos:
#!/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
Notas al margen: en la versión anterior, el script usaba echo $ ?, para probar si las expresiones anteriores salieron con éxito. Según la sugerencia de muru (de la edición), cambié el código a una versión algo más compacta, por lo que le sugiero que eche un vistazo a la versión anterior y la actual.
Además, anteriormente wmctrl -a $MYPROG
no funcionaba con las pruebas de google-chrome o chromium-browser; por alguna estúpida razón, algunos programas tienen la propiedad WM_CLASS de la ventana en mayúscula, mientras que el programa que se muestra en dpkg --get-selections
minúsculas (solo lee man wmctrl
y ejecuta wmctrl -lx
, lo sabrás). Agregar ese -ax debería encargarse de esto. El script muestra la ventana de cromo ya abierta como debería
Otra cosa: wmctlr es algo extraño, ya que a veces necesita un retraso (tenía experiencia con él en otro script), así que tuve que agregar una sleep 1
línea. Anteriormente sería un poco intermitente con Firefox, pero ahora funciona de maravilla.
El guión en acción
En la siguiente animación, puede ver que en la primera ejecución del script, hay una instancia de firefox abierta, y el script cambia el foco a esa ventana; en la segunda prueba, abro una nueva instancia de google-chrome, que no se había abierto anteriormente. (Nota al margen: si tiene curiosidad sobre el escritorio, por cierto, eso es openbox con cairo dock)
Por sugerencia en los comentarios, animación incrustada eliminada, solo enlace publicado ¡Informe si está roto por favor!
http://i.stack.imgur.com/puuPZ.gif
Actualización, 7 de abril
Mejoré un poco el script para hacer que todos los programas enumerados en el cuadro de entrada desplegable de zenity. Ahora el usuario no tiene que memorizar cada programa, sino que simplemente puede desplazarse por una lista de ellos con las teclas de flecha o simplemente abrir el menú desplegable. Además, esta versión mejorada genera ventanas no por nombre, sino por id de ventana, lo que proporciona un rendimiento mucho mejor. Tenga en cuenta que la forma en que reviso los archivos .desktop es algo redundante, usando el comando de corte dos veces, pero como mi script-fu no es tan bueno hasta ahora, esto es todo lo que puedo hacer. ¡Sugerencias para mejorar son bienvenidas!
#!/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
Prima:
De hecho, he encontrado a Albert , que es la versión Linux de Alfred, pero no lo he probado yo mismo. Vale la pena echarle un vistazo. Sin embargo, como ya señaló Jacob, todavía tiene errores.
Hay una aplicación llamada Gnome-Do, que gráficamente se parece a Alfred, sin embargo, no tiene la misma funcionalidad que este script.
Avíseme si le gusta este script, si hay algo que necesita ser arreglado, y no olvide votar la respuesta si le resulta útil.