From 16a19282cb017c48dfeb7aff6d0bdaa0bf8cc383 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Wed, 5 Oct 2016 01:49:06 +0200 Subject: Some further shuffling and renaming --- nncmpp.c | 139 ++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 79 insertions(+), 60 deletions(-) diff --git a/nncmpp.c b/nncmpp.c index 786a312..fa690bd 100644 --- a/nncmpp.c +++ b/nncmpp.c @@ -220,7 +220,7 @@ static struct app_context struct poller_timer connect_event; ///< MPD reconnect timer enum player_state state; ///< Player state - struct str_map song_info; ///< Current song info + struct str_map playback_info; ///< Current song info struct poller_timer elapsed_event; ///< Seconds elapsed event int64_t elapsed_since; ///< Time of the next tick @@ -479,7 +479,7 @@ static void app_free_context (void) { mpd_client_free (&g_ctx.client); - str_map_free (&g_ctx.song_info); + str_map_free (&g_ctx.playback_info); config_free (&g_ctx.config); poller_free (&g_ctx.poller); @@ -714,7 +714,7 @@ static void app_draw_song_info (void) { // The map doesn't need to be initialized at all, so we need to check - struct str_map *map = &g_ctx.song_info; + struct str_map *map = &g_ctx.playback_info; if (!soft_assert (map->len != 0)) return; @@ -1078,7 +1078,7 @@ app_fix_view_range (void) return true; } -/// Scroll down (positive) or up (negative) @a n items. Doesn't redraw. +/// Scroll down (positive) or up (negative) @a n items static bool app_scroll (int n) { @@ -1120,6 +1120,8 @@ app_move_selection (int diff) return result; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + static void app_switch_tab (struct tab *tab) { @@ -1486,8 +1488,14 @@ info_tab_on_item_draw (struct tab *self, unsigned item_index, // TODO } +static void +info_tab_update (void) +{ + // TODO: add some entries from "playback_info" to the listview +} + static struct tab * -info_tab_create (void) +info_tab_init (void) { struct tab *super = &g_info_tab.super; tab_init (super, "Info"); @@ -1523,7 +1531,7 @@ help_tab_on_item_draw (struct tab *self, unsigned item_index, } static struct tab * -help_tab_create (void) +help_tab_init (void) { struct tab *super = &g_help_tab.super; tab_init (super, "Help"); @@ -1601,7 +1609,7 @@ debug_tab_push (const char *message, chtype attrs) } static struct tab * -debug_tab_create (void) +debug_tab_init (void) { g_debug_tab.items = xcalloc ((g_debug_tab.items_alloc = 16), sizeof *g_debug_tab.items); @@ -1620,65 +1628,26 @@ debug_tab_create (void) // TODO: this entire thing has been slavishly copy-pasted from dwmstatus // TODO: try to move some of this code to mpd.c -// Sometimes it's not that easy and there can be repeating entries -static void -mpd_vector_to_map (const struct str_vector *data, struct str_map *map) -{ - str_map_init (map); - map->key_xfrm = tolower_ascii_strxfrm; - map->free = free; - - char *key, *value; - for (size_t i = 0; i < data->len; i++) - { - if ((key = mpd_client_parse_kv (data->vector[i], &value))) - str_map_set (map, key, xstrdup (value)); - else - print_debug ("%s: %s", "erroneous MPD output", data->vector[i]); - } -} - static void -mpd_on_info_response (const struct mpd_response *response, - const struct str_vector *data, void *user_data) +mpd_update_playback_state (void) { - (void) user_data; + struct str_map *map = &g_ctx.playback_info; - // TODO: do this also on disconnect - g_ctx.song_elapsed = -1; - g_ctx.song_duration = -1; - g_ctx.volume = -1; - str_map_free (&g_ctx.song_info); - poller_timer_reset (&g_ctx.elapsed_event); - - if (!response->success) - { - print_debug ("%s: %s", - "retrieving MPD info failed", response->message_text); - return; - } - - struct str_map map; - mpd_vector_to_map (data, &map); - - const char *value; + const char *state; g_ctx.state = PLAYER_PLAYING; - if ((value = str_map_find (&map, "state"))) + if ((state = str_map_find (map, "state"))) { - if (!strcmp (value, "stop")) + if (!strcmp (state, "stop")) g_ctx.state = PLAYER_STOPPED; - if (!strcmp (value, "pause")) + if (!strcmp (state, "pause")) g_ctx.state = PLAYER_PAUSED; } - // Note that we may receive a "time" field twice, however the right one - // wins here due to the order we send the commands in - // The contents of these values overlap and we try to get what we can // FIXME: don't change the values, for fuck's sake - char *time = str_map_find (&map, "time"); - char *duration = str_map_find (&map, "duration"); - char *elapsed = str_map_find (&map, "elapsed"); + char *time = str_map_find (map, "time"); + char *duration = str_map_find (map, "duration"); + char *elapsed = str_map_find (map, "elapsed"); if (time) { char *colon = strchr (time, ':'); @@ -1716,11 +1685,61 @@ mpd_on_info_response (const struct mpd_response *response, } // The server sends -1 when nothing is being played right now - char *volume = str_map_find (&map, "volume"); + char *volume = str_map_find (map, "volume"); if (volume && xstrtoul (&tmp, volume, 10)) g_ctx.volume = tmp; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +// Sometimes it's not that easy and there can be repeating entries +static void +mpd_vector_to_map (const struct str_vector *data, struct str_map *map) +{ + str_map_init (map); + map->key_xfrm = tolower_ascii_strxfrm; + map->free = free; + + char *key, *value; + for (size_t i = 0; i < data->len; i++) + { + if ((key = mpd_client_parse_kv (data->vector[i], &value))) + str_map_set (map, key, xstrdup (value)); + else + print_debug ("%s: %s", "erroneous MPD output", data->vector[i]); + } +} + +static void +mpd_on_info_response (const struct mpd_response *response, + const struct str_vector *data, void *user_data) +{ + (void) user_data; + + // TODO: do this also on disconnect + g_ctx.song_elapsed = -1; + g_ctx.song_duration = -1; + g_ctx.volume = -1; + str_map_free (&g_ctx.playback_info); + poller_timer_reset (&g_ctx.elapsed_event); + // TODO: preset an error player state? + + if (response->success) + { + // Note that we may receive a "time" field twice, however the right + // one wins here due to the order we send the commands in + struct str_map map; + mpd_vector_to_map (data, &map); + g_ctx.playback_info = map; + } + else + { + print_debug ("%s: %s", + "retrieving MPD info failed", response->message_text); + } - g_ctx.song_info = map; + mpd_update_playback_state (); + info_tab_update (); app_invalidate (); } @@ -2127,16 +2146,16 @@ main (int argc, char *argv[]) struct tab *new_tab; if (g_debug_mode) { - new_tab = debug_tab_create (); + new_tab = debug_tab_init (); LIST_PREPEND (g_ctx.tabs, new_tab); } g_log_message_real = app_log_handler; - new_tab = info_tab_create (); + new_tab = info_tab_init (); LIST_PREPEND (g_ctx.tabs, new_tab); - g_ctx.help_tab = help_tab_create (); + g_ctx.help_tab = help_tab_init (); g_ctx.active_tab = g_ctx.help_tab; signals_setup_handlers (); -- cgit v1.2.3-70-g09d2