Bagaimana cara mengembangkan Indikator Sistem untuk Persatuan?

38

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

Backgound:

Dari dua pertanyaan ini:

Saya belajar bahwa ada dua jenis indikator:

  • Sistem: suara, keyboard, aplikasi, ... (coba: ps ax | grep indicator :)
  • Aplikasi: nm-applet, sysmonitor, ... dan hampir semua yang tercantum dalam Indikator Aplikasi Apa yang tersedia?

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

Kedua pertanyaan tersebut adalah tentang menambah / 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 penyatuan-penyambut untuk layar masuk.

Sebagai kasus sysmonitor, bagi saya itu solusinya. Solusi terbaik adalah menerapkan indikator sistem daripada aplikasi.

Tema:

  • Apakah ada API terpadu untuk indikator sistem (Lebih disukai: Python lalu C / C ++)? Silakan merujuk ke dokumentasi resmi.

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

Memperbarui:

Saya menemukan beberapa tautan yang dapat mendorong:

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

    Mereka juga mencantumkan Indicate-0.7 API ( C & Python ). Apa ini? Ya, itu adalah saluran pesan DBus antara Aplikasi Desktop.

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

    API Indikator Sistem

    • Menu Pesan menggunakan libindicate.
    • Menu Suara menggunakan libunity.
    • Indikator Tanggal / Waktu menggunakan Evolution-Data-Server

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

    Coba apt-cache rdepends libunity9 libindicator7 libindicator3-7lihat indikator mana yang menyampaikan pustaka ini.

Pembaruan2: Ini untuk menjaga pengguna yang tertarik diperbarui.

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 uji di sumbernya, beberapa indikator dummy yang telah saya coba, dapat diinstal /usr/lib/indicators3/7/, mereka dibagikan lib .so. Saya bisa menampilkannya di Login & Sesi Reguler tetapi Tidak di Layar Kunci.

    Namun ada beberapa layanan indikator pengujian, yang sepertinya seperti sistem 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

user.dz
sumber

Jawaban:

12

Layanan Indikator Sistem

Yah, ini benar-benar sederhana dari yang saya harapkan Tidak ada API khusus untuk itu. Karena itu hanya GSimpleActionGroup & dengan GMenu yang diekspor melalui DBus maka Unity diberitahu tentang keberadaan mereka menggunakan file deklarasi dengan nama yang sama /usr/share/unity/indicators/. Tidak perlu perpustakaan lain.

Berikut contoh bahasa C yang sangat kecil :

  1. Dapatkan salinan tests/indicator-test-service.cdari libindicatorsumber

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    • indikator-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 menambah mode kunci & penyapa

      [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 .inpostfix dari nama file dan mengubah jalur yang dapat dieksekusi

      [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, timpa daftar indikator default

    • 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']
    • 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 sebagai gantinya, seperti indikator default lakukan.

  • Saya telah 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 dapat diinstal dan diuji dengan cepat.

  • Ini tampaknya terlalu sederhana dan dapat dengan mudah dipindahkan 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 mandiri penuh seperti yang di atas, ini hanyalah plugin share lib, mirip dengan libappmenu.so& libprintersmenu.so(menu aplikasi & indikator printer). Ini dapat ditampilkan hanya dalam sesi pengguna biasa & penyapa (Tidak pada layar kunci).

Saya tidak bisa membuatnya bekerja di mesin saya saat ini, tetapi saya lakukan sebelumnya. Berikut 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 tampil di layar penyapa

    • 90_unity-greeter.gschema.override gunakan nama yang sama tanpa libawalan dan .soekstensi.

      [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/
user.dz
sumber
2
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 diperlukan ( export_action_group, export_menu_model) dan objek ( SimpleActionGroup, Menu) ada di gi.repository.Gio. Saya akan mencoba menulis satu dalam beberapa hari mendatang.
user.dz
0

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

Saya tidak tahu apakah saya benar-benar membantu, tetapi saya harap ide ini 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 (berlawanan dengan pembuatan API terpadu yang baru untuk tujuan yang sama)

Idenya datang kepada saya sambil melihat posting berikut:

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

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

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

Bagaimana cara menambah atau memanipulasi Indikator Aplikasi / Sistem di layar masuk?

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

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

Menanggapi ini bagian dari permintaan Anda:

"Apakah ada API terpadu untuk indikator sistem"

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

ProdukTerbatas Top115
sumber
Sayangnya tidak, API indikator aplikasi tidak dapat digunakan untuk membuat indikator sistem. Ini akan menjadi kasus yang sama seperti untuk indikator-sysmonitor , Perlu dibangun kesatuan & penyatuan -penyambut.
user.dz
Dalam hal ini, sepertinya API baru diperlukan - API yang hanya untuk Indikator Sistem. Sebagaimana adanya, Indikator Sistem memiliki banyak, API terpisah dari Ubuntu. Saya pikir kita memiliki pilihan untuk menggunakan perpustakaan pihak ketiga, seperti yang dinyatakan pada akhir pos Pertanyaan.
TopHatProductions115