diff frontends/src/primitivus/primitivus @ 2098:e0066920a661

primitivus, jp: dynamic bridge + fixed D-Bus bridge: Primitivus and jp can now load the bridge specified in sat.conf, but they are only working with D-Bus so far (need to change all sync calls to async). Exit code 3 is used for Bridge init error.
author Goffi <goffi@goffi.org>
date Sun, 18 Dec 2016 16:28:51 +0100
parents 4633cfcbcccb
children c42aab22c2c0
line wrap: on
line diff
--- a/frontends/src/primitivus/primitivus	Sun Dec 18 16:28:46 2016 +0100
+++ b/frontends/src/primitivus/primitivus	Sun Dec 18 16:28:51 2016 +0100
@@ -28,7 +28,6 @@
 import urwid
 from urwid.util import is_wide_char
 from urwid_satext import sat_widgets
-from sat_frontends.bridge.dbus_bridge import Bridge
 from sat_frontends.quick_frontend.quick_app import QuickApp
 from sat_frontends.quick_frontend import quick_utils
 from sat_frontends.quick_frontend import quick_chat
@@ -41,9 +40,17 @@
 from sat_frontends.primitivus.keys import action_key_map as a_key
 from sat_frontends.primitivus import config
 from sat_frontends.tools.misc import InputHistory
+from sat.tools.common import dynamic_import
 from sat_frontends.tools import jid
 import signal
 import sys
+## bridge handling
+# we get bridge name from conf and initialise the right class accordingly
+main_config = sat_config.parseMainConf()
+bridge_name = sat_config.getConfig(main_config, '', 'bridge', 'dbus')
+if 'dbus' not in bridge_name:
+    print(u"only D-Bus bridge is currently supported")
+    sys.exit(3)
 
 
 class EditBar(sat_widgets.ModalEdit):
@@ -276,11 +283,18 @@
     AVATAR_HANDLER = False
 
     def __init__(self):
-        QuickApp.__init__(self, create_bridge=Bridge, xmlui=xmlui, check_options=quick_utils.check_options)
-
+        bridge_module = dynamic_import.bridge(bridge_name, 'sat_frontends.bridge')
+        if bridge_module is None:
+            log.error(u"Can't import {} bridge".format(bridge_name))
+            sys.exit(3)
+        else:
+            log.debug(u"Loading {} bridge".format(bridge_name))
+        QuickApp.__init__(self, bridge_factory=bridge_module.Bridge, xmlui=xmlui, check_options=quick_utils.check_options, connect_bridge=False)
         ## main loop setup ##
-        self.main_widget = ProfileManager(self)
-        self.loop = urwid.MainLoop(self.main_widget, C.PALETTE, event_loop=urwid.GLibEventLoop(), input_filter=self.inputFilter, unhandled_input=self.keyHandler)
+        event_loop = urwid.GLibEventLoop if 'dbus' in bridge_name else urwid.TwistedEventLoop
+        self.loop = urwid.MainLoop(urwid.SolidFill(), C.PALETTE, event_loop=event_loop(), input_filter=self.inputFilter, unhandled_input=self.keyHandler)
+
+    def onBridgeConnected(self):
 
         ##misc setup##
         self._visible_widgets = set()
@@ -302,6 +316,9 @@
             sys.stdout.write("\033[?2004h")
             self._bracketed_mode_set = True
 
+        self.loop.widget = self.main_widget = ProfileManager(self)
+        self.postInit()
+
     @property
     def visible_widgets(self):
         return self._visible_widgets
@@ -343,8 +360,7 @@
             pass
 
     def start(self):
-        self.i = 0
-        self.loop.set_alarm_in(0,lambda a,b: self.postInit())
+        self.connectBridge()
         self.loop.run()
 
     def postInit(self):
@@ -813,5 +829,5 @@
         else:
             log.warning(u"No ContactList widget found for profile {}".format(profile))
 
-sat = PrimitivusApp()
-sat.start()
+primitivus = PrimitivusApp()
+primitivus.start()