Обновление 7 апреля: добавлена другая версия и найден Альберт, см. Обновление и Бонус ниже!
Относительно функциональности тире : Вы спросили: « Есть ли возможность изменить поведение модуля запуска по умолчанию, чтобы проверить это перед открытием нового окна ». Основной ответ: нет, как обычный пользователь, у вас нет возможности добавить это поведение в dash. Однако, если бы был разработчик единой области, который хотел бы реализовать это, вы могли бы обратиться к ним или разработать его самостоятельно, если у вас есть решимость и желание учиться. Мои навыки кодирования очень скромны, поэтому я использую сценарии оболочки и доступный графический интерфейс для сценариев в качестве обходного пути.
Связанная информация
Исходное сообщение:
Я написал скрипт, который использует диалог zenity и wmctrl для достижения того, что вы просили. Обратите внимание, что это графический скрипт, то есть он будет работать только с окнами в графическом интерфейсе и не будет работать, если вы попытаетесь запустить что-то в tty. Кроме того, насколько я понимаю, Альфред делает то же самое. Вы можете создать ярлык на рабочем столе или ярлык для запуска, как описано здесь и здесь .
Сценарий:
#!/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
Примечания: в предыдущей версии скрипт использовал echo $? Для проверки успешного завершения предыдущих выражений. Согласно предложению Муру (из редактирования), я изменил код на несколько более компактную версию, поэтому я предлагаю вам взглянуть на предыдущую версию и текущую.
Кроме того, ранее wmctrl -a $MYPROG
не работали с тестированием Google-Chrome или Chromium-браузера; по какой-то глупой причине некоторые программы имеют свойство WM_CLASS заглавной буквы окна, в то время как перечисленная программа написана dpkg --get-selections
строчными буквами (вы просто будете читать man wmctrl
и запускать wmctrl -lx
, вы будете знать). Добавление -ax должно позаботиться об этом. Скрипт вызывает уже открытое окно хрома, как и должно
Другое дело - wmctlr несколько странно, потому что иногда ему нужна задержка (у меня был опыт работы с ним в другом скрипте), поэтому мне пришлось добавить sleep 1
строку. Раньше с Firefox он включался и выключался, но теперь работает плавно.
Сценарий в действии
В приведенной ниже анимации вы можете видеть, что при первом запуске скрипта открывается один экземпляр firefox, и скрипт переключает фокус на это окно; во втором тесте я открываю новый экземпляр google-chrome, который ранее не был открыт. (Примечание: если вы не любите рабочий стол, кстати, это openbox с док-станцией cairo)
Согласно предложению в комментариях, встроенная анимация удалена, размещена только ссылка. Сообщите, если он сломан, пожалуйста!
http://i.stack.imgur.com/puuPZ.gif
Обновление, 7 апреля
Я несколько улучшил сценарий, чтобы все программы, перечисленные в выпадающем списке zenity, были введены. Теперь пользователю не нужно запоминать каждую программу, а можно просто прокрутить их список с помощью клавиш со стрелками или просто открыть раскрывающееся меню. Кроме того, эта улучшенная версия поднимает окна не по имени, а по идентификатору окна, что дает гораздо лучшую производительность. Обратите внимание, что способ, которым я просматриваю файлы .desktop, отчасти избыточен, с помощью команды cut дважды, но поскольку мой скрипт-фу пока не так хорош, это все, что я могу сделать. Предложения по улучшению приветствуются!
#!/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
Бонус:
Я действительно нашел Альберта , который является версией Альфреда для Linux, но сам не пробовал. Стоит проверить, хотя. Однако, как уже заметил Джейкоб, он все еще глючит.
Есть приложение под названием Gnome-Do, которое графически похоже на Alfred, однако оно не обладает такой же функциональностью, как этот скрипт.
Дайте мне знать, если вам нравится этот сценарий, если что-то нужно исправить, и не забудьте высказать ответ, если вы найдете его полезным