/* Copyright (C) 2025 awy stmusic 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. stmusic 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 stmusic. If not, see . */ #include #include #include #include "../lib/util.h" void buttonhandler() { char *term; char *env; int button; button = 0; if ((env = getenv("BLOCK_BUTTON"))) button = getbtnint(env); if (!(term = getenv("TERMINAL"))) term = "footclient"; const char *rmpc[] = { term, "-e", "rmpc", NULL }; const char *toggle[] = { "rmpc", "togglepause", NULL }; const char *prev[] = { "rmpc", "prev", NULL }; const char *next[] = { "rmpc", "next", NULL }; switch (button) { case 1: spawn(rmpc); break; case 2: 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 main(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 = mpd_song_get_tag(song, MPD_TAG_ARTIST, 0); const char *title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0); printf("%s - %s", artist ? artist : "unknown", 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; } mpd_status_free(status); mpd_connection_free(conn); return 0; }