![应用程序启动器图标中的“退出”选项执行什么操作?](https://linux22.com/image/988955/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%99%A8%E5%9B%BE%E6%A0%87%E4%B8%AD%E7%9A%84%E2%80%9C%E9%80%80%E5%87%BA%E2%80%9D%E9%80%89%E9%A1%B9%E6%89%A7%E8%A1%8C%E4%BB%80%E4%B9%88%E6%93%8D%E4%BD%9C%EF%BC%9F.png)
总结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