aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorKalle Wallin <kaw@linux.se>2004-06-05 11:21:43 +0000
committerKalle Wallin <kaw@linux.se>2004-06-05 11:21:43 +0000
commitf55a67b3f882641abe5a9b14b045d7ce71964af7 (patch)
tree181c15b1c59df30b2e28058f2648e5e701e57c4f /src/main.c
parent677eb1ad30321d83f6196672ea1798c0e1712870 (diff)
downloadmpd-f55a67b3f882641abe5a9b14b045d7ce71964af7.tar.gz
mpd-f55a67b3f882641abe5a9b14b045d7ce71964af7.tar.xz
mpd-f55a67b3f882641abe5a9b14b045d7ce71964af7.zip
Changed directory layout (for future use of gettext)
git-svn-id: https://svn.musicpd.org/ncmpc/trunk@1342 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 000000000..bb3740b62
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,199 @@
+/*
+ * (c) 2004 by Kalle Wallin (kaw@linux.se)
+ *
+ * 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
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <glib.h>
+
+#include "config.h"
+#include "libmpdclient.h"
+#include "support.h"
+#include "mpc.h"
+#include "options.h"
+#include "command.h"
+#include "screen.h"
+#include "conf.h"
+
+/* time in seconds between mpd updates (double) */
+#define MPD_UPDATE_TIME 0.5
+
+/* timout in seconds before trying to reconnect (int) */
+#define MPD_RECONNECT_TIMEOUT 3
+
+
+static mpd_client_t *mpc = NULL;
+static GTimer *timer = NULL;
+
+void
+exit_and_cleanup(void)
+{
+ screen_exit();
+ printf("\n");
+ charset_close();
+ if( mpc )
+ {
+ if( mpc_error(mpc) )
+ fprintf(stderr,"Error: %s\n", mpc_error_str(mpc));
+ mpc_close(mpc);
+ }
+ g_free(options.host);
+ g_free(options.password);
+ if( timer )
+ g_timer_destroy(timer);
+}
+
+void
+catch_sigint( int sig )
+{
+ printf( "\nExiting...\n");
+ exit(EXIT_SUCCESS);
+}
+
+int
+main(int argc, const char *argv[])
+{
+ options_t *options;
+ struct sigaction act;
+ gboolean connected;
+
+ /* initialize options */
+ options = options_init();
+
+ /* parse command line options - 1 pass get configuration files */
+ options_parse(argc, argv);
+
+ /* read configuration */
+ read_configuration(options);
+
+ /* check key bindings */
+ if( check_key_bindings() )
+ {
+ fprintf(stderr, "Confusing key bindings - exiting!\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /* parse command line options - 2 pass */
+ options_parse(argc, argv);
+
+ /* initialize local charset */
+ if( charset_init() )
+ exit(EXIT_FAILURE);
+
+ /* 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 )
+ {
+ perror("sigaction()");
+ exit(EXIT_FAILURE);
+ }
+
+ /* set xterm title */
+ if( g_getenv("DISPLAY") )
+ printf("%c]0;%s%c", '\033', PACKAGE " version " VERSION, '\007');
+
+ /* install exit function */
+ atexit(exit_and_cleanup);
+
+ /* connect to our music player daemon */
+ mpc = mpc_connect(options->host, options->port, options->password);
+ if( mpc_error(mpc) )
+ exit(EXIT_FAILURE);
+
+ /* initialize curses */
+ screen_init();
+
+ /* initialize timer */
+ timer = g_timer_new();
+
+ connected = TRUE;
+ while( connected || options->reconnect )
+ {
+ static gdouble t = G_MAXDOUBLE;
+
+ if( connected && t>=MPD_UPDATE_TIME )
+ {
+ mpc_update(mpc);
+ if( mpc_error(mpc) == MPD_ERROR_ACK )
+ {
+ screen_status_printf("%s", mpc_error_str(mpc));
+ mpd_clearError(mpc->connection);
+ mpd_finishCommand(mpc->connection);
+ }
+ else if( mpc_error(mpc) )
+ {
+ screen_status_printf("Lost connection to %s", options->host);
+ connected = FALSE;
+ doupdate();
+ mpd_clearError(mpc->connection);
+ mpd_closeConnection(mpc->connection);
+ mpc->connection = NULL;
+ }
+ else
+ mpd_finishCommand(mpc->connection);
+ g_timer_start(timer);
+ }
+
+ if( connected )
+ {
+ command_t cmd;
+
+ screen_update(mpc);
+ if( (cmd=get_keyboard_command()) != CMD_NONE )
+ {
+ screen_cmd(mpc, 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(mpc);
+ }
+ else if( options->reconnect )
+ {
+ sleep(MPD_RECONNECT_TIMEOUT);
+ screen_status_printf("Connecting to %s... [Press Ctrl-C to abort]",
+ options->host);
+ if( mpc_reconnect(mpc,
+ options->host,
+ options->port,
+ options->password) == 0 )
+ {
+ screen_status_printf("Connected to %s!", options->host);
+ connected = TRUE;
+ }
+ doupdate();
+ }
+
+ t = g_timer_elapsed(timer, NULL);
+ }
+
+ exit(EXIT_FAILURE);
+}