Что именно делает Gnome при запуске настольного приложения? - PullRequest
0 голосов
/ 29 апреля 2020

Я использую Zorin OS, но я считаю, что то же самое относится ко всем дистрибутивам на основе Ubuntu.

При запуске приложения с помощью поиска на обзорном экране Gnome имеет следующее поведение:

  • Если приложение еще не запущено, запускает его
  • Если приложение уже запущено, выводит его текущий windows на передний план

Как именно это происходит? "окно на передний план" часть?

Например, при проверке файла .desktop Google Chrome из /usr/share/applications (установленного через .deb), я вижу, что команда Exec имеет значение /usr/bin/google-chrome-stable %U , который всегда создает новое окно. Итак, Gnome явно делает что-то еще, когда приложение уже запущено.

Я пытаюсь добиться глобального ярлыка для каждого из моих наиболее часто используемых приложений, и я хочу точно такое же поведение "открыть или перенести его на передний план если он уже запущен ".

Я уже написал сценарий, используя wmctrl, однако это решение не кажется очень надежным и элегантным, поскольку я использую grep для поиска windows текущего приложения. Кроме того, он не работает с Wayland, если я не ошибаюсь.

Если бы я мог как-то вызвать Gnome, это было бы намного лучшим решением.

1 Ответ

0 голосов
/ 09 мая 2020

Код менеджера окон GNOME Shell всегда пытается связать каждое окно с его файлом .desktop (на основе WM_NAME и других эвристических методов). Например, вот как он знает, какой значок приложения и заголовок показывать в верхней панели, независимо от фактического заголовка окна. Внутренне это модуль «shell-window-tracker».

Поэтому, когда программа запуска хочет запустить приложение, она сначала просит диспетчер окон открыть окно, связанное с тем же файлом .desktop, и запускает программу только в том случае, если нет соответствующих windows.

Но учтите, что одинаковая оболочка GNOME является одновременно средством запуска приложений и оконным менеджером. Для этого не требуется никаких внешних вызовов API - код обзора / запуска просто использует внутренние функции для взаимодействия с кодом управления окнами, поскольку они оба выполняются в одном процессе.

Для достижения то же самое внешне, вам нужно будет использовать API-интерфейсы D-Bus для Shell, хотя, похоже, что для запуска конкретного приложения c его нет, поэтому вам, возможно, придется использовать org.gnome.Shell.Eval() и вызывать внутренний Shell G JS работает таким образом.

Не проверено:

busctl --user call org.gnome.Shell \
    /org/gnome/Shell org.gnome.Shell Eval \
    s "Shell.AppSystem.get_default().lookup_app('foo.desktop').activate();"
...