/usr/share/pyshared/elisa/plugins/gnome/gnome_screensaver_service.py is in moovida-plugins-good 1.0.9+bzr1614-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | # -*- coding: utf-8 -*-
# Moovida - Home multimedia server
# Copyright (C) 2006-2009 Fluendo Embedded S.L. (www.fluendo.com).
# All rights reserved.
#
# This file is available under one of two license agreements.
#
# This file is licensed under the GPL version 3.
# See "LICENSE.GPL" in the root of this distribution including a special
# exception to use Moovida with Fluendo's plugins.
#
# The GPL part of Moovida is also available under a commercial licensing
# agreement from Fluendo.
# See "LICENSE.Moovida" in the root directory of this distribution package
# for details on that license.
#
# Author: Gernot Klimscha <gernot@fluendo.com>
"""
Gnome Screen Saver ServiceProvider component class
This Component can block the GnomeScreenSaver in different modes. That
is very useful, if you have a remote control or other input device
which is not reconized by the Screensaver on its own.
This Component blocks with this usage also the PowerManager of GNOME,
so that the sleep/Screen procedures shouldn't happen.
"""
from elisa.core.components.service_provider import ServiceProvider
from elisa.core import common
try:
from elisa.plugins.pigment.message import PigmentFrontendLoadedMessage
except ImportError:
PigmentFrontendLoadedMessage = None
import dbus
from dbus.exceptions import DBusException
from twisted.internet import defer
class GnomeScreensaverService(ServiceProvider):
"""
This class connect to the Gnome Screen Saver and blocks it
"""
config_doc = {'blocking_mode' : 'Block the Screensaver. Available modes'
' are: \n * 1 : block on playing only\n'
' * 2 : block from the start to the end,'
' use this, if you are only using remotes,'
' on which the screensaver is not'
' reacting'
' * else: do not block!\n'}
default_config = {'blocking_mode' : 1}
def initialize(self):
dfr = super(GnomeScreensaverService, self).initialize()
def initialized(r):
self.pm_iface = None
self._pm_cookie = None
dfr = defer.succeed(self)
try:
self.ses = dbus.SessionBus()
except DBusException, error:
msg = "DBus is not running."
fail_msg = '%s - %s' % (self.name, msg)
return defer.fail(Exception(fail_msg))
try:
# Even if there is also a org.gnome.PowerManager, the
# ScreenSaver is for our use the better one
self.pm = self.ses.get_object('org.gnome.ScreenSaver',
'/org/gnome/Screensaver')
self.pm_iface = dbus.Interface(self.pm, "org.gnome.ScreenSaver")
except Exception, e:
msg = "Could not connect to the Gnome ScreenSaver: %s" % e
fail_msg = '%s - %s' % (self.name, msg)
return defer.fail(Exception(fail_msg))
blocking_mode = self.config.get('blocking_mode', 1)
if blocking_mode == 1:
self.info("Using the stop-on-playing-only mode")
if PigmentFrontendLoadedMessage is None:
self.warning("You don't seem to run the pigment frontend." \
" Can't connect to the player.")
return
bus = common.application.bus
bus.register(self._frontend_loaded, PigmentFrontendLoadedMessage)
elif blocking_mode == 2:
self.info("Using full-block mode")
dfr = self._inhibit('running')
dfr.addCallback(lambda x: self)
return dfr
dfr.addCallback(initialized)
return dfr
def clean(self):
dfr = super(GnomeScreensaverService, self).clean()
def cleaned(r):
common.application.bus.unregister(self._components_loaded)
if self._pm_cookie:
d = self._un_inhibit()
return d
dfr.addCallback(cleaned)
return dfr
def _un_inhibit(self):
self.debug("Asking for UnInhibition of PowerManager")
dfr = defer.Deferred()
cookie, self._pm_cookie = self._pm_cookie, None
self.pm_iface.UnInhibit(cookie,
reply_handler=lambda : dfr.callback(None),
error_handler=lambda x: dfr.errback(x))
return dfr
def _inhibit(self, reason):
dfr = defer.Deferred()
self.debug("Asking for Inhibition of PowerManager")
self.pm_iface.Inhibit('elisa', reason,
reply_handler=lambda x: dfr.callback(x),
error_handler=lambda x: dfr.errback(x))
def got_reply(result):
self._pm_cookie = result
dfr.addCallback(got_reply)
return dfr
def _frontend_loaded(self, msg, sender):
poblesec = msg.controller
poblesec.video_player.player.connect('status-changed',
self._player_status_cb)
poblesec.music_player.player.connect('status-changed',
self._player_status_cb)
poblesec.slideshow_player.player.connect('status-changed',
self._player_status_cb)
# we don't get any status-change in case we have 'playback-ended
poblesec.music_player.player.connect('playback-ended',
self._playback_ended)
poblesec.video_player.player.connect('playback-ended',
self._playback_ended)
self.debug("connected to players")
def _playback_ended(self, player):
# just unInhibit
self._un_inhibit()
def _player_status_cb(self, player, status):
self.debug("%s changed state to %s" % (player, status))
if status == player.PLAYING and not self._pm_cookie:
self._inhibit('playing media')
elif self._pm_cookie:
self._un_inhibit()
|