Compare commits

..

No commits in common. "56b7476a425348b43bad4337162dbe3964b3926a" and "f55c4fc4a587576c54b2e380fff3e66177a5e895" have entirely different histories.

2 changed files with 74 additions and 98 deletions

View file

@ -6,14 +6,10 @@ ignore =
E114 E114
# Indent for continuation lines is smaller than expected # Indent for continuation lines is smaller than expected
E121 E121
# Hanging indent on a continuation line is unaligned
E131
# Import not at the top of the file # Import not at the top of the file
E402 E402
# Line too long # Line too long
E501 E501
# `except` without an exception type
E722
# Newline before a binary operator # Newline before a binary operator
W503 W503
# Newline after a binary operator # Newline after a binary operator

View file

@ -8,7 +8,6 @@
import math import math
import gi import gi
import sys
gi.require_version("Playerctl", "2.0") gi.require_version("Playerctl", "2.0")
@ -168,114 +167,95 @@ def iter_actions_for_player(player):
) )
is_already_activated = False root_menu = Gtk.Menu()
player_names = Playerctl.list_players()
def on_activate(application): if len(player_names) > 0:
global is_already_activated players = []
if is_already_activated: for player_name in player_names:
# Ignore activations triggered by remote instances. See this: player = Playerctl.Player.new_from_name(player_name)
# <https://stackoverflow.com/a/42044391/12005228> players.append({
return "player":
is_already_activated = True player,
"player_name":
player_name,
"sorting_key": (
player.props.playback_status != Playerctl.PlaybackStatus.PLAYING,
-PLAYER_NAME_PRIORITIES.get(player_name.name, 0),
player_name.instance,
),
})
players = sorted(players, key=lambda player_and_meta: player_and_meta["sorting_key"])
root_menu = Gtk.Menu() for player_and_meta in players:
player_name = player_and_meta["player_name"]
player = player_and_meta["player"]
player_names = Playerctl.list_players() player_menu_item = Gtk.ImageMenuItem.new_with_label(
"{} [{}]".format(
if len(player_names) > 0: player_name.instance,
players = [] PLAYER_PLAYBACK_STATUS_EMOJIS[player.props.playback_status],
for player_name in player_names:
player = Playerctl.Player.new_from_name(player_name)
players.append({
"player":
player,
"player_name":
player_name,
"sorting_key": (
player.props.playback_status != Playerctl.PlaybackStatus.PLAYING,
-PLAYER_NAME_PRIORITIES.get(player_name.name, 0),
player_name.instance,
),
})
players = sorted(players, key=lambda player_and_meta: player_and_meta["sorting_key"])
for player_and_meta in players:
player_name = player_and_meta["player_name"]
player = player_and_meta["player"]
player_menu_item = Gtk.ImageMenuItem.new_with_label(
"{} [{}]".format(
player_name.instance,
PLAYER_PLAYBACK_STATUS_EMOJIS[player.props.playback_status],
)
) )
)
player_icon_name = PLAYER_ICON_NAME_FIXES.get(player_name.name, player_name.name) player_icon_name = PLAYER_ICON_NAME_FIXES.get(player_name.name, player_name.name)
player_icon = Gtk.Image.new_from_icon_name(player_icon_name, Gtk.IconSize.MENU) player_icon = Gtk.Image.new_from_icon_name(player_icon_name, Gtk.IconSize.MENU)
player_menu_item.set_image(player_icon) player_menu_item.set_image(player_icon)
actions_menu = Gtk.Menu() actions_menu = Gtk.Menu()
any_metadata_was_added = False track_metadata = player.props.metadata
for meta_entry_text in iter_metadata_entries_for_player(player): any_metadata_was_added = False
meta_menu_item = Gtk.MenuItem.new_with_label(meta_entry_text) for meta_entry_text in iter_metadata_entries_for_player(player):
meta_menu_item.set_sensitive(False) meta_menu_item = Gtk.MenuItem.new_with_label(meta_entry_text)
meta_menu_item_label = meta_menu_item.get_child() meta_menu_item.set_sensitive(False)
meta_menu_item_label.set_ellipsize(Pango.EllipsizeMode.END) meta_menu_item_label = meta_menu_item.get_child()
meta_menu_item_label.set_max_width_chars(20) meta_menu_item_label.set_ellipsize(Pango.EllipsizeMode.END)
meta_menu_item_label.set_max_width_chars(20)
actions_menu.append(meta_menu_item) actions_menu.append(meta_menu_item)
any_metadata_was_added = True any_metadata_was_added = True
if any_metadata_was_added: if any_metadata_was_added:
actions_menu.append(Gtk.SeparatorMenuItem.new()) actions_menu.append(Gtk.SeparatorMenuItem.new())
for ( for (
action_name, action_name,
action_icon_name, action_icon_name,
action_enabled, action_enabled,
action_fn, action_fn,
*action_fn_args, *action_fn_args,
) in iter_actions_for_player(player): ) in iter_actions_for_player(player):
action_menu_item = Gtk.ImageMenuItem.new_with_mnemonic(action_name) action_menu_item = Gtk.ImageMenuItem.new_with_mnemonic(action_name)
if action_icon_name is not None: if action_icon_name is not None:
action_icon = Gtk.Image.new_from_icon_name(action_icon_name, Gtk.IconSize.MENU) action_icon = Gtk.Image.new_from_icon_name(action_icon_name, Gtk.IconSize.MENU)
action_menu_item.set_image(action_icon) action_menu_item.set_image(action_icon)
action_menu_item.set_sensitive(action_enabled) action_menu_item.set_sensitive(action_enabled)
if action_fn is not None: if action_fn is not None:
action_menu_item.connect( action_menu_item.connect(
"activate", "activate",
lambda _target, action_fn, action_fn_args: action_fn(*action_fn_args), lambda _menu_item, action_fn, action_fn_args: action_fn(*action_fn_args),
action_fn, action_fn,
action_fn_args, action_fn_args,
) )
actions_menu.append(action_menu_item) actions_menu.append(action_menu_item)
player_menu_item.set_submenu(actions_menu) player_menu_item.set_submenu(actions_menu)
root_menu.append(player_menu_item) root_menu.append(player_menu_item)
else: else:
menu_item = Gtk.MenuItem.new_with_label("No players were detected!") menu_item = Gtk.MenuItem.new_with_label("No players were detected!")
menu_item.set_sensitive(False) menu_item.set_sensitive(False)
root_menu.append(menu_item) root_menu.append(menu_item)
root_menu.connect("selection-done", lambda _target: application.quit()) root_menu.connect("selection-done", Gtk.main_quit)
root_menu.connect("deactivate", lambda _target: application.quit()) root_menu.connect("deactivate", Gtk.main_quit)
root_menu.connect("destroy", lambda _target: application.quit()) root_menu.connect("destroy", Gtk.main_quit)
root_menu.show_all() root_menu.show_all()
root_menu.popup(None, None, None, None, 0, Gdk.CURRENT_TIME) root_menu.popup(None, None, None, None, 0, Gdk.CURRENT_TIME)
Gdk.notify_startup_complete() Gtk.main()
# `hold` needs to be done last, so that if an exception occurs during the
# initialization the application doesn't hang.
application.hold()
application = Gtk.Application(application_id="com.github.dmitmel.dotfiles.playerctl-simple-menu")
application.connect("activate", on_activate)
sys.exit(application.run(sys.argv))