[gnome-music] player: Add optional inhibition of system suspend
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music] player: Add optional inhibition of system suspend
- Date: Sat, 19 May 2018 18:22:22 +0000 (UTC)
commit d1fe10fb939c17619b569cf990291d06520666cb
Author: Apostol Bakalov <apogza gmail com>
Date: Thu May 17 20:43:01 2018 +0300
player: Add optional inhibition of system suspend
Music does not currently inhibit automatic system suspend
while playing music.
This feature adds a gsetting that allows inhibiting
the system suspend until Music has played all the tracks in
its playlist.
data/org.gnome.Music.gschema.xml | 5 +++
gnomemusic/inhibitsuspend.py | 97 ++++++++++++++++++++++++++++++++++++++++
gnomemusic/player.py | 4 ++
po/POTFILES.in | 1 +
4 files changed, 107 insertions(+)
---
diff --git a/data/org.gnome.Music.gschema.xml b/data/org.gnome.Music.gschema.xml
index aefc4bfd..12e63e29 100644
--- a/data/org.gnome.Music.gschema.xml
+++ b/data/org.gnome.Music.gschema.xml
@@ -38,5 +38,10 @@
<summary>Inital state has been displayed</summary>
<description>Set to true when initial state has been displayed</description>
</key>
+ <key type="b" name="inhibit-suspend">
+ <default>false</default>
+ <summary>Inhibit system suspend</summary>
+ <description>Enables or disables inhibiting system suspend while playing music</description>
+ </key>
</schema>
</schemalist>
diff --git a/gnomemusic/inhibitsuspend.py b/gnomemusic/inhibitsuspend.py
new file mode 100644
index 00000000..0359daed
--- /dev/null
+++ b/gnomemusic/inhibitsuspend.py
@@ -0,0 +1,97 @@
+# Copyright © 2018 The GNOME Music developers
+# GNOME Music is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GNOME Music is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# The GNOME Music authors hereby grant permission for non-GPL compatible
+# GStreamer plugins to be used and distributed together with GStreamer
+# and GNOME Music. This permission is above and beyond the permissions
+# granted by the GPL license by which GNOME Music is covered. If you
+# modify this code, you may extend this exception to your version of the
+# code, but you are not obligated to do so. If you do not wish to do so,
+# delete this exception statement from your version.
+
+import logging
+
+from gettext import gettext as _
+from gi.repository import Gtk, Gio, GObject
+
+from gnomemusic import log
+from gnomemusic.gstplayer import Playback
+
+logger = logging.getLogger(__name__)
+
+
+class InhibitSuspend(GObject.GObject):
+ """InhibitSuspend object
+
+ Contains the logic to postpone automatic system suspend
+ until the application has played all the songs in the playlist.
+ """
+
+ def __repr__(self):
+ return '<InhibitSuspend>'
+
+ @log
+ def __init__(self, root_window, player):
+ super().__init__()
+
+ self._root_window = root_window
+ self._application = root_window.get_application()
+ self._player = player
+ self._inhibit_cookie = 0
+
+ self._player.connect(
+ 'playback-status-changed', self._on_playback_status_changed)
+
+ self._settings = Gio.Settings.new('org.gnome.Music')
+ self._should_inhibit = self._settings.get_boolean('inhibit-suspend')
+ self._settings.connect(
+ 'changed::inhibit-suspend', self._on_inhibit_suspend_changed)
+
+ @log
+ def _inhibit_suspend(self):
+ if (self._inhibit_cookie == 0
+ and self._should_inhibit):
+ self._inhibit_cookie = self._application.inhibit(
+ self._root_window, Gtk.ApplicationInhibitFlags.SUSPEND,
+ _("Playing music"))
+
+ if self._inhibit_cookie == 0:
+ logger.warning("Unable to inhibit automatic system suspend")
+
+ @log
+ def _uninhibit_suspend(self):
+ if self._inhibit_cookie != 0:
+ self._application.uninhibit(self._inhibit_cookie)
+ self._inhibit_cookie = 0
+
+ @log
+ def _on_inhibit_suspend_changed(self, settings, value):
+ self._should_inhibit = value
+ self._on_playback_status_changed(None)
+
+ @log
+ def _on_playback_status_changed(self, arguments):
+ if self._player.get_playback_status() == Playback.PLAYING:
+ self._inhibit_suspend()
+
+ # TODO: The additional check for has_next() is necessary
+ # since after a track is done, the player
+ # goes into STOPPED state before it goes back to PLAYING.
+ # To be simplified when the player's behavior is corrected.
+
+ if (self._player.get_playback_status() == Playback.PAUSED
+ or (self._player.get_playback_status() == Playback.STOPPED
+ and not self._player.has_next())):
+ self._uninhibit_suspend()
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index 976eccdd..f4951390 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -37,6 +37,7 @@ from gi.repository import Gtk, GLib, Gio, GObject, Gst, GstPbutils
from gnomemusic import log
from gnomemusic.gstplayer import GstPlayer, Playback
from gnomemusic.grilo import grilo
+from gnomemusic.inhibitsuspend import InhibitSuspend
from gnomemusic.playlists import Playlists
from gnomemusic.scrobbler import LastFmScrobbler
@@ -122,6 +123,9 @@ class Player(GObject.GObject):
self._player.connect('eos', self._on_eos)
self._player.connect('notify::state', self._on_state_change)
+ root_window = parent_window.get_toplevel()
+ self._inhibit_suspend = InhibitSuspend(root_window, self)
+
self._lastfm = LastFmScrobbler()
@log
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6875e6da..a77faab7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -8,6 +8,7 @@ gnomemusic/albumartcache.py
gnomemusic/application.py
gnomemusic/grilo.py
gnomemusic/gstplayer.py
+gnomemusic/inhibitsuspend.py
gnomemusic/mpris.py
gnomemusic/playlists.py
gnomemusic/query.py
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]