Відмінне запитання.
Причина
Зазвичай, при запуску програм GUI від Unity Launcher, пускач чекає появи вікна. Поки чекає, на ній видно "прядильне колесо". Однак це не чекатиме вічно; приблизно через 20 секунд пускова установка припускає, що вікно не з’явиться, і відмовляється від очікування.
1. Основна команда запуску програми
У .desktop
файлі, що стосується першого Exec=
рядка (основна команда), ви можете сказати запуску, чекати чи ні, у рядку:
StartupNotify=true
змусити його почекати, або
StartupNotify=false
щоб не чекати.
2. Елементи швидкого списку запуску
Однак для можливих елементів швидкого списку (клацання правою кнопкою миші) пускового пристрою значенням за замовчуванням є StartupNotify=true
. На жаль, це значення є фіксованим і його неможливо змінити будь-чим.
Це означає, що якщо ви запускаєте будь-яку команду з клацання правою кнопкою миші на значку запуску в пусковій панелі Unity, пусковий апарат очікує вікна і чекає його, показуючи спінінг.
Суть полягає в тому, що, хоча це можна пояснити, наразі проблеми не існує, інакше, ніж створити спеціальний запуск для вашого сценарію та додати рядок 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 у вікні, зупинивши кручення колеса.