From 727d4e349409d5b45903faa169662cdeff381903 Mon Sep 17 00:00:00 2001 From: Jakub Filak Date: Mon, 24 Aug 2015 15:00:36 +0200 Subject: [PATCH] Delay initialization of GNOME Screencast D-Bus proxy Related: rhbz#1197607, rhbz#1197997, rhbz#1199242 Signed-off-by: Jakub Filak --- src/pyfros/plugins/screencastgnome.py | 50 ++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/src/pyfros/plugins/screencastgnome.py b/src/pyfros/plugins/screencastgnome.py index d752c31..84a5443 100644 --- a/src/pyfros/plugins/screencastgnome.py +++ b/src/pyfros/plugins/screencastgnome.py @@ -102,6 +102,7 @@ """ from pyfros.screencastbase import ScreencastBase, ScreencastResult +from pyfros.froslogging import info, error import pyfros.plugins.const as const import dbus import os @@ -120,35 +121,48 @@ class ScreencastGnome(ScreencastBase): def __init__(self, *args, **kwargs): super(ScreencastGnome, self).__init__(*args, **kwargs) - bus = dbus.SessionBus() - self._proxy = dbus.Interface( - bus.get_object( - BUS_NAME, BUS_PATH, - follow_name_owner_changes=False - ), - BUS_IFACE - ) - + self._proxy = None self.output = os.path.join(os.getcwd(), "screencast-%d-%t.webm") + def _backend(self): + if self._proxy is None: + bus = dbus.SessionBus() + obj = bus.get_object(BUS_NAME, BUS_PATH, follow_name_owner_changes=False) + self._proxy = dbus.Interface(obj, BUS_IFACE) + + return self._proxy + def Screencast(self): - succ, filename = self._proxy.ScreencastArea(self.x, - self.y, - self.width, - self.height, - self.output, - {"framerate": 5} - ) - return ScreencastResult(succ, filename) + try: + succ, filename = self._backend().ScreencastArea(self.x, + self.y, + self.width, + self.height, + self.output, + {"framerate": 5} + ) + return ScreencastResult(succ, filename) + except dbus.exceptions.DBusException as ex: + error("Failed to start GNOME screencasting: %s" % (str(ex))) + return ScreencastResult(False, None) def ScreencastArea(self): raise NotImplementedError def StopScreencast(self, end_handler): - self._proxy.StopScreencast() + try: + self._backend().StopScreencast() + except dbus.exceptions.DBusException as ex: + error("Failed to stop GNOME screencasting: %s" % (str(ex))) end_handler() def IsSuitable(self): + try: + self._backend() + except dbus.exceptions.DBusException as ex: + info("D-Bus GNOME Screencaster is not available: %s" % (str(ex))) + return const.SUITABLE_NOT_SUITABLE + if os.environ.get('XDG_CURRENT_DESKTOP') in \ ['GNOME', 'GNOME-Classic:GNOME', 'GNOME-Classic']: return const.SUITABLE_PREFERED -- 2.5.0