एकता के लिए एक प्रणाली संकेतक कैसे विकसित करें?


38

यह कैसे एकता संकेतक बनाने के लिए एक डुप्लिकेट नहीं है ? । मैं सिस्टम इंडिकेटर की तलाश कर रहा हूं न कि एप्लिकेशन इंडिकेटर की।

backgound:

इन दो प्रश्नों से:

मैंने सीखा कि संकेतक दो प्रकार के होते हैं:

सभी एप्लिकेशन इंडिकेटर्स को संकेतक-एप्लिकेशन (एक सिस्टम एक) द्वारा नियंत्रित / दिखाया जाता है। सिस्टम संकेतक सीधे एकता पैनल द्वारा दिखाए जाते हैं।

दोनों प्रश्न लॉगिन और लॉक स्क्रीन से संकेतक जोड़ने / हटाने के बारे में हैं। पहला एक स्ट्रेट फॉरवर्ड सेटअप था (सिस्टम इंडिकेटर्स के साथ काम करते समय)। दूसरा एक कठिन सेटअप था (ऐप इंडिकेटर्स से निपटने के लिए), जिसे लॉक स्क्रीन के लिए पैनल सर्विस (एकता पैकेज) के स्रोत और लॉगिन स्क्रीन के लिए एकता-अभिवादन के स्रोत को संशोधित करने की आवश्यकता है।

के रूप में sysmonitor, मेरे लिए कि समाधान था। सबसे अच्छा समाधान एक आवेदन एक के बजाय एक सिस्टम संकेतक को लागू करना है।

विषय:

  • क्या सिस्टम संकेतकों के लिए एकीकृत एपीआई है (अधिमानतः: पायथन फिर सी / सी ++)? कृपया, आधिकारिक दस्तावेजों का संदर्भ लें।

  • अधिकांश सिस्टम संकेतक Vala प्रोग्रामिंग भाषा का उपयोग करके लिखे गए हैं। क्या कोई भी पायथन या सी का उपयोग करके सिस्टम इंडिकेटर के लिए छोटा डेमो लिख सकता है?

अद्यतन करें:

मुझे कुछ लिंक मिले जो धक्का दे सकते हैं:

  • में आवेदन संकेतक परियोजना पृष्ठ, वे AppIndicator-0.3 एपीआई (करने के लिए लिंक सूचीबद्ध सी और पायथन ) आवेदन संकेतक के लिए इस्तेमाल किया।

    उन्होंने Indicate-0.7 API ( C & Python ) को भी सूचीबद्ध किया । यह क्या है? खैर, यह डेस्कटॉप एप्लिकेशन के बीच एक डीबस मैसेजिंग चैनल है।

  • दूसरी ओर, सिस्टम संकेतक प्रोजेक्ट पेज में, उन्होंने उल्लेख किया है:

    सिस्टम संकेतक एपीआई

    • कामवासना का उपयोग करके मेनू को संदेश देना।
    • कामेच्छा का उपयोग करके ध्वनि मेनू।
    • इवोल्यूशन-डेटा-सर्वर का उपयोग करते हुए दिनांक / समय संकेतक

    वे विकास-डेटा-सर्वर के लिए डेटा एपीआई नहीं संकेतक विकास एपीआई को सूचीबद्ध करते हैं। लेकिन libindicate और libunity के बारे में निश्चित नहीं है । क्या इन दोनों पुस्तकालयों के साथ कोई काम किया गया?

    apt-cache rdepends libunity9 libindicator7 libindicator3-7यह देखने की कोशिश करें कि कौन सा संकेतक इन पुस्तकालयों को स्थानांतरित कर रहा है।

Update2: यह रुचि रखने वाले उपयोगकर्ताओं को अपडेट रखने के लिए है।

मैंने अब तक जो कुछ भी एकत्र किया है, वह यहां से संभव समाधानों का क्रम है:

  1. libindicator3-7 (उच्च, कई संकेतक इस पर निर्भर करते हैं)

    मुझे स्रोत में कुछ परीक्षण उदाहरण मिले, कुछ डमी संकेतक जो मैंने कोशिश की हैं, उन्हें स्थापित किया जा सकता है /usr/lib/indicators3/7/, वे साझा किए गए हैं .so। मैं उन्हें लॉगिन और नियमित सत्र में प्रदर्शित कर सकता था लेकिन लॉक स्क्रीन में नहीं।

    हालांकि कुछ परीक्षण संकेतक सेवाएं हैं, जो एकता प्रणाली की तरह लगती हैं। मैंने अभी तक उनकी कोशिश नहीं की है।

  2. libindicator7

    एक ही स्रोत से libindicator3-7 के लिए, rdepends से:

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

    इसका उपयोग पैनलों में संकेतक के लिए कंटेनर बनाने के लिए किया जाता है।

  3. libunity9 (कम)

    अभी तक कोई शोध नहीं

जवाबों:


12

सिस्टम संकेतक सेवा

खैर, यह वास्तव में सरल है तो मुझे उम्मीद थी। इसके लिए कोई विशिष्ट API नहीं है। क्योंकि यह सिर्फ एक GSimpleActionGroup है और इसी GMenu DBus के माध्यम से निर्यात किया जाता है, तो एकता में एक ही नाम के साथ घोषणा फ़ाइल का उपयोग कर उनकी उपस्थिति के बारे में बताया जाता है /usr/share/unity/indicators/। किसी अन्य पुस्तकालय की आवश्यकता नहीं।

यहाँ एक बहुत छोटी सी भाषा उदाहरण है:

  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* .
    
    • सूचक-परीक्षण-service.c कोई परिवर्तन नहीं

      #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 लॉक और शुभकामना मोड जोड़ने के लिए संशोधित

      [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 फ़ाइल नाम से पोस्टफ़िक्स को हटा दें और निष्पादन योग्य पथ को परिवर्तित करें

      [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. ग्रीट के लिए कॉन्फ़िगरेशन, डिफ़ॉल्ट संकेतक सूची को ओवरराइड करें

    • 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 सेवा परेशान करने वाली है, यदि आप चाहते हैं कि उपयोगकर्ता कभी भी एप्लिकेशन को बंद कर सके। इसके बजाय ऑटोस्टार्ट का उपयोग करना बेहतर है, जैसे कि डिफ़ॉल्ट संकेतक करते हैं।

  • मैंने यहां तैयार फाइलें अपलोड की हैं:

    https://github.com/sneetsher/mysystemindicator_minimum

    और यहां एक संशोधित प्रति:

    https://github.com/sneetsher/mysystemindicator

    जहां मैंने अलग-अलग मोड के लिए अलग-अलग मेन्यू की कोशिश की है। यह जल्दी से स्थापित और परीक्षण किया जा सकता है।

  • यह बहुत आसान लगता है और इसे आसानी से किसी अन्य भाषा में पोर्ट किया जा सकता है जिसमें GIO Gnome lib (DBus सहित) के लिए समर्थन है। जैसा कि मुझे अजगर की तलाश है, मैं इसे बाद में जोड़ सकता हूं।

संदर्भ:


सिस्टम संकेतक प्लगिन

यह पूर्ण स्टैंडअलोन संकेतक के रूप में ऊपर एक, यह सिर्फ एक हिस्सा lib प्लगइन, के समान है नहीं है libappmenu.soऔर libprintersmenu.so(आवेदन मेनू और प्रिंटर सूचक)। यह केवल नियमित उपयोगकर्ता सत्र और अभिवादन में दिखाया जा सकता है (लॉक स्क्रीन पर नहीं)।

मैं इसे अपने वर्तमान मशीन में काम नहीं कर सका, लेकिन मैंने पहले किया था। यहाँ कदम, मैं कुछ याद कर रहा हूँ हो सकता है।

  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_ यूनिटी-अभिवादन। Ggshema.overridelib उपसर्ग और .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
मुझे आश्चर्य है कि अगर यह पायथन में किया जा सकता है .. सी थोड़ा डरावना लग रहा है।
सेठ

@ सेठ मुझे विश्वास है कि हाँ यह पायथन में बनाया जा सकता है। जैसा कि मैंने अभी सभी आवश्यक कार्यों ( export_action_group, export_menu_model) और ऑब्जेक्ट्स ( SimpleActionGroup, Menu) की जाँच की है gi.repository.Gio। मैं आने वाले कुछ दिनों में एक लिखने की कोशिश करूंगा।
user.dz

0

नोट: कृपया इस उत्तर पर अंतिम कहने के लिए इस पोस्ट के नीचे की जाँच करें।

मुझे नहीं पता कि मैं वास्तव में किसी भी सहायता के लिए हूं, लेकिन मुझे उम्मीद है कि यह विचार उपयोगी हो सकता है।

मैंने जो खोजा है, उसमें से System और Application Indicators का अंतर अलग है। इसे ध्यान में रखते हुए, मैं अब एक संदिग्ध अवधारणा पेश करता हूं:

सिस्टम इंडिकेटर में एप्लिकेशन इंडिकेटर एपीआई का उपयोग (एक ही उद्देश्य के लिए एक नया, एकीकृत एपीआई बनाने के विरोध में)

निम्नलिखित पोस्टों को देखते हुए मुझे यह विचार आया:

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

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

एकता एपीआई मुख्य रूप से अनुप्रयोग संकेतक के साथ उपयोग के लिए बनाया गया प्रतीत होता है, लेकिन सिस्टम और अनुप्रयोग संकेतक दोनों समान प्रोग्रामिंग (सी लैंग) का उपयोग कर सकते हैं। हालाँकि, आपने पहले उल्लेख किया था कि इन दो प्रकार के संकेतक दो अलग-अलग प्रणालियों द्वारा नियंत्रित किए जाते हैं। इस प्रकार, मैं तब आपके एक स्रोत को पढ़ने के लिए आगे बढ़ा:

मैं लॉगिन स्क्रीन में एप्लिकेशन / सिस्टम संकेतक कैसे जोड़ूं या उसमें हेरफेर करूं?

प्राथमिक उत्तर में पहले से मौजूद उपयोगकर्ता को अधिग्रहीत करना शामिल है जिससे उन्हें आवश्यक पहुंच प्राप्त हो सके। इसने सभी मौजूदा संकेतकों को जोड़ने और हटाने के लिए एक समाधान भी प्रदान किया। यह संकेतक के लिए एक एकीकृत प्रबंधन समाधान है। क्या सिस्टम संकेतक को चलाने / शुरू करने के लिए एक डिफ़ॉल्ट (पहले से मौजूद) उपयोगकर्ता को ओवरराइड करना संभव होगा?

क्या कोई सिस्टम संकेतक यूनिटी एप्लिकेशन संकेतक एपीआई का उपयोग कर सकता है (क्या एपीआई का उपयोग और एकता पैनल द्वारा ठीक से प्रदर्शित किया जा सकता है)? यदि इनका उत्तर हां में है, तो यह स्थिति को शांत करेगा - यदि यह परिणामस्वरूप अन्य मुद्दों का कारण नहीं बनता है। मुझे पता है कि यह तुरंत एक उत्तर की तरह प्रतीत नहीं होगा, इसलिए मैं स्पष्ट करूँगा कि मैंने क्या प्रयास किया है - मैं कार्य को छोटे उद्देश्यों में तोड़ने की कोशिश कर रहा हूं। मुख्य उद्देश्य यह पता लगाना कि क्या एप्लीकेशन इंडिकेटर एपीआई को सिस्टम इंडिकेटर्स (सिस्टम इंडिकेटर्स के लिए एक पूर्व-मौजूदा, एकीकृत एपीआई के रूप में) कोडिंग के लिए इस्तेमाल किया जा सकता है।

आपकी क्वेरी के इस भाग के जवाब में:

"क्या सिस्टम संकेतकों के लिए एकीकृत एपीआई है"

दुर्भाग्य से, हालांकि, सिस्टम संकेतक के लिए एप्लिकेशन संकेतक एपीआई का उपयोग करने का कोई तरीका नहीं है। जैसे, मेरा समाधान शून्य है :(


दुर्भाग्य से नहीं, एप्लिकेशन इंडिकेटर एपीआई का इस्तेमाल सिस्टम इंडिकेटर बनाने के लिए नहीं किया जा सकता है। यह संकेतक-सिस्मोनिटर के लिए एक ही मामला होगा , इसे एकता और एकता- अभिवादन के संशोधित बिल्ड की आवश्यकता है।
user.dz

उस स्थिति में, ऐसा लगता है कि एक नए एपीआई की जरूरत है - एक यह कि सिस्टम संकेतक के लिए। जैसा कि यह खड़ा है, सिस्टम संकेतक में कई, अलग-अलग एपीआई हैं जो उबंटू से हैं। मुझे लगता है कि हम तीसरे पक्ष के पुस्तकालयों का उपयोग करने के विकल्प के साथ बचे हैं, जैसा कि प्रश्न पोस्ट के अंत में कहा गया है।
TopHatProductions115
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.