X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmain.c;h=5e978409ff9c73cc3ba59afadf9f13ed69596884;hb=e23ddeed4b98b02a9925035f38dd2ccdadef28b9;hp=81522f9d79a2eb577adae43915b43dad3567fb11;hpb=ddd7adff6d0e02c31b371559cd822f3b5feba345;p=ncmpc.git diff --git a/src/main.c b/src/main.c index 81522f9..5e97840 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "config.h" @@ -30,9 +31,15 @@ #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" +#include "splash.h" + +#define BUFSIZE 1024 static mpdclient_t *mpd = NULL; static gboolean connected = FALSE; @@ -65,20 +72,49 @@ error_callback(mpdclient_t *c, gint error, gchar *msg) break; case MPD_ERROR_ACK: screen_status_printf("%s", error_msg(msg)); - beep(); + screen_bell(); break; default: screen_status_printf("%s", msg); - beep(); + screen_bell(); doupdate(); connected = FALSE; } } +static void +update_xterm_title(void) +{ + 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); + + if( strncmp(title,tmp,BUFSIZE) ) + { + g_strlcpy(title, tmp, BUFSIZE); + set_xterm_title("%s", title); + } +} + void exit_and_cleanup(void) { screen_exit(); + set_xterm_title(""); printf("\n"); if( mpd ) { @@ -89,6 +125,7 @@ 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); } @@ -100,16 +137,63 @@ catch_sigint( int sig ) exit(EXIT_SUCCESS); } +void +catch_sighup( int sig) +{ + printf("\n%s\n", _("Exiting...")); + exit(EXIT_SUCCESS); +} + +void +catch_sigcont( int sig ) +{ + D("catch_sigcont()\n"); +#ifdef ENABLE_RAW_MODE + reset_prog_mode(); /* restore tty modes */ + refresh(); +#endif + screen_resize(); +} + +void +sigstop(void) +{ + def_prog_mode(); /* save the tty modes */ + endwin(); /* end curses mode temporarily */ + kill(0, SIGSTOP); /* issue SIGSTOP */ +} + +#ifdef DEBUG +void +D(char *format, ...) +{ + if( options.debug ) + { + 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 + 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,""); + /* care about sorting order etc */ + setlocale(LC_COLLATE,""); /* charset */ setlocale(LC_CTYPE,""); /* initialize charset conversions */ @@ -133,14 +217,10 @@ main(int argc, const char *argv[]) /* read configuration */ read_configuration(options); - - /* check key bindings */ - if( check_key_bindings() ) - { - fprintf(stderr, _("Confusing key bindings - exiting!\n")); - exit(EXIT_FAILURE); - } + /* check key bindings */ + key_error = check_key_bindings(NULL, NULL, 0); + /* parse command line options - 2 pass */ options_parse(argc, argv); @@ -148,7 +228,7 @@ main(int argc, const char *argv[]) sigemptyset( &act.sa_mask ); act.sa_flags = 0; act.sa_handler = catch_sigint; - if( sigaction( SIGINT, &act, NULL )<0 ) + if( sigaction(SIGINT, &act, NULL)<0 ) { perror("signal"); exit(EXIT_FAILURE); @@ -157,21 +237,42 @@ main(int argc, const char *argv[]) sigemptyset( &act.sa_mask ); act.sa_flags = 0; act.sa_handler = catch_sigint; - if( sigaction( SIGTERM, &act, NULL )<0 ) + if( sigaction(SIGTERM, &act, NULL)<0 ) { perror("sigaction()"); exit(EXIT_FAILURE); } - - /* set xterm title */ - if( g_getenv("DISPLAY") ) - printf("%c]0;%s%c", '\033', PACKAGE " version " VERSION, '\007'); - + /* 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); + } + + /* 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); + } + /* install exit function */ atexit(exit_and_cleanup); + + ncurses_init(); + if(options->show_splash == TRUE) draw_splash(); + + src_lyr_init (); /* connect to our music player daemon */ mpd = mpdclient_new(); + if( mpdclient_connect(mpd, options->host, options->port, @@ -180,15 +281,27 @@ main(int argc, const char *argv[]) { 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]); - if( !MPD_VERSION(mpd, 0,11,0) ) + /* quit if mpd is pre 0.11.0 - song id not supported by mpd */ + if( MPD_VERSION_LT(mpd, 0,11,0) ) { - fprintf(stderr, "MPD version %d.%d.%d is to old (0.11.0 needed).\n", + 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]); @@ -197,7 +310,6 @@ main(int argc, const char *argv[]) /* initialize curses */ screen_init(mpd); - /* install error callback function */ mpdclient_install_error_callback(mpd, error_callback); @@ -209,6 +321,14 @@ main(int argc, const char *argv[]) { 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); @@ -249,8 +369,10 @@ main(int argc, const char *argv[]) } doupdate(); } - + if( options->enable_xterm_title ) + update_xterm_title(); t = g_timer_elapsed(timer, NULL); } exit(EXIT_FAILURE); } +