总结Quit
每个启动器图标中的操作调用了什么命令/dbus 方法/操作?
过去几天我一直在阅读 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
或任何其他信号都无法正常关闭 GUI 窗口。诸如xdotool
和之类的工具wmctrl
确实可以与 X 通信,但只是在 C 编程级别。
上面的代码表明,有一种更简单的方法可以以优雅的方式以编程方式关闭窗口,而无需安装wmctrl
或之类的外部工具xdotool
。这正是我在这个问题中追求的。
答案1
据我了解,该代码会创建一个菜单项并通过 DBus 将其连接到void ApplicationLauncherIcon::Quit()
(同一个文件)。
这基本上调用
void AppWindow::Quit() const
{
WindowManager::Default().Close(window_id());
}
(文件unity-shared/BamfApplicationManager.cpp
)属于启动器图标的每个窗口,其本质上与wmctrl -i -c window_id