From 727d4e349409d5b45903faa169662cdeff381903 Mon Sep 17 00:00:00 2001
From: Jakub Filak <jfilak@redhat.com>
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 <jfilak@redhat.com>
---
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 @@
</interface>
"""
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