Le contexte :
-
Ce n'est PAS pour indicateurs d'application pero indicateurs du système .
Photo de : https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators
-
L'objectif est de montrer indicateur-sysmoniteur dans les écrans Greeter/Lock/Ubiquity. Il existe une solution de contournement :
Comment faire de l'indicateur-sysmonitor l'indicateur par défaut de l'écran de connexion ?
C Code original : (fonctionne bien)
-
J'ai déjà réussi à en faire fonctionner un en langage C, voir mon autre question :
Comment développer un indicateur de système pour Unity ?
Cependant,
indicator-sysmonitor
est déjà développé en Python comme de nombreux autres indicateurs d'application. Je n'aime pas l'idée que les développeurs soient obligés de porter leurs projets en C ou d'écrire un proxy Python-C s'ils veulent afficher l'indicateur dans les écrans de greeter/lock/ubiquity. Au lieu de cela, faire en sorte que indicator-sysmonitor crée un indicateur système directement depuis Python serait la meilleure solution (pas de contournement, et ce sera une solution générique pour tous les projets Python qui utilisent actuellement appindicator).
Code Python : (Mon essai raté de porter du code c vers Python)
-
J'ai du mal à le porter en Python. Voici mon code actuel qui ne fonctionne pas. Il crée un objet DBus pour le menu et les actions. Il est listé dans le plugin des indicateurs XFCE. Mais il n'apparaît pas sur le panneau.
/usr/lib/indicator-test/indicator-test-service
#!/usr/bin/python2 import os import sys import gi from gi.repository import Gio, GLib APPLICATION_ID = 'local.sneetsher.indicator.test' DBUS_MENU_PATH = '/local/sneetsher/indicator/test/desktop' DBUS_ACTION_PATH = '/local/sneetsher/indicator/test' def callback(): print ok def quit_callback(notification, loop): global connection global exported_action_group_id global exported_menu_model_id connection.unexport_action_group (exported_action_group_id) connection.unexport_menu_model (exported_menu_model_id) loop.quit() def cancel (notification, action, data): if action == "cancel": print "Cancel" else: print "That should not have happened (cancel)!" def bus_acquired(bus, name): # menu submenu = Gio.Menu() submenu.append("Show", "show") item = Gio.MenuItem.new(None, "_header") item.set_attribute([("x-canonical-type","s","com.canonical.indicator.root")]) item.set_submenu(submenu) menu = Gio.Menu() menu.append_item (item) actions = Gio.SimpleActionGroup.new() action1 = Gio.SimpleAction.new("_header", None) actions.insert(action1) action2 = Gio.SimpleAction.new('show', None) actions.insert(action2) action2.connect("activate",callback) global connection connection = bus global exported_action_group_id exported_action_group_id = connection.export_action_group(DBUS_ACTION_PATH, actions) global exported_menu_model_id exported_menu_model_id = connection.export_menu_model(DBUS_MENU_PATH, menu) def setup (): #bus connection Gio.bus_own_name(Gio.BusType.SESSION, APPLICATION_ID, 0, bus_acquired, None, None) if __name__ == '__main__': connection = None exported_menu_model_id = 0 exported_action_group_id = 0 password = "" loop = GLib.MainLoop() setup () loop.run()
local.sneetsher.indicator.test
[Indicator Service] Name=indicator-test ObjectPath=/local/sneetsher/indicator/test [desktop] ObjectPath=/local/sneetsher/indicator/test/desktop [desktop_greeter] ObjectPath=/local/sneetsher/indicator/test/desktop [desktop_lockscreen] ObjectPath=/local/sneetsher/indicator/test/desktop
local.sneetsher.indicator.test.service
[D-BUS Service] Name=local.sneetsher.indicator.test Exec=/usr/lib/indicator-test/indicator-test-service
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', 'local.sneetsher.indicator.test', 'application']
Question :
Je suppose que la raison en est que je n'ai pas créé la structure du menu ou ses méta éléments (pseudo éléments comme _header
) comme ils le sont dans le code C original.
Quelqu'un pourrait-il faire un portage fonctionnel de ce code indicateur de système en C à Python ?