Чтобы иметь "минимизируют окно" опция посредством щелчка правой кнопкой по значку в средстве запуска Единицы (Ubuntu 14.04), я следовал подробным инструкциям здесь об изменении a .desktop
файл и сделанный пользовательским Firefox
средство запуска в ~/.local/share/applications/
папка. Соответствующая часть .desktop файла:
Actions=NewWindow;NewPrivateWindow;Minimize
[Desktop Action NewWindow]
Name=Open a New Window
Exec=firefox -new-window
OnlyShowIn=Unity;
[Desktop Action NewPrivateWindow]
Name=Open a New Private Window
Exec=firefox -private-window
OnlyShowIn=Unity;
[Desktop Action Minimize]
Name=Minimize Windows
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
OnlyShowIn=Unity;
Настольное действие "Минимизирует", вызывает простой сценарий оболочки, minimize.sh
это имеет следующее содержание:
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
Использование сценария xdotool
, это может быть установлено из официальных репозиториев, для нахождения весь firefox
окна, выполните итерации по ним и минимизируйте их.
Сценарий работает и работы пункта меню "Minimize Windows" права средства запуска также, но как только окна минимизированы, указатель мыши входит в "занятый" режим и остается как это в течение приблизительно 20 секунд (хотя действия мыши являются все еще быстро реагирующими).
Кто-либо знает, почему запуск сценария оболочки от правильного пункта меню в Единице мог привести к этому поведению?
Править: По-видимому, период ожидания неизбежен, как объяснено в ответе Jacob Vlijm. Так как мышь остается быстро реагирующей, избегая, чтобы преобразование указателя в прялке было частичным эстетическим обходным решением, как объяснено на askubuntu.
EDIT2: предоставление системы поддельного окна является лучшим решением, как объяснил Jacob ниже.
Отличный вопрос.
Обычно при запуске приложений с графическим интерфейсом из 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. Щелкните их, чтобы увидеть разницу в поведении.
. Если у вас много скриптов в быстрых списках и / или это вас действительно беспокоит, есть еще одно косметическое решение; мы можем подделать , невидимое (полностью прозрачное), чтобы показать окно, которое будет включено в ваш скрипт. ваш сценарий будет (например)
#/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
из gi.repository import Gtk
from threading import Thread
время импорта
подпроцесс импорта
"" "
Это самоуничтожающееся окно, чтобы "кормить" Unity фальшивым окном, предотвращая
пусковая установка, чтобы показать вращающееся колесо, ожидая появления окна.
Включите команду для запуска этого сценария в конец (вашего) сценария.
"" "
класс FakeWin (Gtk.Window):
def __init __ (сам):
Gtk.Window .__ init __ (self, title = "1526closeme")
Тема (цель = self.close) .start ()
def close (self):
t = 0
пока t <150:
time.sleep (0,2)
пытаться:
pid = subprocess.check_output (["pgrep", "-f", "fake_window"]) \
.decode ("utf-8"). strip ()
subprocess.Popen (["убить", pid])
сломать
кроме subprocess.CalledProcessError:
проходить
т + = 1
def fakewindow ():
window = FakeWin ()
# делаем наше окно прозрачным
window.set_opacity (0)
window.set_default_size (0,0)
window.show_all ()
Gtk.main ()
fakewindow ()
Добавьте в самый конец вашего скрипта команду:
fake_window
Выйдите из системы и вернитесь в (или запустите source ~ / .profile
)
Вот и все, колесо теперь будет вращаться только до тех пор, пока выполняется сценарий.
Сценарий действительно создает минималистичное окно. Однако окно полностью прозрачно и имеет размер 0x0 пикселей, поэтому оно невидимо. Он немедленно уничтожит себя, как только появится.
Вызывая окно в конце вашего скрипта, вы удовлетворяете желание Unity для окна, останавливая вращение колеса.
Просто хотел добавить альтернативную реализацию fake_window, которая немного проще и не вызывает предупреждений python в системе Ubuntu 16.04.
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
"""
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.
"""
def timer_cb():
Gtk.main_quit()
return False
def show_cb(widget, data=None):
GLib.timeout_add(500, timer_cb)
def fakewindow():
window = Gtk.Window()
# make our window transparent
window.set_opacity(0)
window.set_default_size(0,0)
window.connect("show", show_cb)
window.show_all()
Gtk.main()
fakewindow()