Pertanyaan Bagaimana cara mengembangkan Indikator Sistem untuk Kesatuan?


Ini bukan duplikat dari Bagaimana cara membuat indikator Unity?. Saya mencari indikator sistem bukan indikator aplikasi.

Backgound:

Dari dua pertanyaan ini:

Saya belajar bahwa ada dua jenis indikator:

Semua indikator aplikasi ditangani / ditunjukkan oleh aplikasi indikator (sistem satu). Indikator sistem ditunjukkan langsung oleh panel Unity.

Kedua pertanyaan tersebut adalah tentang menambahkan / menghapus indikator dari layar masuk & kunci. Yang pertama adalah pengaturan lurus ke depan (ketika berhadapan dengan indikator sistem). Yang kedua adalah pengaturan yang sulit (ketika berhadapan dengan indikator aplikasi), yang perlu memodifikasi sumber layanan panel (paket kesatuan) untuk layar kunci dan sumber persatuan-penyapa untuk layar masuk.

Seperti halnya kasus sysmonitor, bagi saya itu solusi. Solusi terbaik adalah dengan mengimplementasikan indikator sistem, bukan yang aplikasi.

Tema:

  • Apakah ada API terpadu untuk indikator sistem (Lebih disukai: Python, kemudian C / C ++)? Tolong, referensi ke dokumentasi resmi.

  • Sebagian besar indikator sistem ditulis menggunakan bahasa pemrograman Vala. Bisakah ada yang menulis demo kecil untuk indikator sistem menggunakan Python atau C?

Memperbarui:

Saya menemukan beberapa tautan yang dapat memberikan dorongan:

  • Di Indikator Aplikasi halaman proyek, Mereka mencantumkan tautan ke AppIndicator-0.3 API (C & Python) digunakan untuk indikator aplikasi.

    Mereka terdaftar juga Mengindikasikan-0,7 API (C & Python). Apa ini? Nah, itu adalah saluran perpesanan DBus antara Aplikasi Desktop.

  • Di sisi lain, di Indikator Sistem halaman proyek, mereka menyebutkan:

    API Indikator Sistem

    • Menu Messaging menggunakan libindicate.
    • Menu Suara menggunakan kebebasan.
    • Indikator Tanggal / Waktu menggunakan Evolution-Data-Server

    Mereka tampaknya mencantumkan API Data bukan API Pengembangan Indikator seperti untuk Evolution-Data-Server. Tapi tidak yakin libindicate & kebebasan. Apakah ada yang bekerja dengan dua perpustakaan ini?

    Mencoba apt-cache rdepends libunity9 libindicator7 libindicator3-7 untuk melihat indikator mana yang menyampaikan pustaka-pustaka ini.

Pembaruan2: Ini untuk terus memperbarui pengguna yang tertarik.

Dari apa yang saya kumpulkan sampai sekarang, berikut adalah urutan solusi yang mungkin:

  1. libindicator3-7 (tinggi, Banyak indikator bergantung padanya)

    Saya menemukan beberapa contoh pengujian di sumbernya, beberapa indikator dummy yang telah saya coba, dapat diinstal /usr/lib/indicators3/7/, mereka berbagi lib .so. Saya bisa menampilkannya di Login & Sesi Reguler tetapi Tidak di Layar Kunci.

    Namun ada beberapa layanan indikator tes, yang tampaknya seperti sistem Unity. Saya belum mencobanya.

  2. libindicator7

    Dari sumber yang sama dengan libindicator3-7, dari rdepends:

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

    Tampaknya digunakan untuk membuat wadah untuk indikator di panel.

  3. libunity9 (rendah)

    Belum ada penelitian


38
2017-10-27 20:02


asal




Jawaban:


Layanan Indikator Sistem

Yah, itu benar-benar lebih sederhana dari yang saya harapkan. Tidak ada API khusus untuk itu. Karena itu hanya a GSimpleActionGroup & dengan yang sesuai GMenudiekspor melalui DBus kemudian Unity diberitahu tentang keberadaan mereka menggunakan file deklarasi dengan nama yang sama dimasukkan ke dalam /usr/share/unity/indicators/. Tidak perlu untuk perpustakaan lain.

Di sini sangat kecil Bahasa C. contoh:

  1. Dapatkan salinan tests/indicator-test-service.c dari libindicator sumber

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    
    • indicator-test-service.c tidak ada perubahan

      #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 dimodifikasi untuk menambahkan mode kunci & penyambut

      [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 menghapus .in postfix dari filename dan mengubah jalur eksekusi

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

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

    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. Konfigurasi untuk Greeter, mengesampingkan daftar indikator standar

    • 90_user-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']
      
    • Memasang

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

    sudo service lightdm restart
    

Catatan

  • Layanan DBus merepotkan, jika Anda ingin pengguna dapat menutup aplikasi kapan saja. Lebih baik menggunakan autostart saja, seperti yang dilakukan oleh indikator default.

  • Saya sudah mengunggah file siap di sini:

    https://github.com/sneetsher/mysystemindicator_minimum

    dan salinan yang dimodifikasi di sini:

    https://github.com/sneetsher/mysystemindicator

    Di mana saya telah mencoba menu yang berbeda untuk mode yang berbeda. Itu bisa dipasang dan diuji dengan cepat.

  • Ini tampaknya terlalu sederhana dan dapat dengan mudah diporting ke bahasa lain yang memiliki dukungan untuk GIO Gnome lib (termasuk DBus). Saat saya mencari python, saya dapat menambahkannya nanti.

Referensi:


Plugin Indikator Sistem

Ini bukan indikator standalone penuh sebagai yang di atas, itu hanya plugin lib berbagi, mirip dengan libappmenu.so & libprintersmenu.so (menu aplikasi & indikator printer). Ini hanya dapat ditampilkan di sesi & penyambutan pengguna reguler (Bukan di layar kunci).

Saya tidak bisa membuatnya bekerja di mesin saya saat ini, tetapi saya lakukan sebelumnya. Di sini langkah-langkahnya, mungkin saya kehilangan sesuatu.

  1. Menggunakan sumber yang sama di atas libindicator

    test/libdummy-indicator-*.c adalah contoh (sederhana & terlihat yang muncul di panel)

  2. Menyusun

    ./autogen.sh
    make
    
  3. Memasang

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
    
  4. Konfigurasikan untuk ditampilkan di layar penyambut

    • 90_user-greeter.gschema.override gunakan nama yang sama tanpa lib awalan dan .so perpanjangan.

      [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']
      
    • Memasang

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

12
2018-04-01 17:04



Saya ingin tahu apakah ini bisa dilakukan dengan Python .. C terlihat sedikit menakutkan. - Seth♦
@Seth Saya percaya ya itu bisa dibuat dengan Python. Karena saya baru saja memeriksa semua fungsi yang dibutuhkan (export_action_group,export_menu_model) dan objek (SimpleActionGroup, Menu) berada di gi.repository.Gio. Saya akan mencoba menulis satu dalam beberapa hari mendatang. - user.dz


CATATAN:  Silakan periksa bagian bawah posting ini untuk jawaban akhir atas jawaban ini.

Saya tidak tahu apakah saya benar-benar ada bantuan, tetapi saya berharap ide ini dapat bermanfaat.

Dari apa yang saya cari, perbedaan dalam Indikator Sistem dan Aplikasi berbeda. Dengan pemikiran ini, saya sekarang memperkenalkan konsep yang dipertanyakan:

Penggunaan API Indikator Aplikasi dalam Indikator Sistem (bertentangan dengan pembuatan API terpadu baru untuk tujuan yang sama)

Idenya datang ke saya sambil melihat posting berikut:

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

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

Unity API tampaknya terutama dibuat untuk digunakan dengan Indikator Aplikasi, tetapi Indikator Sistem dan Aplikasi dapat menggunakan program yang serupa (Bahasa pemrograman). Namun, Anda sebutkan sebelumnya bahwa kedua jenis Indikator ini ditangani oleh dua sistem berbeda. Karena itu, saya kemudian mulai membaca salah satu sumber Anda:

Bagaimana cara saya menambahkan atau memanipulasi Indikator Aplikasi / Sistem di layar login?

Jawaban utama yang melibatkan mengesampingkan pengguna yang sudah ada untuk mendapatkan akses yang diperlukan. Ini juga memberikan solusi untuk menambah dan menghapus semua Indikator yang ada. Ini adalah solusi manajemen terpadu untuk Indikator. Apakah mungkin untuk mengganti pengguna default (yang sudah ada sebelumnya) untuk menjalankan / memperkenalkan Indikator Sistem?

Dapatkah Indikator Sistem menggunakan API Unity Application Indicator (dapatkah API digunakan dan ditampilkan dengan benar oleh panel Unity)? Jika jawabannya adalah ya, itu akan memuaskan situasi - jika tidak menyebabkan masalah lain sebagai hasilnya.   Saya tahu bahwa ini tidak akan segera tampak seperti jawaban, jadi saya akan mengklarifikasi apa yang saya coba - saya mencoba untuk memecah tugas menjadi tujuan yang lebih kecil. Tujuan utamanya adalah, mencari tahu apakah API Indikator Aplikasi dapat digunakan untuk pengkodean Indikator Sistem (sebagai API yang sudah ada sebelumnya untuk Indikator Sistem).

Menanggapi bagian dari pertanyaan Anda ini:

"Apakah ada API terpadu untuk indikator sistem"

Sayangnya, tidak ada cara untuk menggunakan API Indikator Aplikasi untuk Indikator Sistem. Dengan demikian, solusi saya batal :(


0
2018-03-14 15:17



Sayangnya tidak, API indikator aplikasi tidak dapat digunakan untuk membuat indikator sistem. itu akan menjadi kasus yang sama seperti untuk indikator-sysmonitorDibutuhkan modifikasi dari kesatuan & penyambut persatuan. - user.dz
Dalam hal ini, sepertinya API baru diperlukan - yang hanya untuk Indikator Sistem. Seperti berdiri, Indikator Sistem memiliki beberapa, API terpisah dari Ubuntu. Saya pikir kami pergi dengan opsi menggunakan pustaka pihak ketiga, sebagaimana dinyatakan di akhir pos Pertanyaan. - TopHatProductions115