From 1415c7ae1bef2d60a2c322fe671625cdc4efc44d Mon Sep 17 00:00:00 2001 From: Skythrew Date: Sun, 21 Jul 2024 19:00:35 +0200 Subject: [PATCH 1/4] feat: be able to run the app in background This commit allows the app to play music in background if it is closed while a song is in the queue. This matches the behaviour of most music players (eg. Amberol). --- source/monophony/frontend/app.py | 23 +++++++++++-------- .../monophony/frontend/windows/main_window.py | 13 ++++++++--- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/source/monophony/frontend/app.py b/source/monophony/frontend/app.py index 7dbf239..975afa7 100644 --- a/source/monophony/frontend/app.py +++ b/source/monophony/frontend/app.py @@ -15,12 +15,17 @@ class MonophonyApplication(Adw.Application): ) def do_activate(self): - self.window = MonophonyMainWindow( - application = self - ) - self.inhibit( - self.window, - Gtk.ApplicationInhibitFlags.SUSPEND | Gtk.ApplicationInhibitFlags.IDLE, - None - ) - self.window.present() + windows = self.get_windows() + + if len(windows) > 0: + windows[0].set_visible(True) + else: + self.window = MonophonyMainWindow( + application = self + ) + self.inhibit( + self.window, + Gtk.ApplicationInhibitFlags.SUSPEND | Gtk.ApplicationInhibitFlags.IDLE, + None + ) + self.window.present() diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 2e1a1c3..b2d6a7d 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -73,7 +73,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.set_content(self.toolbar_view) self.install_action( - 'quit-app', None, (lambda w, *_: w.close()) + 'quit-app', None, (lambda w, *_: w._on_quit()) ) self.install_action( 'focus-library', @@ -101,7 +101,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): 'focus-search', ['f', '2'] ) self.get_application().set_accels_for_action('focus-queue', ['3']) - self.connect('close-request', MonophonyMainWindow._on_quit) + self.connect('close-request', MonophonyMainWindow.run_background) def append_page(self, widget: Gtk.Widget): while child := self.stack.get_adjacent_child(Adw.NavigationDirection.FORWARD): @@ -110,13 +110,20 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.stack.append(widget) self.stack.navigate(Adw.NavigationDirection.FORWARD) + def run_background(self): + if len(self.player.get_current_song()) > 0: + self.set_visible(False) + return True + else: + self._on_quit() + def _on_quit(self): self.player.terminate() size = self.get_default_size() monophony.backend.settings.set_value('window-width', size.width) monophony.backend.settings.set_value('window-height', size.height) self.get_application().quit() - + def _on_search(self): self.stack.set_visible_child_name('search') self.stack.get_visible_child().ent_search.grab_focus() -- GitLab From 7a41808513268e97a53d91a4e5cc77620923597f Mon Sep 17 00:00:00 2001 From: Skythrew Date: Sun, 21 Jul 2024 20:08:40 +0200 Subject: [PATCH 2/4] fix: whitespaces on empty lines --- source/monophony/frontend/windows/main_window.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index b2d6a7d..5156f79 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -116,14 +116,14 @@ class MonophonyMainWindow(Adw.ApplicationWindow): return True else: self._on_quit() - + def _on_quit(self): self.player.terminate() size = self.get_default_size() monophony.backend.settings.set_value('window-width', size.width) monophony.backend.settings.set_value('window-height', size.height) self.get_application().quit() - + def _on_search(self): self.stack.set_visible_child_name('search') self.stack.get_visible_child().ent_search.grab_focus() -- GitLab From ef6a4a834ee04284cf7842a3b36e85681a9f2cfa Mon Sep 17 00:00:00 2001 From: Skythrew Date: Sat, 27 Jul 2024 18:15:58 +0000 Subject: [PATCH 3/4] Simplify `run_background` method --- source/monophony/frontend/windows/main_window.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 5156f79..8a4350e 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -110,12 +110,13 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.stack.append(widget) self.stack.navigate(Adw.NavigationDirection.FORWARD) - def run_background(self): - if len(self.player.get_current_song()) > 0: + def run_background(self) -> bool: + if self.player.get_current_song(): self.set_visible(False) return True - else: - self._on_quit() + + self._on_quit() + return False def _on_quit(self): self.player.terminate() -- GitLab From 9db98504b2d2e91b61e58ad257035b6e30946249 Mon Sep 17 00:00:00 2001 From: Skythrew Date: Sun, 28 Jul 2024 10:38:19 +0200 Subject: [PATCH 4/4] feat: close the whole app once the queue ends --- source/monophony/backend/player.py | 2 ++ source/monophony/frontend/windows/main_window.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/source/monophony/backend/player.py b/source/monophony/backend/player.py index 58408dc..c3c6824 100644 --- a/source/monophony/backend/player.py +++ b/source/monophony/backend/player.py @@ -40,6 +40,7 @@ class Player: self.mpris_server = None self.ui_update_callback = None self.queue_change_callback = None + self.queue_end_callback = None self.playbin = Gst.ElementFactory.make('playbin3', 'playbin3') self.playbin.set_state(Gst.State.READY) self.playbin.get_bus().add_signal_watch() @@ -347,6 +348,7 @@ class Player: self.mpris_server.unpublish() GLib.idle_add(self.queue_change_callback) GLib.idle_add(self.ui_update_callback, None, False, False, False) + GLib.idle_add(self.queue_end_callback) if lock: self.lock.unlock() diff --git a/source/monophony/frontend/windows/main_window.py b/source/monophony/frontend/windows/main_window.py index 8a4350e..ec8966c 100644 --- a/source/monophony/frontend/windows/main_window.py +++ b/source/monophony/frontend/windows/main_window.py @@ -27,6 +27,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): self.set_title('Monophony') self.set_icon_name(APP_ID) self.player = monophony.backend.player.Player() + self.player.queue_end_callback = self._on_queue_end self.removed_playlists = [] GLib.Thread.new(None, monophony.backend.mpris.init, self.player) @@ -225,3 +226,7 @@ class MonophonyMainWindow(Adw.ApplicationWindow): def _on_save_playlist(self, name: str, contents: list): monophony.backend.playlists.add_playlist(name, contents) self.toaster.add_toast(Adw.Toast.new(_('Added'))) + + def _on_queue_end(self): + if not self.is_visible(): + self._on_quit() \ No newline at end of file -- GitLab