Skip to content

Commit 780e96b

Browse files
authored
Merge pull request #4131 from belcaik/master
Add support for mouse side buttons (back/forward) to control track navigation in mpris module
2 parents a563a3f + 7613069 commit 780e96b

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

src/modules/mpris/mpris.cpp

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ extern "C" {
1414

1515
#include <glib.h>
1616
#include <spdlog/spdlog.h>
17-
1817
namespace waybar::modules::mpris {
1918

2019
const std::string DEFAULT_FORMAT = "{player} ({status}): {dynamic}";
@@ -589,38 +588,45 @@ auto Mpris::getPlayerInfo() -> std::optional<PlayerInfo> {
589588
}
590589

591590
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+
592604
GError* error = nullptr;
593-
waybar::util::ScopeGuard error_deleter([error]() {
605+
waybar::util::ScopeGuard error_deleter([&error]() {
594606
if (error) {
595607
g_error_free(error);
596608
}
597609
});
598610

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+
};
601619

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;
622627
}
623628
}
629+
624630
if (error) {
625631
spdlog::error("mpris[{}]: error running builtin on-click action: {}", (*info).name,
626632
error->message);

0 commit comments

Comments
 (0)