@@ -14,7 +14,6 @@ extern "C" {
14
14
15
15
#include < glib.h>
16
16
#include < spdlog/spdlog.h>
17
-
18
17
namespace waybar ::modules::mpris {
19
18
20
19
const std::string DEFAULT_FORMAT = " {player} ({status}): {dynamic}" ;
@@ -589,38 +588,45 @@ auto Mpris::getPlayerInfo() -> std::optional<PlayerInfo> {
589
588
}
590
589
591
590
bool Mpris::handleToggle (GdkEventButton* const & e) {
591
+ if (!e || e->type != GdkEventType::GDK_BUTTON_PRESS) {
592
+ return false ;
593
+ }
594
+
595
+ auto info = getPlayerInfo ();
596
+ if (!info) return false ;
597
+
598
+ struct ButtonAction {
599
+ guint button;
600
+ const char * config_key;
601
+ std::function<void ()> builtin_action;
602
+ };
603
+
592
604
GError* error = nullptr ;
593
- waybar::util::ScopeGuard error_deleter ([error]() {
605
+ waybar::util::ScopeGuard error_deleter ([& error]() {
594
606
if (error) {
595
607
g_error_free (error);
596
608
}
597
609
});
598
610
599
- auto info = getPlayerInfo ();
600
- if (!info) return false ;
611
+ // Command pattern: encapsulate each button's action
612
+ const ButtonAction actions[] = {
613
+ {1 , " on-click" , [&]() { playerctl_player_play_pause (player, &error); }},
614
+ {2 , " on-click-middle" , [&]() { playerctl_player_previous (player, &error); }},
615
+ {3 , " on-click-right" , [&]() { playerctl_player_next (player, &error); }},
616
+ {8 , " on-click-backward" , [&]() { playerctl_player_previous (player, &error); }},
617
+ {9 , " on-click-forward" , [&]() { playerctl_player_next (player, &error); }},
618
+ };
601
619
602
- if (e->type == GdkEventType::GDK_BUTTON_PRESS) {
603
- switch (e->button ) {
604
- case 1 : // left-click
605
- if (config_[" on-click" ].isString ()) {
606
- return ALabel::handleToggle (e);
607
- }
608
- playerctl_player_play_pause (player, &error);
609
- break ;
610
- case 2 : // middle-click
611
- if (config_[" on-click-middle" ].isString ()) {
612
- return ALabel::handleToggle (e);
613
- }
614
- playerctl_player_previous (player, &error);
615
- break ;
616
- case 3 : // right-click
617
- if (config_[" on-click-right" ].isString ()) {
618
- return ALabel::handleToggle (e);
619
- }
620
- playerctl_player_next (player, &error);
621
- break ;
620
+ for (const auto & action : actions) {
621
+ if (e->button == action.button ) {
622
+ if (config_[action.config_key ].isString ()) {
623
+ return ALabel::handleToggle (e);
624
+ }
625
+ action.builtin_action ();
626
+ break ;
622
627
}
623
628
}
629
+
624
630
if (error) {
625
631
spdlog::error (" mpris[{}]: error running builtin on-click action: {}" , (*info).name ,
626
632
error->message );
0 commit comments