Код менеджера окон 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();"