Оновлення 7 квітня: Додана інша версія та знайдено Альберта, дивіться оновлення та Бонус нижче !!!
Що стосується функцій тире : Ви запитали " Чи все-таки можна змінити поведінку запуску за замовчуванням, щоб перевірити це перед відкриттям нового вікна ". Основна відповідь - ні, як звичайний користувач, ви не можете додати цю поведінку до тире. Однак, якщо є розробник сфери єдності, який був би готовий реалізувати це, ви можете підійти до них або розробити його самостійно, якщо ви вирішите і хочете вчитися. Мої навички кодування дуже скромні, тому я використовую сценарій оболонки та наявний графічний фронт для сценаріїв як вирішення.
Супутня інформація
Оригінальна публікація:
Я написав сценарій, який використовує діалог із зенності та wmctrl для досягнення того, про що ви просили. Зауважте, що це графічний скрипт, тобто він працюватиме лише з windows, в графічному інтерфейсі, і він не працюватиме, якщо ви спробуєте запустити щось у 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 або Chrome-браузера; з якоїсь дурної причини деякі програми мають властивість WM_CLASS вікна з великої літери, тоді як програма, зазначена у списку, dpkg --get-selections
є малі регістри (просто читайте man wmctrl
та запускайте wmctrl -lx
, ви знаєте). Додаючи, що -ax повинен подбати про це. Сценарій відкриває вже відкрите вікно хрому, як слід
Інша річ - wmctlr дещо дивний у тому, що він потребує іноді затримки (мав досвід роботи з іншим сценарієм), тому мені довелося додати sleep 1
рядок. Раніше це було б вимкненням та вимиканням Firefox, але зараз працює плавно.
Сценарій в дії
У нижній частині анімації ви бачите, що під час першого запуску сценарію відкривається один екземпляр firefox, і сценарій перемикає фокус на це вікно; у другому тесті я відкриваю новий екземпляр google-chrome, який раніше не був відкритий. (Бічна примітка. Якщо вам цікаво робочий стіл, до речі, це openbox з доступом до Каїру)
За пропозицією в коментарях вбудовану анімацію видалено, розміщено лише посилання. Повідомте, якщо це порушено, будь ласка!
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, який графічно схожий на Альфреда, однак він не має такої ж функціональності, як цей сценарій.
Повідомте мене, якщо вам подобається цей скрипт, якщо щось потрібно виправити, і не забудьте подати відповідь, якщо ви вважаєте його корисним