Пользовательское действие щелчка правой кнопкой в Средстве запуска Единицы заставляет курсор напряженно трудиться в течение 20 секунд

Чтобы иметь "минимизируют окно" опция посредством щелчка правой кнопкой по значку в средстве запуска Единицы (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 ниже.

14
задан 13 April 2017 в 05:23

2 ответа

Отличный вопрос.

Причина

Обычно при запуске приложений с графическим интерфейсом из 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 прекратить вращение колеса.

Как настроить

  1. Create, if он еще не существует, каталог ~ / bin
  2. Скопируйте приведенный ниже сценарий в пустой файл, сохраните его как 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 ()
     
  3. Добавьте в самый конец вашего скрипта команду:

     fake_window
     
  4. Выйдите из системы и вернитесь в (или запустите source ~ / .profile )

Вот и все, колесо теперь будет вращаться только до тех пор, пока выполняется сценарий.

Пояснение.

Сценарий действительно создает минималистичное окно. Однако окно полностью прозрачно и имеет размер 0x0 пикселей, поэтому оно невидимо. Он немедленно уничтожит себя, как только появится.

Вызывая окно в конце вашего скрипта, вы удовлетворяете желание Unity для окна, останавливая вращение колеса.

18
ответ дан 23 November 2019 в 02:58

Просто хотел добавить альтернативную реализацию 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()
4
ответ дан 23 November 2019 в 02:58

Другие вопросы по тегам:

Похожие вопросы: