Skip to content

Commit 7613069

Browse files
authored
Merge pull request #1 from belcaik/feature/mpris-fordward-backward-handle
Add mouse navigation support for side buttons in Mpris
2 parents 0332d2e + d41a664 commit 7613069

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}";
@@ -584,38 +583,45 @@ auto Mpris::getPlayerInfo() -> std::optional<PlayerInfo> {
584583
}
585584

586585
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+
587599
GError* error = nullptr;
588-
waybar::util::ScopeGuard error_deleter([error]() {
600+
waybar::util::ScopeGuard error_deleter([&error]() {
589601
if (error) {
590602
g_error_free(error);
591603
}
592604
});
593605

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

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;
617622
}
618623
}
624+
619625
if (error) {
620626
spdlog::error("mpris[{}]: error running builtin on-click action: {}", (*info).name,
621627
error->message);

0 commit comments

Comments
 (0)