diff options
Diffstat (limited to 'wmstatus.c')
-rw-r--r-- | wmstatus.c | 65 |
1 files changed, 48 insertions, 17 deletions
@@ -1,7 +1,7 @@ /* * wmstatus.c: simple PulseAudio-enabled status setter for dwm and i3/sway * - * Copyright (c) 2015 - 2021, Přemysl Eric Janouch <p@janouch.name> + * Copyright (c) 2015 - 2024, Přemysl Eric Janouch <p@janouch.name> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted. @@ -20,7 +20,10 @@ #define LIBERTY_WANT_ASYNC #define LIBERTY_WANT_PROTO_MPD -#define _GNU_SOURCE // openat +// openat, dirfd +#define _XOPEN_SOURCE 700 +#define _ATFILE_SOURCE +#define _GNU_SOURCE #include "config.h" #undef PROGRAM_NAME @@ -849,7 +852,7 @@ struct app_context struct mpd_client mpd_client; ///< MPD client char *mpd_song; ///< MPD current song - char *mpd_status; ///< MPD status (overrides song) + bool mpd_stopped; ///< MPD stopped (overrides song) // NUT: @@ -989,7 +992,6 @@ app_context_free (struct app_context *self) mpd_client_free (&self->mpd_client); cstr_set (&self->mpd_song, NULL); - cstr_set (&self->mpd_status, NULL); nut_client_free (&self->nut_client); str_map_free (&self->nut_ups_info); @@ -1112,6 +1114,15 @@ try_power_supply (int dir, struct error **e) return NULL; } + bool offline = !read_number (dir, "online", &error); + if (error) + { + error_free (error); + error = NULL; + } + else if (offline) + return NULL; + bool is_relevant = !strcmp (type, "Battery") || !strcmp (type, "USB") || @@ -1228,7 +1239,7 @@ refresh_status (struct app_context *ctx) { if (ctx->prefix) ctx->backend->add (ctx->backend, ctx->prefix); - if (ctx->mpd_status) ctx->backend->add (ctx->backend, ctx->mpd_status); + if (ctx->mpd_stopped) ctx->backend->add (ctx->backend, "MPD stopped"); else if (ctx->mpd_song) ctx->backend->add (ctx->backend, ctx->mpd_song); if (ctx->noise_end_time) @@ -1495,9 +1506,8 @@ mpd_on_info_response (const struct mpd_response *response, struct str_map map; mpd_vector_to_map (data, &map); - cstr_set (&ctx->mpd_status, NULL); - struct str s = str_make (); + ctx->mpd_stopped = false; const char *value; if ((value = str_map_find (&map, "state"))) @@ -1505,7 +1515,7 @@ mpd_on_info_response (const struct mpd_response *response, // Unicode approximates since in proportional fonts ASCII looks ugly // and I don't want to depend on a particular font with player chars if (!strcmp (value, "stop")) - ctx->mpd_status = xstrdup ("MPD stopped"); + ctx->mpd_stopped = true; else if (!strcmp (value, "pause")) str_append (&s, "▯▯ " /* "|| " */); else @@ -1602,6 +1612,10 @@ mpd_on_failure (void *user_data) struct app_context *ctx = user_data; print_error ("connection to MPD failed"); mpd_queue_reconnect (ctx); + + cstr_set (&ctx->mpd_song, NULL); + ctx->mpd_stopped = false; + refresh_status (ctx); } static void @@ -2055,8 +2069,19 @@ on_noise_adjust (struct app_context *ctx, int arg) if (!ctx->noise_end_time && (arg < 0 || !noise_start (ctx))) return; - // The granularity of noise playback is whole minutes - ctx->noise_end_time += arg * 60; + time_t now = time (NULL); + int diff = difftime (ctx->noise_end_time, now); + + // The granularity of noise playback setting is whole hours. + enum { SECOND = 1, MINUTE = 60, HOUR = 3600 }; + if (arg > 0) + // Add a minute to enable stepping up from 0:59 to 2:00. + diff = (diff + arg * HOUR + MINUTE) / HOUR * HOUR; + else if (arg++ < 0) + // Remove a second to enable stepping down from 2:00 to 1:00. + diff = (diff + arg * HOUR - SECOND) / HOUR * HOUR; + + ctx->noise_end_time = now + diff; on_noise_timer (ctx); } @@ -2211,9 +2236,9 @@ spawn (char *argv[]) mpd_client_idle (c, 0); \ } -// XXX: pause without argument is deprecated, we can watch play state -// if we want to have the toggle pause/play functionality -MPD_SIMPLE (play, "pause", NULL) + +MPD_SIMPLE (play, "play", NULL) +MPD_SIMPLE (toggle, "pause", NULL) MPD_SIMPLE (stop, "stop", NULL) MPD_SIMPLE (prev, "previous", NULL) MPD_SIMPLE (next, "next", NULL) @@ -2221,6 +2246,12 @@ MPD_SIMPLE (forward, "seekcur", "+10", NULL) MPD_SIMPLE (backward, "seekcur", "-10", NULL) static void +on_mpd_play_toggle (struct app_context *ctx, int arg) +{ + (ctx->mpd_stopped ? on_mpd_play : on_mpd_toggle) (ctx, arg); +} + +static void on_volume_finish (pa_context *context, int success, void *userdata) { (void) context; @@ -2417,13 +2448,13 @@ g_keys[] = // can be used to figure out which modifier is AltGr // MPD - { Mod4Mask, XK_Up, on_mpd_play, 0 }, + { Mod4Mask, XK_Up, on_mpd_play_toggle, 0 }, { Mod4Mask, XK_Down, on_mpd_stop, 0 }, { Mod4Mask, XK_Left, on_mpd_prev, 0 }, { Mod4Mask, XK_Right, on_mpd_next, 0 }, { Mod4Mask | ShiftMask, XK_Left, on_mpd_backward, 0 }, { Mod4Mask | ShiftMask, XK_Right, on_mpd_forward, 0 }, - { 0, XF86XK_AudioPlay, on_mpd_play, 0 }, + { 0, XF86XK_AudioPlay, on_mpd_play_toggle, 0 }, { 0, XF86XK_AudioPrev, on_mpd_prev, 0 }, { 0, XF86XK_AudioNext, on_mpd_next, 0 }, @@ -2472,8 +2503,8 @@ g_keys[] = { 0, XF86XK_AudioMicMute, on_volume_mic_mute, 0 }, // Noise playback - { ControlMask, XF86XK_AudioRaiseVolume, on_noise_adjust, 60 }, - { ControlMask, XF86XK_AudioLowerVolume, on_noise_adjust, -60 }, + { ControlMask, XF86XK_AudioRaiseVolume, on_noise_adjust, 1 }, + { ControlMask, XF86XK_AudioLowerVolume, on_noise_adjust, -1 }, }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |