diff options
| author | Blista Kanjo | 2024-06-27 08:10:40 -0400 |
|---|---|---|
| committer | Blista Kanjo | 2024-06-27 08:10:40 -0400 |
| commit | 6ad7473aa20327caa699563c7cd9a7b2bce5a281 (patch) | |
| tree | 274edddcda8763317ce3456c290f29bbfa21d03e /.local/share | |
| parent | f242626450a5c1446c5aa438d5952d973b7e7f31 (diff) | |
feat: `playerctl_systray` improvements
Diffstat (limited to '.local/share')
| -rw-r--r-- | .local/share/python-playerctl_systray/playerctl_systray.py | 121 |
1 files changed, 73 insertions, 48 deletions
diff --git a/.local/share/python-playerctl_systray/playerctl_systray.py b/.local/share/python-playerctl_systray/playerctl_systray.py index 6e403e4..2b409f4 100644 --- a/.local/share/python-playerctl_systray/playerctl_systray.py +++ b/.local/share/python-playerctl_systray/playerctl_systray.py @@ -4,7 +4,8 @@ import os gi.require_version('Gtk', '3.0') gi.require_version('AppIndicator3', '0.1') -from gi.repository import Gtk, AppIndicator3 +gi.require_version('GLib', '2.0') +from gi.repository import Gtk, AppIndicator3, GLib class playerctl_systray: def __init__(self): @@ -19,85 +20,109 @@ class playerctl_systray: def create_menu(self): menu = Gtk.Menu() - play_item = Gtk.MenuItem(label="play-pause") - play_item.connect("activate", self.play_pause) - menu.append(play_item) + instances = self.get_player_instances() + if instances: + for instance in instances: + instance_submenu = Gtk.Menu() - next_item = Gtk.MenuItem(label="next") - next_item.connect("activate", self.next_track) - menu.append(next_item) + play_item = Gtk.MenuItem(label="play-pause") + play_item.connect("activate", self.play_pause, instance) + instance_submenu.append(play_item) - prev_item = Gtk.MenuItem(label="previous") - prev_item.connect("activate", self.prev_track) - menu.append(prev_item) + next_item = Gtk.MenuItem(label="next") + next_item.connect("activate", self.next_track, instance) + instance_submenu.append(next_item) - stop_item = Gtk.MenuItem(label="stop") - stop_item.connect("activate", self.stop_track) - menu.append(stop_item) + prev_item = Gtk.MenuItem(label="previous") + prev_item.connect("activate", self.prev_track, instance) + instance_submenu.append(prev_item) - quit_item = Gtk.MenuItem(label="quit") - quit_item.connect("activate", self.quit) - menu.append(quit_item) + instance_menu_item = Gtk.MenuItem(label=instance) + instance_menu_item.set_submenu(instance_submenu) + menu.append(instance_menu_item) - menu.append(Gtk.SeparatorMenuItem()) # separator before -a submenu + a_submenu = Gtk.Menu() - a_submenu = Gtk.Menu() + a_pause_item = Gtk.MenuItem(label="pause") + a_pause_item.connect("activate", self.a_pause) + a_submenu.append(a_pause_item) - a_play_item = Gtk.MenuItem(label="play-pause") - a_play_item.connect("activate", self.a_play_pause) - a_submenu.append(a_play_item) + a_play_item = Gtk.MenuItem(label="play") + a_play_item.connect("activate", self.a_play) + a_submenu.append(a_play_item) - a_next_item = Gtk.MenuItem(label="next") - a_next_item.connect("activate", self.a_next_track) - a_submenu.append(a_next_item) + a_next_item = Gtk.MenuItem(label="next") + a_next_item.connect("activate", self.a_next_track) + a_submenu.append(a_next_item) - a_prev_item = Gtk.MenuItem(label="previous") - a_prev_item.connect("activate", self.a_prev_track) - a_submenu.append(a_prev_item) + a_prev_item = Gtk.MenuItem(label="previous") + a_prev_item.connect("activate", self.a_prev_track) + a_submenu.append(a_prev_item) - a_stop_item = Gtk.MenuItem(label="stop") - a_stop_item.connect("activate", self.a_stop) - a_submenu.append(a_stop_item) + a_menu_item = Gtk.MenuItem(label="-a") + a_menu_item.set_submenu(a_submenu) + menu.append(a_menu_item) + else: + no_players_item = Gtk.MenuItem(label="no players found") + no_players_item.set_sensitive(False) # Greyed out + menu.append(no_players_item) - a_menu_item = Gtk.MenuItem(label="-a") - a_menu_item.set_submenu(a_submenu) - menu.append(a_menu_item) + menu.append(Gtk.SeparatorMenuItem()) # separator + + quit_item = Gtk.MenuItem(label="quit") + quit_item.connect("activate", self.quit) + menu.append(quit_item) menu.show_all() return menu - def play_pause(self, source): - self.run_command("playerctl play-pause") + def get_player_instances(self): + result = subprocess.run("playerctl -l", shell=True, capture_output=True, text=True) + return result.stdout.strip().split('\n') if result.stdout.strip() else [] - def next_track(self, source): - self.run_command("playerctl next") + def play_pause(self, _, instance): + self.run_command(f"playerctl -p {instance} play-pause") - def prev_track(self, source): - self.run_command("playerctl previous") + def next_track(self, _, instance): + self.run_command(f"playerctl -p {instance} next") + + def prev_track(self, _, instance): + self.run_command(f"playerctl -p {instance} previous") - def stop_track(self, source): - self.run_command("playerctl stop") + def a_play(self, _): + self.run_command("playerctl -a play") - def a_play_pause(self, source): - self.run_command("playerctl -a play-pause") + def a_pause(self, _): + self.run_command("playerctl -a pause") - def a_next_track(self, source): + def a_next_track(self, _): self.run_command("playerctl -a next") - def a_prev_track(self, source): + def a_prev_track(self, _): self.run_command("playerctl -a previous") - def a_stop(self, source): - self.run_command("playerctl -a stop") + def default_play_pause(self, _): + self.run_command("playerctl play-pause") + + def default_next_track(self, _): + self.run_command("playerctl next") + + def default_prev_track(self, _): + self.run_command("playerctl previous") def run_command(self, command): subprocess.run(command, shell=True) - def quit(self, source): + def quit(self, _): Gtk.main_quit() + def refresh_menu(self): + self.indicator.set_menu(self.create_menu()) + return True # returns True so that timeout continues + def main(): app = playerctl_systray() + GLib.timeout_add(1024, app.refresh_menu) # refresh menu every 1024 millis Gtk.main() if __name__ == "__main__": |
