web-dev-qa-db-fra.com

Quelle est l'action effectuée par l'option "Quitter" dans l'icône du lanceur d'application?

TL; DR quelle commande/méthode/action dbus est appelée par l'action Quit dans chaque icône de lanceur?

J'ai lu la source d'Unity 7 au cours des derniers jours et j'ai trouvé quelques lignes de code qui suggèrent qu'il peut y avoir une méthode dbus qui peut être appelée pour tuer gracieusement toutes les fenêtres d'une application:

  /* 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()

(pris à partir de unity-7.2.0+14.04.20140416/launcher/ApplicationLauncherIcon.cpp)

Pendant un certain temps, il a été difficile de communiquer avec le serveur X. L'envoi de HUP ou de tout autre signal ne ferme pas correctement une fenêtre GUI. Des outils tels que xdotool et wmctrl communiquent avec le X mais au niveau de programmation C.

Ce que le code ci-dessus suggère, c'est qu'il existe un moyen plus simple de fermer les fenêtres par programme de manière gracieuse, sans avoir besoin d'installer des outils externes comme wmctrl ou xdotool. C'est précisément ce que je recherche dans cette question.

4

Pour autant que je comprends ce code, il crée un élément de menu et le connecte via DBus à void ApplicationLauncherIcon::Quit() (même fichier).

Cela appelle essentiellement

void AppWindow::Quit() const
{
  WindowManager::Default().Close(window_id());
}

(fichier unity-shared/BamfApplicationManager.cpp) pour chaque fenêtre appartenant à l'icône du lanceur, qui fait essentiellement la même chose que wmctrl -i -c window_id

4
Florian Diesch