Отличный вопрос.
Причина
Обычно, когда запускаются приложения с графическим интерфейсом из Unity Launcher, программа запуска ожидает появления окна. В ожидании показывает «вращающееся колесо». Это не будет ждать вечно однако; примерно через 20 секунд программа запуска предполагает, что окно не появится, и перестает ждать.
1. Основная команда запуска приложения
В .desktop
файле, относящемся к первой Exec=
строке (основной команде), вы можете указать программе запуска ждать или нет, в строке:
StartupNotify=true
чтобы подождать, или
StartupNotify=false
чтобы не ждать.
2. Быстрый список предметов лаунчера
Однако для возможных элементов списка быстрого запуска (щелчка правой кнопкой мыши) по умолчанию используется значение StartupNotify=true
. К сожалению, это значение является фиксированным и не может быть изменено ничем.
Это означает, что если вы запустите любую команду, щелкнув правой кнопкой мыши значок запуска в Unity Launcher, программа запуска ожидает окно и ждет его, показывая вращающееся колесо.
Суть в том, что, хотя это можно объяснить, в данный момент, похоже, нет решения этой проблемы, кроме создания выделенного модуля запуска для вашего сценария и добавления строки StartupNotify=false
в файл.
Доказательство
Вы можете проверить поведение самостоятельно. Создайте две пусковые установки:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
и:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Сохраните их как test1.desktop
и test2.desktop
, перетащите оба модуля запуска на модуль запуска Unity. Нажмите на них и увидите разницу в поведении.
Редактировать; если это действительно беспокоит вас, накормите Unity поддельным окном
Если у вас есть много сценариев в быстрых списках, и / или это действительно беспокоит вас, есть другое косметическое решение; мы можем подделать , невидимую (полностью прозрачную), чтобы показать окно, которое будет включено в ваш скрипт. ваш сценарий будет (например)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
где команда fake_window
вызовет наше (поддельное) окно, заставляя Unity прекратить вращающееся колесо.
Как настроить
- Создайте, если он еще не существует, каталог
~/bin
Скопируйте приведенный ниже скрипт в пустой файл, сохраните его как fake_window
(без расширения) ~/bin
и сделайте его исполняемым
#!/usr/bin/env python3
from gi.repository import Gtk
from threading import Thread
import time
import subprocess
"""
This is a self-destroying window, to "feed" Unity a fake-window, preventing
the launcher to show a spinning wheel, waiting for a window to appear.
Include the command to run this script at the end of the (your) script.
"""
class FakeWin(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="1526closeme")
Thread(target = self.close).start()
def close(self):
t = 0
while t < 150:
time.sleep(0.2)
try:
pid = subprocess.check_output(["pgrep", "-f", "fake_window"])\
.decode("utf-8").strip()
subprocess.Popen(["kill", pid])
break
except subprocess.CalledProcessError:
pass
t += 1
def fakewindow():
window = FakeWin()
# make our window transparent
window.set_opacity(0)
window.set_default_size(0,0)
window.show_all()
Gtk.main()
fakewindow()
Добавьте в самый конец вашего скрипта команду:
fake_window
Выйти и вернуться (или запуститьsource ~/.profile
)
Вот и все, колесо будет вращаться только до тех пор, пока работает скрипт.
объяснение
Скрипт делает создать минималистичный окно. Однако окно полностью прозрачно, имеет размер 0x0 пикселей и поэтому невидимо. Он уничтожит себя немедленно, как только он будет существовать.
Вызывая окно в конце вашего сценария, вы удовлетворите желание Unity открыть окно, останавливая вращение колеса.