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