X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmain.c;h=8abdcbda94c60f4a043b9bd4bd403645abae8436;hb=15eacd43a481a4fc67789a25d56bb5f1527bfc12;hp=11f16acb842f57174986ffca34e4e7ddcd1c2769;hpb=01388b0ea33e583358562d864cd0e481b2465308;p=ncmpc.git diff --git a/src/main.c b/src/main.c index 11f16ac..8abdcbd 100644 --- a/src/main.c +++ b/src/main.c @@ -1,20 +1,21 @@ -/* - * (c) 2004 by Kalle Wallin - * +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2009 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * This program 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 2 of the License, or * (at your option) any later version. - * + * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ #include "config.h" #include "ncmpc.h" @@ -25,8 +26,10 @@ #include "ncu.h" #include "screen.h" #include "screen_utils.h" +#include "screen_message.h" #include "strfsong.h" #include "i18n.h" +#include "player_command.h" #ifndef NCMPC_MINI #include "conf.h" @@ -40,61 +43,29 @@ #include "lirc.h" #endif +#include + #include #include #include #include +#ifdef ENABLE_LOCALE +#include +#endif + /* time between mpd updates [s] */ static const guint update_interval = 500; #define BUFSIZE 1024 -static const guint idle_interval = 500; - -static mpdclient_t *mpd = NULL; -static gboolean connected = FALSE; +static struct mpdclient *mpd = NULL; static GMainLoop *main_loop; -static guint reconnect_source_id, idle_source_id, update_source_id; +static guint reconnect_source_id, update_source_id; -static const gchar * -error_msg(const gchar *msg) -{ - gchar *p; - - if ((p = strchr(msg, '}')) == NULL) - return msg; - - do { - p++; - } while (*p == '}' || * p== ' '); - - return p; -} - -static void -error_callback(G_GNUC_UNUSED mpdclient_t *c, gint error, const gchar *_msg) -{ - char *msg = utf8_to_locale(_msg); - - error = error & 0xFF; - switch (error) { - case MPD_ERROR_CONNPORT: - case MPD_ERROR_NORESPONSE: - break; - case MPD_ERROR_ACK: - screen_status_printf("%s", error_msg(msg)); - screen_bell(); - break; - default: - screen_status_printf("%s", msg); - screen_bell(); - doupdate(); - connected = FALSE; - } - - g_free(msg); -} +#ifndef NCMPC_MINI +static guint check_key_bindings_source_id; +#endif #ifndef NCMPC_MINI static void @@ -102,8 +73,8 @@ update_xterm_title(void) { static char title[BUFSIZE]; char tmp[BUFSIZE]; - mpd_Status *status = NULL; - mpd_Song *song = NULL; + struct mpd_status *status = NULL; + const struct mpd_song *song = NULL; if (mpd) { status = mpd->status; @@ -111,7 +82,7 @@ update_xterm_title(void) } if (options.xterm_title_format && status && song && - IS_PLAYING(status->state)) + mpd_status_get_state(status) == MPD_STATE_PLAY) strfsong(tmp, BUFSIZE, options.xterm_title_format, song); else g_strlcpy(tmp, PACKAGE " version " VERSION, BUFSIZE); @@ -136,14 +107,6 @@ exit_and_cleanup(void) mpdclient_disconnect(mpd); mpdclient_free(mpd); } - - g_free(options.host); - g_free(options.password); - g_free(options.list_format); - g_free(options.status_format); -#ifndef NCMPC_MINI - g_free(options.scroll_sep); -#endif } static void @@ -202,21 +165,20 @@ timer_mpd_update(gpointer data); static gboolean timer_reconnect(G_GNUC_UNUSED gpointer data) { - int ret; + bool success; - if (connected) - return FALSE; + assert(!mpdclient_is_connected(mpd)); screen_status_printf(_("Connecting to %s... [Press %s to abort]"), options.host, get_key_names(CMD_QUIT,0) ); doupdate(); mpdclient_disconnect(mpd); - ret = mpdclient_connect(mpd, - options.host, options.port, - 1.5, - options.password); - if (ret != 0) { + success = mpdclient_connect(mpd, + options.host, options.port, + 1.5, + options.password); + if (!success) { /* try again in 5 seconds */ g_timeout_add(5000, timer_reconnect, NULL); return FALSE; @@ -224,12 +186,12 @@ timer_reconnect(G_GNUC_UNUSED gpointer data) #ifndef NCMPC_MINI /* quit if mpd is pre 0.11.0 - song id not supported by mpd */ - if (MPD_VERSION_LT(mpd, 0, 11, 0)) { + if (mpd_connection_cmp_server_version(mpd->connection, 0, 12, 0) < 0) { + const unsigned *version = + mpd_connection_get_server_version(mpd->connection); screen_status_printf(_("Error: MPD version %d.%d.%d is to old (%s needed)"), - mpd->connection->version[0], - mpd->connection->version[1], - mpd->connection->version[2], - "0.11.0"); + version[0], version[1], version[2], + "0.12.0"); mpdclient_disconnect(mpd); doupdate(); @@ -239,11 +201,11 @@ timer_reconnect(G_GNUC_UNUSED gpointer data) } #endif - screen_status_printf(_("Connected to %s"), options.host); + screen_status_printf(_("Connected to %s"), + options.host != NULL + ? options.host : "localhost"); doupdate(); - connected = TRUE; - /* update immediately */ g_timeout_add(1, timer_mpd_update, GINT_TO_POINTER(FALSE)); @@ -255,7 +217,7 @@ timer_reconnect(G_GNUC_UNUSED gpointer data) static gboolean timer_mpd_update(gpointer data) { - if (connected) + if (mpdclient_is_connected(mpd)) mpdclient_update(mpd); else if (reconnect_source_id == 0) reconnect_source_id = g_timeout_add(1000, timer_reconnect, @@ -268,31 +230,18 @@ timer_mpd_update(gpointer data) screen_update(mpd); - return GPOINTER_TO_INT(data); -} + mpd->events = 0; -/** - * This idle timer is invoked when the user hasn't typed a key for - * 500ms. It is used for delayed seeking. - */ -static gboolean -timer_idle(G_GNUC_UNUSED gpointer data) -{ - screen_idle(mpd); - return TRUE; + return GPOINTER_TO_INT(data); } void begin_input_event(void) { - /* remove the idle timeout; add it later with fresh interval */ - g_source_remove(idle_source_id); } void end_input_event(void) { screen_update(mpd); - - idle_source_id = g_timeout_add(idle_interval, timer_idle, NULL); } int do_input_event(command_t cmd) @@ -305,7 +254,7 @@ int do_input_event(command_t cmd) screen_cmd(mpd, cmd); if (cmd == CMD_VOLUME_UP || cmd == CMD_VOLUME_DOWN) { - /* make sure we dont update the volume yet */ + /* make sure we don't update the volume yet */ g_source_remove(update_source_id); update_source_id = g_timeout_add(update_interval, timer_mpd_update, @@ -341,15 +290,33 @@ static gboolean timer_check_key_bindings(G_GNUC_UNUSED gpointer data) { char buf[256]; +#ifdef ENABLE_KEYDEF_SCREEN + char comment[64]; +#endif gboolean key_error; key_error = check_key_bindings(NULL, buf, sizeof(buf)); - if (!key_error) + if (!key_error) { /* no error: disable this timer for the rest of this process */ + check_key_bindings_source_id = 0; return FALSE; + } + +#ifdef ENABLE_KEYDEF_SCREEN + g_strchomp(buf); + g_strlcat(buf, " (", sizeof(buf)); + /* to translators: a key was bound twice in the key editor, + and this is a hint for the user what to press to correct + that */ + g_snprintf(comment, sizeof(comment), _("press %s for the key editor"), + get_key_names(CMD_SCREEN_KEYDEF, 0)); + g_strlcat(buf, comment, sizeof(buf)); + g_strlcat(buf, ")", sizeof(buf)); +#endif screen_status_printf("%s", buf); + doupdate(); return TRUE; } @@ -359,7 +326,7 @@ int main(int argc, const char *argv[]) { struct sigaction act; -#if defined(HAVE_LOCALE_H) && !defined(NCMPC_MINI) +#ifdef ENABLE_LOCALE const char *charset = NULL; #endif GIOChannel *keyboard_channel; @@ -368,7 +335,7 @@ main(int argc, const char *argv[]) GIOChannel *lirc_channel = NULL; #endif -#if defined(HAVE_LOCALE_H) && !defined(NCMPC_MINI) +#ifdef ENABLE_LOCALE /* time and date formatting */ setlocale(LC_TIME,""); /* care about sorting order etc */ @@ -379,12 +346,15 @@ main(int argc, const char *argv[]) charset = charset_init(); /* initialize i18n support */ +#endif + #ifdef ENABLE_NLS setlocale(LC_MESSAGES, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); +#ifdef ENABLE_LOCALE bind_textdomain_codeset(GETTEXT_PACKAGE, charset); - textdomain(GETTEXT_PACKAGE); #endif + textdomain(GETTEXT_PACKAGE); #endif /* initialize options */ @@ -393,13 +363,13 @@ main(int argc, const char *argv[]) /* parse command line options - 1 pass get configuration files */ options_parse(argc, argv); - /* read configuration */ #ifndef NCMPC_MINI + /* read configuration */ read_configuration(); -#endif /* check key bindings */ check_key_bindings(NULL, NULL, 0); +#endif /* parse command line options - 2 pass */ options_parse(argc, argv); @@ -462,7 +432,6 @@ main(int argc, const char *argv[]) /* create mpdclient instance */ mpd = mpdclient_new(); - mpdclient_install_error_callback(mpd, error_callback); /* initialize curses */ screen_init(mpd); @@ -490,9 +459,8 @@ main(int argc, const char *argv[]) timer_mpd_update, GINT_TO_POINTER(TRUE)); #ifndef NCMPC_MINI - g_timeout_add(10000, timer_check_key_bindings, NULL); + check_key_bindings_source_id = g_timeout_add(10000, timer_check_key_bindings, NULL); #endif - idle_source_id = g_timeout_add(idle_interval, timer_idle, NULL); screen_paint(mpd); @@ -500,6 +468,15 @@ main(int argc, const char *argv[]) /* cleanup */ + cancel_seek_timer(); + + g_source_remove(update_source_id); + +#ifndef NCMPC_MINI + if (check_key_bindings_source_id != 0) + g_source_remove(check_key_bindings_source_id); +#endif + g_main_loop_unref(main_loop); g_io_channel_unref(keyboard_channel); @@ -510,7 +487,13 @@ main(int argc, const char *argv[]) #endif exit_and_cleanup(); + +#ifdef ENABLE_LYRICS_SCREEN + lyrics_deinit(); +#endif + ncu_deinit(); + options_deinit(); return 0; }