Làm thế nào để phát triển một chỉ số hệ thống cho sự thống nhất?


38

Đây không phải là bản sao của Cách tạo chỉ số Unity? . Tôi đang tìm kiếm chỉ báo hệ thống chứ không phải chỉ báo ứng dụng.

Backgound:

Từ hai câu hỏi sau:

Tôi đã học được rằng có hai loại chỉ số:

  • Hệ thống: âm thanh, bàn phím, ứng dụng, ... (thử ps ax | grep indicator:)
  • Ứng dụng: nm-applet, sysmonitor, ... và hầu hết tất cả những gì được liệt kê trong Chỉ số ứng dụng nào khả dụng?

Tất cả các chỉ số ứng dụng được xử lý / hiển thị bởi ứng dụng chỉ báo (một hệ thống). Các chỉ số hệ thống được hiển thị trực tiếp bởi bảng điều khiển Unity.

Cả hai câu hỏi là về việc thêm / xóa các chỉ số khỏi màn hình đăng nhập và khóa. Đầu tiên là thiết lập chuyển tiếp thẳng (khi xử lý các chỉ số hệ thống). Thứ hai là một thiết lập khó khăn (khi xử lý các chỉ số ứng dụng), cần sửa đổi nguồn dịch vụ bảng điều khiển (gói unity) cho màn hình khóa và nguồn của unity-helloer cho màn hình đăng nhập.

Như trường hợp của sysmonitortôi, đó là cách giải quyết. Giải pháp tốt nhất là thực hiện một chỉ báo hệ thống thay vì ứng dụng.

Đề tài:

  • Có API thống nhất cho các chỉ số hệ thống (Tốt nhất là: Python rồi C / C ++)? Xin vui lòng, tham khảo các tài liệu chính thức.

  • Hầu hết các chỉ số hệ thống được viết bằng ngôn ngữ lập trình Vala. Có ai có thể viết bản demo nhỏ cho chỉ báo hệ thống bằng Python hoặc C không?

Cập nhật:

Tôi tìm thấy một vài liên kết có thể thúc đẩy:

  • Trong trang dự án Các chỉ số ứng dụng , Họ đã liệt kê các liên kết đến API AppIndicator-0.3 ( C & Python ) được sử dụng cho các chỉ số ứng dụng.

    Họ cũng liệt kê API chỉ định-0,7 ( C & Python ). Cái gì thế này? Vâng, đó là một kênh nhắn tin DBus giữa các ứng dụng máy tính để bàn.

  • Mặt khác, trong trang dự án Các chỉ số hệ thống , họ đã đề cập:

    API chỉ báo hệ thống

    • Menu nhắn tin sử dụng libindicate.
    • Menu âm thanh sử dụng libunity.
    • Chỉ báo ngày / giờ sử dụng Evolution-Data-Server

    Chúng dường như liệt kê API dữ liệu chứ không phải API phát triển chỉ báo như cho Evolution-Data-Server. Nhưng không chắc chắn về libindicate & libunity. Có ai làm việc với hai thư viện này không?

    Hãy thử apt-cache rdepends libunity9 libindicator7 libindicator3-7xem chỉ số nào đang chuyển tiếp các thư viện này.

Update2: Điều này để giữ cho người dùng quan tâm cập nhật.

Từ những gì tôi đã thu thập cho đến bây giờ, đây là thứ tự của các giải pháp có thể:

  1. libindicator3-7 (cao, nhiều chỉ số phụ thuộc vào nó)

    Tôi tìm thấy một số ví dụ thử nghiệm trong nguồn, một số chỉ số giả mà tôi đã thử, có thể được cài đặt /usr/lib/indicators3/7/, chúng được chia sẻ lib .so. Tôi có thể hiển thị chúng trong Đăng nhập & Phiên thông thường nhưng không phải trong Màn hình khóa.

    Tuy nhiên, có một số dịch vụ chỉ báo thử nghiệm, có vẻ như là các hệ thống của Unity. Tôi chưa thử chúng.

  2. libindicator7

    Từ cùng một nguồn với libindicator3-7, từ ndepends:

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

    Nó dường như được sử dụng để làm container cho các chỉ số trong bảng.

  3. libunity9 (thấp)

    Chưa có nghiên cứu nào

Câu trả lời:


12

Dịch vụ chỉ báo hệ thống

Vâng, nó thực sự đơn giản hơn tôi mong đợi. Không có API cụ thể cho nó. Bởi vì nó chỉ là một GSimpleActiongroup và với GMothy tương ứng được xuất qua DBus, nên Unity được thông báo về sự hiện diện của họ bằng cách sử dụng tệp khai báo có cùng tên /usr/share/unity/indicators/. Không cần bất kỳ thư viện khác.

Dưới đây là một ví dụ ngôn ngữ C rất nhỏ :

  1. Lấy một bản sao tests/indicator-test-service.ctừ libindicatornguồn

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    
    • Indicator-test-service.c không có thay đổi

      #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 đã sửa đổi để thêm chế độ khóa và chào

      [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 xóa .inpostfix khỏi tên tệp và thay đổi đường dẫn thực thi

      [D-BUS Service]
      Name=com.canonical.indicator.test
      Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
      
  2. Biên dịch nó

    gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
  3. Hướng dẫn cài đặt

    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. Cấu hình cho Greeter, ghi đè danh sách chỉ báo mặc định

    • 90_unity-helloer.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']
      
    • cài đặt, dựng lên

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
      
  5. Kiểm tra

    sudo service lightdm restart

Ghi chú

  • Dịch vụ DBus thật rắc rối, nếu bạn muốn người dùng có thể đóng ứng dụng bất cứ lúc nào. Thay vào đó, tốt hơn là sử dụng tự động khởi động, giống như các chỉ báo mặc định.

  • Tôi đã tải lên các tập tin sẵn sàng ở đây:

    https://github.com/sneetsher/mysystemindicator_minimum

    và một bản sao sửa đổi ở đây:

    https://github.com/sneetsher/mysystemindicator

    Nơi tôi đã thử thực đơn khác nhau cho chế độ khác nhau. Nó có thể được cài đặt và thử nghiệm nhanh chóng.

  • Điều này có vẻ quá đơn giản và có thể dễ dàng chuyển sang bất kỳ ngôn ngữ nào khác có hỗ trợ cho GIO Gnome lib (bao gồm cả DBus). Khi tôi đang tìm kiếm con trăn, tôi có thể thêm nó sau.

Tài liệu tham khảo:


Plugin chỉ báo hệ thống

Đây không phải là chỉ báo độc lập đầy đủ như ở trên, nó chỉ là một plugin chia sẻ lib, tương tự như libappmenu.so& libprintersmenu.so(menu ứng dụng & chỉ báo máy in). Nó chỉ có thể được hiển thị trong phiên người dùng và lời chào thông thường (Không phải trên màn hình khóa).

Tôi không thể làm cho nó hoạt động trong máy hiện tại của tôi, nhưng tôi đã làm trước đây. Ở đây các bước, có thể tôi đang thiếu một cái gì đó.

  1. Sử dụng cùng một nguồn trên libindicator

    test/libdummy-indicator-*.c là những ví dụ (đơn giản và có thể nhìn thấy những cái hiển thị trên bảng điều khiển)

  2. Biên dịch

    ./autogen.sh
    make
    
  3. cài đặt, dựng lên

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
  4. Cấu hình để hiển thị trong màn hình chào

    • 90_unity-helloer.gschema.override sử dụng cùng tên mà không có libtiền tố và .sophần mở rộng.

      [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']
      
    • cài đặt, dựng lên

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

2
Tôi tự hỏi nếu điều này có thể được thực hiện trong Python .. C có vẻ hơi đáng sợ.
Seth

@ Tôi tin là có, nó có thể được tạo bằng Python. Như tôi vừa kiểm tra tất cả các hàm cần thiết ( export_action_group, export_menu_model) và các đối tượng ( SimpleActionGroup, Menu) đang ở gi.repository.Gio. Tôi sẽ thử viết một trong vài ngày tới.
user.dz

0

LƯU Ý: Vui lòng kiểm tra dưới cùng của bài đăng này để biết tiếng nói cuối cùng về câu trả lời này.

Tôi không biết liệu tôi có thực sự giúp được gì không, nhưng tôi hy vọng rằng ý tưởng này có thể hữu ích.

Từ những gì tôi đã tìm kiếm, sự khác biệt trong Các chỉ số hệ thống và ứng dụng là khác biệt. Với ý nghĩ này, bây giờ tôi giới thiệu một khái niệm nghi vấn:

Việc sử dụng API chỉ báo ứng dụng trong Chỉ báo hệ thống (trái ngược với việc tạo API mới, hợp nhất cho cùng mục đích)

Ý tưởng đã đến với tôi trong khi xem các bài viết sau:

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

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

API Unity dường như được xây dựng chủ yếu để sử dụng với Các chỉ số ứng dụng, nhưng cả hai chỉ số hệ thống và ứng dụng có thể sử dụng lập trình tương tự (C lang). Tuy nhiên, bạn đã đề cập trước đó rằng hai loại Chỉ số này được xử lý bởi hai hệ thống khác nhau. Do đó, sau đó tôi đã tiến hành đọc một trong những nguồn của bạn:

Làm cách nào để thêm hoặc thao tác Các chỉ số ứng dụng / hệ thống trong màn hình đăng nhập?

Câu trả lời chính liên quan đến việc ghi đè người dùng đã tồn tại để có quyền truy cập mà họ yêu cầu. Nó cũng cung cấp một giải pháp để thêm và xóa tất cả các Chỉ số hiện có. Đó là một giải pháp quản lý thống nhất cho các chỉ số. Có thể ghi đè người dùng mặc định (tồn tại trước) để chạy / giới thiệu Chỉ báo hệ thống không?

Chỉ báo hệ thống có thể sử dụng API chỉ số ứng dụng Unity (API có thể được sử dụng và hiển thị đúng bởi bảng điều khiển Unity) không? Nếu câu trả lời cho những câu hỏi này là có, điều đó sẽ làm bão hòa tình hình - nếu nó không gây ra các vấn đề khác. Tôi biết rằng điều này sẽ không giống như một câu trả lời ngay lập tức, vì vậy tôi sẽ làm rõ những gì tôi đã cố gắng - Tôi đang cố gắng chia nhiệm vụ thành các mục tiêu nhỏ hơn. Mục tiêu chính là tìm hiểu xem API chỉ số ứng dụng có thể được sử dụng để mã hóa các chỉ số hệ thống (như là một API thống nhất, tồn tại trước cho các chỉ số hệ thống).

Đáp lại phần truy vấn này của bạn:

"Có API thống nhất cho các chỉ số hệ thống không"

Thật không may, mặc dù, không có cách nào để sử dụng API chỉ số ứng dụng cho các chỉ số hệ thống. Như vậy, giải pháp của tôi là void :(


Thật không may, API chỉ báo ứng dụng không thể được sử dụng để tạo chỉ báo hệ thống. nó sẽ giống như trường hợp đối với sysmonitor , Nó cần các bản dựng sửa đổi của sự thống nhất và sự thống nhất-lời chào.
user.dz

Trong trường hợp đó, có vẻ như cần một API mới - một API chỉ dành cho Chỉ báo hệ thống. Như hiện tại, System Indicator có nhiều API riêng biệt từ Ubuntu. Tôi nghĩ rằng chúng tôi còn lại với tùy chọn sử dụng thư viện của bên thứ ba, như đã nêu ở cuối bài Câu hỏi.
TopHatSản phẩm115
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.