TL; DR какая команда / метод / действие dbus вызывается действием Quit
в каждом значке средства запуска?
Я читал источник для Unity 7 более последние несколько дней и обнаружили несколько строк кода, которые предполагают, что может существовать метод dbus, который можно вызывать для изящного уничтожения всех окон приложения:
/* Quit */
menu_item = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set(menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Quit"));
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
dbusmenu_menuitem_property_set_bool(menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
_gsignals.Add<void, DbusmenuMenuitem*, unsigned>(menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
[this] (DbusmenuMenuitem*, unsigned) {
Quit()
(взято из unity-7.2.0+14.04.20140416/launcher/ApplicationLauncherIcon.cpp
)
В течение некоторого времени было трудно общаться с X-сервером. Отправка HUP
или любого другого сигнала не закрывает окно графического интерфейса. Такие инструменты, как xdotool
и wmctrl
общаются с X, но на уровне программирования C.
То, что предлагает приведенный выше код, заключается в том, что существует более простой способ программно закрыть окна изящным способом без необходимости устанавливать внешние инструменты, такие как wmctrl
или xdotool
. Это именно то, что я после этого вопроса.
Насколько я понимаю, что кодируют его, создает пункт меню и соединяет его через DBus к void ApplicationLauncherIcon::Quit()
(тот же файл).
Это в основном звонит
void AppWindow::Quit() const
{
WindowManager::Default().Close(window_id());
}
(файл unity-shared/BamfApplicationManager.cpp
) для каждого окна, которое принадлежит значку средства запуска, который по существу делает то же как wmctrl -i -c window_id