Birlik için bir Sistem Göstergesi nasıl geliştirilir?


38

Bu, Birlik göstergelerinin nasıl oluşturulacağının kopyası değildir ? . Uygulama göstergesi değil sistem göstergesi arıyorum.

backgound:

Bu iki sorudan:

İki tür gösterge olduğunu öğrendim:

Tüm uygulama göstergeleri gösterge uygulaması (bir sistem) tarafından ele alınır / gösterilir. Sistem göstergeleri doğrudan Unity paneli tarafından gösterilir.

Her iki soru da giriş ve kilit ekranından göstergeler ekleme / çıkarma ile ilgilidir. İlki, düz ileri bir kurulumdu (sistem göstergeleriyle çalışırken). İkincisi, kilit ekranı için panel hizmet kaynağını (birlik paketi) ve giriş ekranı için birlik-karşılayıcı kaynağını değiştirmeyi gerektiren zorlu bir kurulumdu (uygulama göstergeleriyle çalışırken).

Bu durumda sysmonitor, bana göre bu geçici bir çözümdü. En iyi çözüm, uygulama yerine bir sistem göstergesi uygulamaktır.

Konu:

  • Sistem göstergeleri için birleştirilmiş bir API var mı (Tercihen: Python sonra C / C ++)? Lütfen resmi belgelere bakınız.

  • Çoğu sistem göstergesi Vala programlama dili kullanılarak yazılmıştır. Herhangi biri Python veya C kullanarak bir sistem göstergesi için küçük bir demo yazabilir mi?

Güncelleme:

Zorlayabilecek birkaç bağlantı buldum:

  • In Uygulama Göstergeler proje sayfasında Onlar AppIndicator-0.3 API (link listelenen C & Python uygulama göstergeleri için kullanılır).

    Ayrıca İndikatör-0.7 API ( C & Python ) da listelediler . Bu nedir? Peki, Masaüstü Uygulamaları arasında bir DBus mesajlaşma kanalıdır.

  • Öte yandan, Sistem Göstergeleri proje sayfasında şunları söylediler:

    Sistem Göstergesi API'leri

    • Libindicate kullanarak Mesajlaşma Menüsü.
    • Özgürlük kullanarak Ses Menüsü.
    • Evolution-Data-Server kullanan Tarih / Saat Göstergesi

    Evolution-Data-Server gibi Gösterge Geliştirme API'sini değil Veri API'sini listeliyor gibi görünüyorlar. Ancak libindicate ve özgürlük hakkında emin değilim. Herhangi biri bu iki kütüphaneyle çalıştı mı?

    apt-cache rdepends libunity9 libindicator7 libindicator3-7Hangi kütüphanelerin bu kütüphaneleri ilettiğini görmeye çalışın .

Güncelleme2: Bu, ilgilenen kullanıcıları güncel tutmak için.

Şimdiye kadar topladıklarımdan, olası çözümlerin sırası:

  1. libindicator3-7 (yüksek, birçok gösterge buna bağlı)

    Kaynakta bazı test örnekleri buldum, denediğim bazı sahte göstergeler kurulabilir /usr/lib/indicators3/7/, lib paylaşılırlar .so. Onları Giriş ve Düzenli Oturumda görüntüleyebilirim ama Kilit Ekranında Değil'i gösterebilirim.

    Bununla birlikte, Birlik sistemi gibi görünen bazı test gösterge hizmetleri vardır. Onları henüz denemedim.

  2. libindicator7

    Libindicator3-7 ile aynı kaynaktan, bağımlılardan:

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

    Panellerde göstergeler için konteyner yapmak için kullanılıyor gibi görünüyor.

  3. libunity9 (düşük)

    Henüz araştırma yok

Yanıtlar:


12

Sistem Göstergesi Hizmeti

Beklediğimden çok daha kolay. Bunun için belirli bir API yok. Çünkü sadece bir GSimpleActionGroup ve buna karşılık gelen GMenu'lar DBus aracılığıyla ihraç ediliyorlar /usr/share/unity/indicators/. Başka bir kütüphaneye gerek yok.

İşte çok küçük bir C dili örneği:

  1. Bir kopyasını alın tests/indicator-test-service.cgelen libindicatorkaynak

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    
    • gösterge-test-service.c değişiklik yok

      #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 kilit ve karşılama modu eklemek için değiştirildi

      [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.in postfix'i dosya adından kaldırın ve çalıştırılabilir yolu değiştirin

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

    gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
  3. Manuel Kurulum

    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. Greeter için yapılandırma, varsayılan göstergeler listesini geçersiz kıl

    • 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']
      
    • Yüklemek

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      
  5. Ölçek

    sudo service lightdm restart

notlar

  • Kullanıcının istediği zaman uygulamayı kapatmasını istiyorsanız, DBus servisi zahmetlidir. Varsayılan göstergelerin yaptığı gibi otomatik başlatmayı kullanmak daha iyidir.

  • Buraya hazır dosyaları yükledim:

    https://github.com/sneetsher/mysystemindicator_minimum

    ve burada değiştirilmiş bir kopya:

    https://github.com/sneetsher/mysystemindicator

    Farklı mod için farklı menü denedim. Hızlı bir şekilde kurulabilir ve test edilebilir.

  • Bu çok basit görünüyor ve GIO Gnome lib'i (DBus dahil) destekleyen herhangi bir dile kolayca taşınabilir. Python'u ararken daha sonra ekleyebilirim.

Referanslar:


Sistem Göstergesi Eklentisi

Bu, yukarıdaki gibi tam bağımsız bir gösterge değil, libappmenu.so& libprintersmenu.so(uygulama menüsü ve yazıcı göstergesi) 'ye benzer bir paylaşım lib eklentisi . Yalnızca düzenli kullanıcı oturumunda ve karşılamada gösterilebilir (Kilit ekranında değil).

Geçerli makinemde çalışmasını sağlayamadım ama daha önce yaptım. İşte adımlar, belki bir şey eksik olabilir.

  1. Yukarıda aynı kaynağı kullanarak libindicator

    test/libdummy-indicator-*.c örneklerdir (panelde görünenlerin basit ve görülebilir)

  2. derleme

    ./autogen.sh
    make
    
  3. Yüklemek

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
  4. Karşılama ekranında gösterilecek şekilde yapılandırma

    • 90_unity-greeter.gschema.override , libön ek ve .souzantı olmadan aynı adı kullanır .

      [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']
      
    • Yüklemek

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

2
Bunun Python'da yapılıp yapılmadığını merak ediyorum .. C biraz korkutucu görünüyor.
Seth,

@ Evet, Python'da yapılabileceğine inanıyorum. Az önce kontrol ettiğim gibi gerekli tüm işlevler ( export_action_group, export_menu_model) ve nesneler ( SimpleActionGroup, Menu) içeride gi.repository.Gio. Önümüzdeki birkaç gün içinde bir tane yazmayı deneyeceğim.
user.dz

0

NOT: Bu cevaptaki son söz için lütfen bu yazının altını kontrol edin.

Gerçekten bir yardımı olup olmadığımı bilmiyorum, ama umarım bu fikir faydalı olabilir.

Aradıklarımdan itibaren, Sistem ve Uygulama Göstergelerindeki fark belirgindir. Bunu aklımda tutarak, şimdi sorgulanabilir bir konsept tanıtıyorum:

Uygulama Göstergesi API'sinin bir Sistem Göstergesinde kullanılması (aynı amaç için yeni, birleşik bir API oluşturmak yerine)

Fikir, aşağıdaki yayınlara bakarken bana geldi:

https://askubuntu.com/a/234204/408654

https://askubuntu.com/a/42213/408654

Unity API, öncelikle Uygulama Göstergeleriyle kullanım için oluşturulmuş gibi görünmektedir, ancak hem Sistem hem de Uygulama Göstergeleri benzer programlar kullanabilir (C dili). Ancak, daha önce bu iki Gösterge türünün iki farklı sistem tarafından ele alındığını belirtmiştiniz. Böylece, kaynaklarınızdan birini okumaya devam ettim:

Giriş ekranında Uygulama / Sistem Göstergelerini nasıl ekler veya değiştiririm?

Birincil cevap, halihazırda var olan bir kullanıcının ihtiyaç duydukları erişimi elde etmesini engellemek oldu. Ayrıca mevcut tüm Göstergelerin eklenmesi ve kaldırılması için bir çözüm sağladı. Göstergeler için birleşik bir yönetim çözümüdür. Sistem Göstergesini çalıştırmak / başlatmak için varsayılan (önceden var olan) bir kullanıcıyı geçersiz kılmak mümkün müdür?

Sistem Göstergesi, Birlik Uygulama Göstergesi API'sini kullanabilir mi (API, Birlik paneli tarafından düzgün bir şekilde kullanılabilir ve görüntülenebilir)? Bunlara verilen cevaplar evet ise, bu durumdan mahrum olur - sonuçta diğer sorunlara neden olmazsa. Bunun hemen bir cevap gibi görünmeyeceğini biliyorum, bu yüzden ne denedim denemeye açıklık getireceğim - görevi daha küçük hedeflere bölmeye çalışıyorum. Temel amaç, Uygulama Göstergesi API'sinin Sistem Göstergelerini kodlamak için kullanılıp kullanılamayacağını bulmak (Sistem Göstergeleri için önceden var olan birleşik bir API olarak).

Sorgunuzun bu bölümüne cevap olarak:

"Sistem göstergeleri için birleştirilmiş bir API var mı"

Maalesef, Sistem Göstergeleri için Uygulama Göstergesi API'lerini kullanmanın bir yolu yoktur. Gibi, benim çözüm geçersiz. :(


Maalesef hayır, uygulama göstergesi API sistemi göstergesi oluşturmak için kullanılamadı. İndikatör-sismonitor için olduğu gibi olacak , Birliğin ve birlik- selamlayıcının değiştirilmiş yapılarına ihtiyacı var.
user.dz

Bu durumda, yalnızca Sistem Göstergesi için olan yeni bir API gerekli gibi görünüyor. Gösterildiği gibi, Sistem Göstergesinde Ubuntu'dan çok sayıda ayrı API vardır. Sanırım Soru postasının sonunda belirtildiği gibi üçüncü parti kütüphaneleri kullanma seçeneğimiz kaldı.
TopHatProductions115
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.