Comment développer un indicateur de système pour l'unité?

38

Il ne s’agit pas d’une copie de Comment créer des indicateurs Unity? . Je cherche un indicateur de système et non un indicateur d'application.

Backgound:

De ces deux questions:

J'ai appris qu'il existe deux types d'indicateurs:

Tous les indicateurs d’application sont gérés / affichés par application-indicateur (un système). Les indicateurs système sont affichés directement par le panel Unity.

Les deux questions concernent l’ajout / la suppression d’indicateurs de login & amp; écran verrouillé. La première était une configuration simple (en ce qui concerne les indicateurs système). La seconde était une configuration difficile (en ce qui concerne les indicateurs d'application), qui nécessite de modifier la source du service de panneau (package d'unité) pour l'écran de verrouillage et la source de l'unité-greeter pour l'écran de connexion.

Comme dans le cas de sysmonitor , ce fut pour moi une solution de contournement. La meilleure solution consiste à implémenter un indicateur système plutôt qu’une application.

Sujet:

  • Existe-t-il une API unifiée pour les indicateurs système (de préférence: Python puis C / C ++)? S'il vous plaît, référence aux documentations officielles.

  • La plupart des indicateurs système sont écrits en utilisant le langage de programmation Vala. Quelqu'un pourrait-il écrire une petite démo pour un indicateur système utilisant Python ou C?

Mise à jour:

J'ai trouvé peu de liens pouvant donner un coup de pouce:

  • Dans la page du projet Indicateurs d’application , ils ont répertorié des liens vers l’API AppIndicator-0.3 (C & amp; Python ) utilisé pour les indicateurs d’application.

    Ils ont également listé l'API Indicate-0.7 ( C & amp; Python ). Qu'est-ce que c'est? Eh bien, c'est un canal de messagerie DBus entre les applications de bureau.

  • En revanche, dans la page du projet Indicateurs système , ils ont mentionné:

      

    API d'indicateur système

         
    • Menu de messagerie utilisant libindicate.
    •   
    • Menu Son utilisant la liberté.
    •   
    • Indicateur de date / heure utilisant Evolution-Data-Server
    •   

    Ils semblent lister l'API de développement de l'API de données pas comme pour Evolution-Data-Server. Mais pas sûr de libindicate & amp; libunity. Est-ce que quelqu'un a travaillé avec ces deux bibliothèques?

    Essayez apt-cache rdepends libunity9 libindicator7 libindicator3-7 pour voir quel indicateur transmet ces bibliothèques.

Mise à jour 2: Ceci permet de maintenir les utilisateurs intéressés à jour.

De ce que j'ai collecté jusqu'à présent, voici l'ordre des solutions possibles:

  1. libindicator3-7 (élevé, de nombreux indicateurs en dépendent)

    J'ai trouvé des exemples de test dans la source, certains indicateurs factices que j'ai essayés, peuvent être installés dans /usr/lib/indicators3/7/ , ils sont partagés lib .so . Je pourrais les afficher dans Login & amp; Session régulière mais pas dans l'écran de verrouillage.

    Cependant, il existe des services d’indicateurs de test, ce qui semble être le cas du système Unity. Je ne les ai pas encore essayés.

  2. libindicator7

    De la même source que libindicator3-7, à partir de rdepends:

    mate-indicator-applet
    lxpanel-indicator-applet-plugin
    

    Il semble être utilisé pour créer des conteneurs pour les indicateurs dans les panneaux.

  3. libunity9 (bas)

    Pas encore de recherche

posée user.dz 27.10.2015 - 21:02
la source

2 réponses

12

Service d'indicateur système

Eh bien, c'est vraiment plus simple que prévu. Il n'y a pas d'API spécifique pour cela. Parce que c'est juste un GSimpleActionGroup & amp; avec les GMenu correspondants exportés via DBus, Unity est informé de leur présence à l'aide du fichier de déclaration portant le même nom. dans du code%. Pas besoin d'autres bibliothèques.

Voici un très petit exemple langage C :

  1. Obtenez une copie de /usr/share/unity/indicators/ from tests/indicator-test-service.c source

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    
    • indicateur-test-service.c aucun changement

       
      #include <gio/gio.h>
      
      typedef struct
      {
        GSimpleActionGroup *actions;
        GMenu *menu;
      
        guint actions_export_id;
        guint menu_export_id;
      } IndicatorTestService;
      
      static void
      bus_acquired (GDBusConnection *connection,
                    const gchar     *name,
                    gpointer         user_data)
      {
        IndicatorTestService *indicator = user_data;
        GError *error = NULL;
      
        indicator->actions_export_id = g_dbus_connection_export_action_group (connection,
                                                                              "/com/canonical/indicator/test",
                                                                              G_ACTION_GROUP (indicator->actions),
                                                                              &error);
        if (indicator->actions_export_id == 0)
          {
            g_warning ("cannot export action group: %s", error->message);
            g_error_free (error);
            return;
          }
      
        indicator->menu_export_id = g_dbus_connection_export_menu_model (connection,
                                                                         "/com/canonical/indicator/test/desktop",
                                                                         G_MENU_MODEL (indicator->menu),
                                                                         &error);
        if (indicator->menu_export_id == 0)
          {
            g_warning ("cannot export menu: %s", error->message);
            g_error_free (error);
            return;
          }
      }
      
      static void
      name_lost (GDBusConnection *connection,
                 const gchar     *name,
                 gpointer         user_data)
      {
        IndicatorTestService *indicator = user_data;
      
        if (indicator->actions_export_id)
          g_dbus_connection_unexport_action_group (connection, indicator->actions_export_id);
      
        if (indicator->menu_export_id)
          g_dbus_connection_unexport_menu_model (connection, indicator->menu_export_id);
      }
      
      static void
      activate_show (GSimpleAction *action,
                     GVariant      *parameter,
                     gpointer       user_data)
      {
        g_message ("showing");
      }
      
      int
      main (int argc, char **argv)
      {
        IndicatorTestService indicator = { 0 };
        GMenuItem *item;
        GMenu *submenu;
        GActionEntry entries[] = {
          { "_header", NULL, NULL, "{'label': <'Test'>,"
                                   " 'icon': <'indicator-test'>,"
                                   " 'accessible-desc': <'Test indicator'> }", NULL },
          { "show", activate_show, NULL, NULL, NULL }
        };
        GMainLoop *loop;
      
        indicator.actions = g_simple_action_group_new ();
        g_simple_action_group_add_entries (indicator.actions, entries, G_N_ELEMENTS (entries), NULL);
      
        submenu = g_menu_new ();
        g_menu_append (submenu, "Show", "indicator.show");
        item = g_menu_item_new (NULL, "indicator._header");
        g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.root");
        g_menu_item_set_submenu (item, G_MENU_MODEL (submenu));
        indicator.menu = g_menu_new ();
        g_menu_append_item (indicator.menu, item);
      
        g_bus_own_name (G_BUS_TYPE_SESSION,
                        "com.canonical.indicator.test",
                        G_BUS_NAME_OWNER_FLAGS_NONE,
                        bus_acquired,
                        NULL,
                        name_lost,
                        &indicator,
                        NULL);
      
        loop = g_main_loop_new (NULL, FALSE);
        g_main_loop_run (loop);
      
        g_object_unref (submenu);
        g_object_unref (item);
        g_object_unref (indicator.actions);
        g_object_unref (indicator.menu);
        g_object_unref (loop);
      
        return 0;
      }
      
    • com.canonical.indicator.test modifié pour ajouter lock & amp; mode greeter

      [Indicator Service]
      Name=indicator-test
      ObjectPath=/com/canonical/indicator/test
      
      [desktop]
      ObjectPath=/com/canonical/indicator/test/desktop
      
      [desktop_greeter]
      ObjectPath=/com/canonical/indicator/test/desktop
      
      [desktop_lockscreen]
      ObjectPath=/com/canonical/indicator/test/desktop
      
    • com.canonical.indicator.test.service supprimez libindicator postfix du nom de fichier et modifiez le chemin d’exécutable

      [D-BUS Service]
      Name=com.canonical.indicator.test
      Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
      
  2. Compilez-le

    gcc -o indicator-test-service indicator-test-service.c 'pkg-config --cflags --libs gtk+-3.0'
    
  3. Installation manuelle

    sudo su
    mkdir /usr/lib/x86_64-linux-gnu/indicator-test/
    cp indicator-test-service /usr/lib/x86_64-linux-gnu/indicator-test/
    cp com.canonical.indicator.test /usr/share/unity/indicators/
    cp com.canonical.indicator.test.service /usr/share/dbus-1/services/
    
  4. Configuration pour Greeter, remplacez la liste des indicateurs par défaut

    • 90_unity-greeter.gschema.override

      [com.canonical.unity-greeter]
      indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'com.canonical.indicator.test', 'application']
      
    • Installer

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      
  5. Test

    sudo service lightdm restart
    

Notes

  • Le service DBus est problématique si vous souhaitez que l’utilisateur puisse fermer une application à tout moment. Il est préférable d'utiliser Autostart à la place, comme le font les indicateurs par défaut.

  • J'ai téléchargé des fichiers prêts ici:

    lien

    et une copie modifiée ici:

    lien

    Où j'ai essayé différents menus pour différents modes. Il pourrait être installé et testé rapidement.

  • Cela semble trop simple et peut être facilement porté sur tout autre langage compatible avec GIO Gnome lib (y compris DBus). Comme je cherche Python, je peux l’ajouter plus tard.

Références:

Plugin d'indicateur système

Ce n’est pas un indicateur autonome complet comme ci-dessus, c’est juste un plugin de partage lib, similaire à .in & amp; libappmenu.so (menu de l'application et indicateur d'imprimante). Il ne peut être affiché que dans les sessions utilisateur standard et greeter (Pas sur l'écran de verrouillage).

Je ne pouvais pas le faire fonctionner dans ma machine actuelle, mais je l’ai déjà fait. Voici les étapes, peut-être que je manque quelque chose.

  1. Utiliser la même source ci-dessus de libprintersmenu.so

    libindicator sont des exemples (simples et visibles, ceux qui apparaissent sur le panneau)

  2. Compiler

    ./autogen.sh
    make
    
  3. Installer

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
    
  4. Configurer pour afficher l’écran de l’auteur

    • 90_unity-greeter.gschema.override utilise le même nom sans le préfixe test/libdummy-indicator-*.c et l’extension lib .

      [com.canonical.unity-greeter]
      indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'application', 'dummy']
      
    • Installer

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      
réponse donnée user.dz 01.04.2016 - 19:04
la source
0

REMARQUE: Veuillez cocher la fin de cet article pour avoir le dernier mot sur cette réponse.

Je ne sais pas si je suis vraiment utile, mais j'espère que cette idée sera utile.

D'après ce que j'ai recherché, la différence entre les indicateurs système et application est distincte. Dans cette optique, je présente maintenant un concept discutable:

  

Utilisation de l’API Application Indicator dans un indicateur système (par opposition à la création d’une nouvelle API unifiée dans le même but)

L'idée m'est venue en regardant les articles suivants:

lien

lien

L'API Unity semble être principalement conçue pour être utilisée avec les indicateurs d'application, mais les indicateurs système et d'application peuvent utiliser une programmation similaire (C lang). Cependant, vous avez mentionné précédemment que ces deux types d’indicateurs sont gérés par deux systèmes différents. En tant que tel, j'ai ensuite procédé à la lecture d'une de vos sources:

Comment puis-je ajouter ou manipuler des indicateurs d'application / système dans l'écran de connexion?

La réponse principale impliquait de remplacer un utilisateur déjà existant pour obtenir l'accès requis. Il a également fourni une solution pour ajouter et supprimer tous les indicateurs existants. C'est une solution de gestion unifiée pour les indicateurs. Serait-il possible de remplacer un utilisateur par défaut (pré-existant) pour exécuter / introduire un indicateur de système?

  

Un indicateur système peut-il utiliser l’API Unity Application Indicator (l’API peut-elle être utilisée et affichée correctement par le panneau Unity)? Si les réponses à ces questions sont oui, cela satisferait la situation - si cela ne cause pas d'autres problèmes.   Je sais que cela ne semblera pas immédiatement une réponse, alors je vais clarifier ce que j'ai tenté - j'essaie de diviser la tâche en objectifs plus petits. L'objectif principal étant de savoir si l'API de l'indicateur d'application peut être utilisée pour le codage des indicateurs système (en tant qu'API unifiée préexistante pour les indicateurs système).

En réponse à cette partie de votre requête:

  

"Existe-t-il une API unifiée pour les indicateurs système"

Malheureusement, il n'existe aucun moyen d'utiliser les API d'indicateur d'application pour les indicateurs système. En tant que telle, ma solution est nulle: (

    
réponse donnée TopHatProductions115 14.03.2016 - 16:17
la source

Lire d'autres questions sur les étiquettes