จะพัฒนาตัวบ่งชี้ระบบเพื่อความสามัคคีได้อย่างไร


38

นี่ไม่ใช่สิ่งที่ซ้ำกันของวิธีการสร้างตัวบ่งชี้ Unity . ฉันกำลังมองหาตัวบ่งชี้ระบบไม่ใช่ตัวบ่งชี้แอปพลิเคชัน

backgound:

จากคำถามสองข้อต่อไปนี้:

ฉันเรียนรู้ว่ามีตัวบ่งชี้สองประเภท:

ตัวบ่งชี้แอปพลิเคชันทั้งหมดได้รับการจัดการ / แสดงโดยตัวบ่งชี้แอปพลิเคชัน (ระบบหนึ่ง) ตัวบ่งชี้ระบบจะแสดงโดยตรงโดยแผงความสามัคคี

คำถามทั้งสองเกี่ยวกับการเพิ่ม / ลบตัวบ่งชี้จากหน้าจอเข้าสู่ระบบและล็อค สิ่งแรกคือการตั้งค่าตรงไปตรงมา (เมื่อจัดการกับตัวบ่งชี้ระบบ) ประการที่สองคือการตั้งค่าที่ยากลำบาก (เมื่อต้องรับมือกับตัวบ่งชี้แอพ) ซึ่งจำเป็นต้องแก้ไขแหล่งที่มาของบริการแผง (แพคเกจ Unity) สำหรับล็อคหน้าจอและแหล่งที่มาของความสามัคคี - หน้าจอเข้าสู่ระบบ

สำหรับกรณีของsysmonitorสำหรับฉันที่เป็นวิธีแก้ปัญหา ทางออกที่ดีที่สุดคือการใช้ตัวบ่งชี้ระบบแทนแอปพลิเคชันหนึ่ง

หัวข้อ:

  • มี API รวมสำหรับตัวบ่งชี้ระบบ (โดยเฉพาะอย่างยิ่ง: Python และ C / C ++)? กรุณาอ้างอิงถึงเอกสารอย่างเป็นทางการ

  • ตัวบ่งชี้ระบบส่วนใหญ่เขียนด้วยภาษาโปรแกรม Vala มีใครเขียนเดโมขนาดเล็กสำหรับตัวบ่งชี้ระบบโดยใช้ Python หรือ C ได้ไหม

ปรับปรุง:

ฉันพบลิงก์น้อยที่อาจทำให้เกิดความเสียหาย:

  • ในหน้าโครงการตัวบ่งชี้แอปพลิเคชันพวกเขาแสดงรายการลิงก์ไปยัง AppIndicator-0.3 API ( C & Python ) ที่ใช้สำหรับตัวบ่งชี้แอปพลิเคชัน

    พวกเขายังระบุถึง API 0.7 ( C & Python ) นี่คืออะไร? มันเป็นช่องทางการส่งข้อความ DBus ระหว่างแอปพลิเคชันเดสก์ท็อป

  • ในอีกทางหนึ่งในหน้าโครงการตัวบ่งชี้ระบบพวกเขากล่าวถึง:

    API ตัวบ่งชี้ระบบ

    • เมนูข้อความโดยใช้ libindicate
    • เมนูเสียงโดยใช้ libunity
    • ตัวบ่งชี้วันที่ / เวลาโดยใช้ Evolution-Data-Server

    ดูเหมือนว่าพวกเขาจะแสดงรายการ Data API ไม่ใช่ตัวบ่งชี้การพัฒนา API เช่นเดียวกับ Evolution-Data-Server แต่ไม่แน่ใจเกี่ยวกับlibindicate & libunity มีใครทำงานกับห้องสมุดทั้งสองนี้หรือไม่?

    ลองapt-cache rdepends libunity9 libindicator7 libindicator3-7ดูว่าตัวบ่งชี้ใดถ่ายทอดไลบรารีเหล่านี้

Update2:สิ่งนี้เพื่อให้ผู้ใช้ที่สนใจอัปเดต

จากสิ่งที่ฉันได้รวบรวมมาจนถึงตอนนี้นี่คือลำดับของวิธีแก้ปัญหาที่เป็นไปได้:

  1. libindicator3-7 (สูงตัวบ่งชี้หลายตัวขึ้นอยู่กับมัน)

    ผมพบว่าตัวอย่างการทดสอบบางอย่างในแหล่งที่มาของบางตัวชี้วัดหุ่นที่ผมได้พยายามที่จะได้รับการติดตั้งในlib/usr/lib/indicators3/7/ พวกเขาจะใช้ร่วมกัน .soฉันสามารถแสดงมันในการเข้าสู่ระบบ & เซสชันปกติ แต่ไม่ได้อยู่ในหน้าจอล็อค

    อย่างไรก็ตามมีบริการทดสอบตัวบ่งชี้บางอย่างซึ่งดูเหมือนว่าเป็นระบบ Unity ฉันยังไม่ได้ลองเลย

  2. libindicator7

    จากแหล่งเดียวกันกับ libindicator3-7 จาก rdepends:

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

    ดูเหมือนว่าจะใช้ในการทำภาชนะสำหรับตัวชี้วัดในแผง

  3. libunity9 (ต่ำ)

    ยังไม่มีงานวิจัย

คำตอบ:


12

บริการตัวบ่งชี้ระบบ

เป็นเรื่องง่ายกว่าที่ฉันคาดไว้ ไม่มี API เฉพาะสำหรับมัน เพราะมันเป็นเพียงGSimpleActionGroupและสอดคล้องกับGMenu 's ส่งออกผ่าน DBus /usr/share/unity/indicators/แล้วความสามัคคีจะบอกเกี่ยวกับสถานะของพวกเขาโดยใช้ไฟล์ประกาศที่มีชื่อเดียวกันใส่ใน ไม่จำเป็นสำหรับห้องสมุดอื่น ๆ

นี่คือตัวอย่างภาษา C ที่มีขนาดเล็กมาก:

  1. ได้รับสำเนาของtests/indicator-test-service.cจากlibindicatorแหล่งที่มา

    apt-get source libindicator
    cp libindicator-*/tests/indicator-test-service.c .
    cp libindicator-*/tests/com.canonical.indicator.test* .
    • ตัวบ่งชี้ทดสอบบริการไม่มีการเปลี่ยนแปลง

      #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ถูกแก้ไขเพื่อเพิ่มโหมด lock & 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ลบ.inpostfix ออกจากชื่อไฟล์และเปลี่ยนเส้นทางที่เรียกใช้งานได้

      [D-BUS Service]
      Name=com.canonical.indicator.test
      Exec=/usr/lib/x86_64-linux-gnu/indicator-test/indicator-test-service
  2. รวบรวมมัน

    gcc -o indicator-test-service indicator-test-service.c `pkg-config --cflags --libs gtk+-3.0`
  3. คู่มือการติดตั้ง

    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 แทนที่รายการตัวบ่งชี้เริ่มต้น

    • 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']
    • ติดตั้ง

      cp 90_unity-greeter.gschema.override /usr/share/glib-2.0/schemas/
      glib-compile-schemas /usr/share/glib-2.0/schemas/
  5. ทดสอบ

    sudo service lightdm restart

หมายเหตุ

  • บริการ DBus ลำบากหากคุณต้องการให้ผู้ใช้สามารถปิดแอปพลิเคชันได้ทุกเวลา มันเป็นการดีกว่าที่จะใช้ autostart แทนเช่นตัวบ่งชี้เริ่มต้นทำ

  • ฉันได้อัปโหลดไฟล์พร้อมที่นี่:

    https://github.com/sneetsher/mysystemindicator_minimum

    และสำเนาที่แก้ไขที่นี่:

    https://github.com/sneetsher/mysystemindicator

    ฉันลองใช้เมนูอื่นสำหรับโหมดอื่น สามารถติดตั้งและทดสอบได้อย่างรวดเร็ว

  • ดูเหมือนง่ายเกินไปและสามารถนำไปใช้กับภาษาอื่น ๆ ที่รองรับ GIO Gnome lib ได้อย่างง่ายดาย (รวมถึง DBus) ขณะที่ฉันกำลังมองหาหลามฉันอาจเพิ่มในภายหลัง

อ้างอิง:


ปลั๊กอินตัวบ่งชี้ระบบ

นี่ไม่ใช่ตัวบ่งชี้แบบสแตนด์อโลนแบบเต็มตามที่กล่าวไว้ข้างต้นมันเป็นเพียงปลั๊กอินแชร์ lib ซึ่งคล้ายกับlibappmenu.so& libprintersmenu.so(ตัวบ่งชี้เมนูแอปพลิเคชันและเครื่องพิมพ์) มันสามารถแสดงได้เฉพาะในเซสชันผู้ใช้ปกติ & greeter (ไม่ใช่บนหน้าจอล็อค)

ฉันไม่สามารถทำงานได้ในเครื่องปัจจุบันของฉัน แต่ฉันทำมาก่อน ที่นี่ขั้นตอนอาจเป็นเพราะฉันขาดอะไรบางอย่าง

  1. ใช้แหล่งเดียวกันด้านบนของ libindicator

    test/libdummy-indicator-*.c คือตัวอย่าง (ตัวอย่างที่เห็นง่าย ๆ และปรากฏบนแผง)

  2. รวบรวม

    ./autogen.sh
    make
  3. ติดตั้ง

    sudo cp tests/.libs/libdummy-indicator-visible.so /usr/lib/indicators3/7/libdummy.so
  4. กำหนดค่าให้แสดงในหน้าจอที่เล็กลง

    • 90_unity-greeter.gschema.overrideใช้ชื่อเดียวกันโดยไม่มีส่วนlibนำหน้าและ.soส่วนขยาย

      [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']
    • ติดตั้ง

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

2
ฉันสงสัยว่าสิ่งนี้สามารถทำได้ใน Python .. C ดูน่ากลัวนิดหน่อย
เซท

@ เซ็ทฉันเชื่อว่าใช่มันสามารถทำได้ใน Python ในฐานะที่ผมได้ตรวจสอบเพียงแค่ฟังก์ชั่นทั้งหมดที่จำเป็น ( export_action_group, export_menu_model) และวัตถุ ( SimpleActionGroup, Menu) gi.repository.Gioอยู่ใน ฉันจะลองเขียนในอีกไม่กี่วันข้างหน้า
user.dz

0

หมายเหตุ: โปรดตรวจสอบด้านล่างของโพสต์นี้สำหรับคำพูดสุดท้ายในคำตอบนี้

ฉันไม่รู้ว่าฉันได้รับความช่วยเหลือใด ๆ หรือไม่ แต่ฉันหวังว่าแนวคิดนี้อาจมีประโยชน์

จากสิ่งที่ฉันค้นหาความแตกต่างในตัวบ่งชี้ระบบและแอปพลิเคชันนั้นแตกต่างกัน ด้วยสิ่งนี้ในใจตอนนี้ฉันแนะนำแนวคิดที่น่าสงสัย:

การใช้ Application Indicator API ใน System Indicator (ตรงข้ามกับการสร้าง API แบบรวมใหม่สำหรับจุดประสงค์เดียวกัน)

ความคิดมาถึงฉันในขณะที่ดูโพสต์ต่อไปนี้:

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

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

Unity API ดูเหมือนจะสร้างขึ้นเพื่อใช้กับ Application Indicators เป็นหลัก แต่ทั้ง System และ Application Indicators อาจใช้การเขียนโปรแกรมที่คล้ายกัน (C lang) อย่างไรก็ตามคุณกล่าวก่อนหน้านี้ว่าตัวบ่งชี้ทั้งสองประเภทนี้ได้รับการจัดการโดยระบบที่แตกต่างกันสองระบบ ดังนั้นฉันจึงอ่านแหล่งข้อมูลของคุณอย่างใดอย่างหนึ่ง:

ฉันจะเพิ่มหรือจัดการ Application / System Indicators ในหน้าจอเข้าสู่ระบบได้อย่างไร

คำตอบหลักเกี่ยวข้องกับการแทนที่ผู้ใช้ที่มีอยู่แล้วเพื่อเข้าถึงที่พวกเขาต้องการ นอกจากนี้ยังมีโซลูชันสำหรับการเพิ่มและลบตัวบ่งชี้ที่มีอยู่ทั้งหมด มันเป็นโซลูชั่นการจัดการแบบครบวงจรสำหรับตัวชี้วัด เป็นไปได้ไหมที่จะแทนที่ผู้ใช้เริ่มต้น (ที่มีอยู่แล้ว) เพื่อเรียกใช้ / แนะนำตัวบ่งชี้ระบบ

System Indicator สามารถใช้ Unity Application Indicator API (สามารถใช้และแสดง API อย่างถูกต้องโดยพาเนล Unity) ได้หรือไม่? หากคำตอบของสิ่งเหล่านี้คือใช่นั่นจะทำให้เกิดสถานการณ์ - ถ้าไม่ได้เป็นสาเหตุของปัญหาอื่น ฉันรู้ว่านี่จะไม่ดูเหมือนคำตอบในทันทีดังนั้นฉันจะอธิบายสิ่งที่ฉันพยายาม - ฉันพยายามแบ่งงานออกเป็นวัตถุประสงค์เล็ก ๆ วัตถุประสงค์หลักคือการค้นหาว่า Application Indicator API สามารถใช้สำหรับการเข้ารหัส System Indicators (เป็น API แบบรวมที่มีอยู่แล้วล่วงหน้าสำหรับตัวบ่งชี้ระบบ)

ในการตอบคำถามส่วนนี้ของคุณ:

"มี API แบบรวมสำหรับตัวบ่งชี้ระบบหรือไม่"

อย่างไรก็ตามไม่มีวิธีใช้ Application Indicator APIs สำหรับตัวบ่งชี้ระบบ ดังนั้นโซลูชันของฉันจึงเป็นโมฆะ :(


น่าเสียดายที่ไม่สามารถใช้ API ตัวบ่งชี้แอปพลิเคชันเพื่อสร้างตัวบ่งชี้ระบบ มันจะเป็นกรณีเดียวกันกับตัวบ่งชี้ - sysmonitor , มันต้องมีการสร้างการสร้างความสามัคคี & ความสามัคคี - greeter
user.dz

ในกรณีนี้ดูเหมือนว่าจำเป็นต้องมี API ใหม่ซึ่งเป็นเพียงตัวบ่งชี้ระบบ ตัวบ่งชี้ระบบมีหลายแยก API จากอูบุนตู ฉันคิดว่าเราเหลือตัวเลือกในการใช้ห้องสมุดของบุคคลที่สามตามที่ระบุไว้ท้ายโพสต์คำถาม
TopHatProductions115
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.