diff --git a/src/main.c b/src/main.c
index 81522f9d79a2eb577adae43915b43dad3567fb11..5e978409ff9c73cc3ba59afadf9f13ed69596884 100644 (file)
--- a/src/main.c
+++ b/src/main.c
#include <unistd.h>
#include <signal.h>
#include <string.h>
+#include <ncurses.h>
#include <glib.h>
#include "config.h"
#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;
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 )
{
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);
}
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 */
/* 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);
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);
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,
{
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]);
/* initialize curses */
screen_init(mpd);
-
/* install error callback function */
mpdclient_install_error_callback(mpd, error_callback);
{
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);
}
doupdate();
}
-
+ if( options->enable_xterm_title )
+ update_xterm_title();
t = g_timer_elapsed(timer, NULL);
}
exit(EXIT_FAILURE);
}
+