X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmain.c;h=6a6ba34f36bf4ff5c3b9ca8adfe3e8c414a10cfc;hb=76a8fab4adc293982f355609b89dde88d5f355e0;hp=b48bd0091382ea35467a0d9096b6a06cf21154e1;hpb=60ba82303f21ccf5ee53e6e2a48ca3d4dee89acb;p=ncmpc.git diff --git a/src/main.c b/src/main.c index b48bd00..6a6ba34 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "config.h" @@ -30,18 +31,21 @@ #include "mpdclient.h" #include "support.h" #include "options.h" +#include "conf.h" #include "command.h" +#include "src_lyrics.h" #include "screen.h" -#include "conf.h" +#include "screen_utils.h" +#include "strfsong.h" -#define BUFSIZE 256 +#define BUFSIZE 1024 static mpdclient_t *mpd = NULL; static gboolean connected = FALSE; static GTimer *timer = NULL; -static gchar * -error_msg(gchar *msg) +static const gchar * +error_msg(const gchar *msg) { gchar *p; @@ -54,33 +58,61 @@ error_msg(gchar *msg) } static void -error_callback(mpdclient_t *c, gint error, gchar *msg) +error_callback(mpdclient_t *c, gint error, const gchar *msg) +{ + gint code = GET_ACK_ERROR_CODE(error); + + error = error & 0xFF; + D("Error [%d:%d]> \"%s\"\n", error, code, msg); + 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; + } +} + +static void +update_xterm_title(void) { - gint code = GET_ACK_ERROR_CODE(error); + static char title[BUFSIZE]; + char tmp[BUFSIZE]; + mpd_Status *status = NULL; + mpd_Song *song = NULL; + + if( mpd ) + { + status = mpd->status; + song = mpd->song; + } + + if(options.xterm_title_format && status && song && IS_PLAYING(status->state)) + { + strfsong(tmp, BUFSIZE, options.xterm_title_format, song); + } + else + g_strlcpy(tmp, PACKAGE " version " VERSION, BUFSIZE); - error = error & 0xFF; - D("Error [%d:%d]> \"%s\"\n", error, code, msg); - switch(error) + if( strncmp(title,tmp,BUFSIZE) ) { - case MPD_ERROR_CONNPORT: - case MPD_ERROR_NORESPONSE: - break; - case MPD_ERROR_ACK: - screen_status_printf("%s", error_msg(msg)); - beep(); - break; - default: - screen_status_printf("%s", msg); - beep(); - doupdate(); - connected = FALSE; + g_strlcpy(title, tmp, BUFSIZE); + set_xterm_title("%s", title); } } -void +static void exit_and_cleanup(void) { screen_exit(); + set_xterm_title(""); printf("\n"); if( mpd ) { @@ -91,173 +123,237 @@ exit_and_cleanup(void) g_free(options.password); g_free(options.list_format); g_free(options.status_format); + g_free(options.scroll_sep); if( timer ) g_timer_destroy(timer); } -void +static void catch_sigint( int sig ) { - printf("\n%s\n", _("Exiting...")); - exit(EXIT_SUCCESS); + printf("\n%s\n", _("Exiting...")); + exit(EXIT_SUCCESS); } -int -main(int argc, const char *argv[]) -{ - options_t *options; - struct sigaction act; - const char *charset = NULL; - gboolean key_error; - -#ifdef HAVE_LOCALE_H - /* time and date formatting */ - setlocale(LC_TIME,""); - /* charset */ - setlocale(LC_CTYPE,""); - /* initialize charset conversions */ - charset_init(g_get_charset(&charset)); - D("charset: %s\n", charset); -#endif - /* initialize i18n support */ -#ifdef ENABLE_NLS - setlocale(LC_MESSAGES, ""); - bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); - bind_textdomain_codeset(GETTEXT_PACKAGE, charset); - textdomain(GETTEXT_PACKAGE); +static void +catch_sigcont( int sig ) +{ + D("catch_sigcont()\n"); +#ifdef ENABLE_RAW_MODE + reset_prog_mode(); /* restore tty modes */ + refresh(); #endif + screen_resize(); +} - /* initialize options */ - options = options_init(); - - /* parse command line options - 1 pass get configuration files */ - options_parse(argc, argv); - - /* read configuration */ - read_configuration(options); +void +sigstop(void) +{ + def_prog_mode(); /* save the tty modes */ + endwin(); /* end curses mode temporarily */ + kill(0, SIGSTOP); /* issue SIGSTOP */ +} - /* check key bindings */ - key_error = check_key_bindings(NULL, 0); - - /* parse command line options - 2 pass */ - options_parse(argc, argv); - - /* setup signal behavior - SIGINT */ - sigemptyset( &act.sa_mask ); - act.sa_flags = 0; - act.sa_handler = catch_sigint; - if( sigaction( SIGINT, &act, NULL )<0 ) - { - perror("signal"); - exit(EXIT_FAILURE); - } - /* setup signal behavior - SIGTERM */ - sigemptyset( &act.sa_mask ); - act.sa_flags = 0; - act.sa_handler = catch_sigint; - if( sigaction( SIGTERM, &act, NULL )<0 ) +#ifndef NDEBUG +void +D(const char *format, ...) +{ + if( options.debug ) { - perror("sigaction()"); - exit(EXIT_FAILURE); + gchar *msg; + va_list ap; + + va_start(ap,format); + msg = g_strdup_vprintf(format,ap); + va_end(ap); + fprintf(stderr, "%s", msg); + g_free(msg); } +} +#endif - /* set xterm title */ - if( g_getenv("DISPLAY") ) - printf("%c]0;%s%c", '\033', PACKAGE " version " VERSION, '\007'); +int +main(int argc, const char *argv[]) +{ + options_t *options; + struct sigaction act; + const char *charset = NULL; + gboolean key_error; - /* install exit function */ - atexit(exit_and_cleanup); +#ifdef HAVE_LOCALE_H + /* time and date formatting */ + setlocale(LC_TIME,""); + /* care about sorting order etc */ + setlocale(LC_COLLATE,""); + /* charset */ + setlocale(LC_CTYPE,""); + /* initialize charset conversions */ + charset_init(g_get_charset(&charset)); + D("charset: %s\n", charset); +#endif - /* connect to our music player daemon */ - mpd = mpdclient_new(); - if( mpdclient_connect(mpd, - options->host, - options->port, - 10.0, - options->password) ) - { - exit(EXIT_FAILURE); - } - connected = TRUE; - D("Connected to MPD version %d.%d.%d\n", - mpd->connection->version[0], - mpd->connection->version[1], - mpd->connection->version[2]); + /* initialize i18n support */ +#ifdef ENABLE_NLS + setlocale(LC_MESSAGES, ""); + bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, charset); + textdomain(GETTEXT_PACKAGE); +#endif - if( !MPD_VERSION(mpd, 0,11,0) ) - { - fprintf(stderr, "MPD version %d.%d.%d is to old (0.11.0 needed).\n", - mpd->connection->version[0], - mpd->connection->version[1], - mpd->connection->version[2]); - exit(EXIT_FAILURE); - } + /* initialize options */ + options = options_init(); - /* initialize curses */ - screen_init(mpd); + /* parse command line options - 1 pass get configuration files */ + options_parse(argc, argv); - /* install error callback function */ - mpdclient_install_error_callback(mpd, error_callback); + /* read configuration */ + read_configuration(options); - /* initialize timer */ - timer = g_timer_new(); + /* check key bindings */ + key_error = check_key_bindings(NULL, NULL, 0); - connected = TRUE; - while( connected || options->reconnect ) - { - static gdouble t = G_MAXDOUBLE; + /* parse command line options - 2 pass */ + options_parse(argc, argv); - if( key_error ) - { - char buf[BUFSIZE]; + /* setup signal behavior - SIGINT */ + sigemptyset( &act.sa_mask ); + act.sa_flags = 0; + act.sa_handler = catch_sigint; + if( sigaction(SIGINT, &act, NULL)<0 ) { + perror("signal"); + exit(EXIT_FAILURE); + } - key_error=check_key_bindings(buf, BUFSIZE); - screen_status_printf("%s", buf); + /* setup signal behavior - SIGTERM */ + sigemptyset( &act.sa_mask ); + act.sa_flags = 0; + act.sa_handler = catch_sigint; + if( sigaction(SIGTERM, &act, NULL)<0 ) { + perror("sigaction()"); + exit(EXIT_FAILURE); } - if( connected && (t>=MPD_UPDATE_TIME || mpd->need_update) ) - { - mpdclient_update(mpd); - g_timer_start(timer); + /* setup signal behavior - SIGCONT */ + sigemptyset( &act.sa_mask ); + act.sa_flags = 0; + act.sa_handler = catch_sigcont; + if( sigaction(SIGCONT, &act, NULL)<0 ) { + perror("sigaction(SIGCONT)"); + exit(EXIT_FAILURE); } - if( connected ) - { - command_t cmd; - - screen_update(mpd); - if( (cmd=get_keyboard_command()) != CMD_NONE ) - { - screen_cmd(mpd, cmd); - if( cmd==CMD_VOLUME_UP || cmd==CMD_VOLUME_DOWN) - /* make shure we dont update the volume yet */ - g_timer_start(timer); - } - else - screen_idle(mpd); + /* setup signal behaviour - SIGHUP*/ + sigemptyset( &act.sa_mask ); + act.sa_flags = 0; + act.sa_handler = catch_sigint; + if( sigaction(SIGHUP, &act, NULL)<0 ) { + perror("sigaction(SIGHUP)"); + exit(EXIT_FAILURE); } - else if( options->reconnect ) - { - screen_status_printf(_("Connecting to %s... [Press %s to abort]"), - options->host, get_key_names(CMD_QUIT,0) ); - - if( get_keyboard_command_with_timeout(MPD_RECONNECT_TIME)==CMD_QUIT) - exit(EXIT_SUCCESS); - - if( mpdclient_connect(mpd, - options->host, - options->port, - 1.5, - options->password) == 0 ) - { - screen_status_printf(_("Connected to %s!"), options->host); - connected = TRUE; - } - doupdate(); + + /* install exit function */ + atexit(exit_and_cleanup); + + ncurses_init(); + + src_lyr_init (); + + /* connect to our music player daemon */ + mpd = mpdclient_new(); + + if (mpdclient_connect(mpd, + options->host, + options->port, + 10.0, + options->password)) + exit(EXIT_FAILURE); + + /* if no password is used, but the mpd wants one, the connection + might be established but no status information is avaiable */ + mpdclient_update(mpd); + if (!mpd->status) + screen_auth(mpd); + + if (!mpd->status) + exit(EXIT_FAILURE); + + connected = TRUE; + D("Connected to MPD version %d.%d.%d\n", + mpd->connection->version[0], + mpd->connection->version[1], + mpd->connection->version[2]); + + /* quit if mpd is pre 0.11.0 - song id not supported by mpd */ + if( MPD_VERSION_LT(mpd, 0,11,0) ) { + fprintf(stderr, + _("Error: MPD version %d.%d.%d is to old (0.11.0 needed).\n"), + mpd->connection->version[0], + mpd->connection->version[1], + mpd->connection->version[2]); + exit(EXIT_FAILURE); } - t = g_timer_elapsed(timer, NULL); - } - exit(EXIT_FAILURE); + /* initialize curses */ + screen_init(mpd); + /* install error callback function */ + mpdclient_install_error_callback(mpd, error_callback); + + /* initialize timer */ + timer = g_timer_new(); + + connected = TRUE; + while (connected || options->reconnect) { + static gdouble t = G_MAXDOUBLE; + + if( key_error ) { + char buf[BUFSIZE]; + + key_error=check_key_bindings(NULL, buf, BUFSIZE); + screen_status_printf("%s", buf); + } + + if( connected && (t>=MPD_UPDATE_TIME || mpd->need_update) ) { + mpdclient_update(mpd); + g_timer_start(timer); + } + + if( connected ) { + command_t cmd; + + screen_update(mpd); + if( (cmd=get_keyboard_command()) != CMD_NONE ) + { + screen_cmd(mpd, cmd); + if( cmd==CMD_VOLUME_UP || cmd==CMD_VOLUME_DOWN) + /* make shure we dont update the volume yet */ + g_timer_start(timer); + } + else + screen_idle(mpd); + } else if (options->reconnect) { + screen_status_printf(_("Connecting to %s... [Press %s to abort]"), + options->host, get_key_names(CMD_QUIT,0) ); + + if( get_keyboard_command_with_timeout(MPD_RECONNECT_TIME)==CMD_QUIT) + exit(EXIT_SUCCESS); + + if (mpdclient_connect(mpd, + options->host, options->port, + 1.5, + options->password) == 0) { + screen_status_printf(_("Connected to %s!"), options->host); + connected = TRUE; + } + + doupdate(); + } + + if (options->enable_xterm_title) + update_xterm_title(); + + t = g_timer_elapsed(timer, NULL); + } + exit(EXIT_FAILURE); } +