/* Copyright (C) 2025 awy This file is part of stbar. stbar is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. stbar is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with stbar. If not, see . */ #include "../util.h" #include #include #include static void buttonhandler(void) { char *term; char *env; int button; button = 0; if ((env = getenv("BLOCK_BUTTON"))) button = getbtnint(env); if (!(term = getenv("TERMINAL"))) term = "footclient"; const char *toggle[] = {"rmpc", "togglepause", NULL}; const char *prev[] = {"rmpc", "prev", NULL}; const char *next[] = {"rmpc", "next", NULL}; switch (button) { case 1: spawn(toggle); break; /* case 3: sendnotif("stmusic", " Music module", "- Shows mpd song playing.\n\ -  paused.\n\ -  repeat mode.\n\ -  shuffle mode.\n\ - 󰮯 consume mode.\n\ - 󰮯 󰇊 consume oneshot mode.\n\ - 󰎤 single mode.\n\ - 󰇊 single oneshot mode.\n\ - Left click opens rmpc.\n\ - Middle click pauses.\n\ - Scroll changes track."); break; */ case 4: spawn(prev); break; case 5: spawn(next); break; default: break; } } int stmusic(void) { struct mpd_connection *conn; struct mpd_status *status; struct mpd_song *song; buttonhandler(); /* Connect to MPD (default: localhost:6600) */ conn = mpd_connection_new(NULL, 0, 30000); if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) { fprintf(stderr, "MPD connection error: %s\n", mpd_connection_get_error_message(conn)); return 1; } /* Get MPD status */ status = mpd_run_status(conn); if (!status) { fprintf(stderr, "Failed to get status: %s\n", mpd_connection_get_error_message(conn)); mpd_connection_free(conn); return 1; } enum mpd_state st = mpd_status_get_state(status); /* Don't print anything if mpd is stopped */ if (st == MPD_STATE_STOP) { return 0; } if (st == MPD_STATE_PAUSE) { printf(" "); }; /* Get current song */ song = mpd_run_current_song(conn); if (song) { const char *artist; const char *title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0); // loop through all artists for (unsigned i = 0; (artist = mpd_song_get_tag(song, MPD_TAG_ARTIST, i)); ++i) { if (i > 0) printf(", "); // separator between artists printf("%s", artist); } printf(" - %s", title ? title : "unknown"); mpd_song_free(song); } if (mpd_status_get_repeat(status)) { printf(" "); }; if (mpd_status_get_random(status)) { printf(" "); }; enum mpd_consume_state consumest = mpd_status_get_consume_state(status); switch (consumest) { case MPD_CONSUME_ONESHOT: printf(" 󰮯 󰇊"); break; case MPD_CONSUME_ON: printf(" 󰮯"); break; case MPD_CONSUME_UNKNOWN: break; case MPD_CONSUME_OFF: break; } enum mpd_single_state singlest = mpd_status_get_single_state(status); switch (singlest) { case MPD_SINGLE_ONESHOT: printf(" 󰇊"); break; case MPD_SINGLE_ON: printf(" 󰎤"); break; case MPD_CONSUME_UNKNOWN: break; case MPD_CONSUME_OFF: break; } puts(""); mpd_status_free(status); mpd_connection_free(conn); return 0; }