X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmain.c;h=eccb5a004c8a114f98966270447278dcbdbf439d;hb=63fc23f1c83f52eb47b5511e97bb1fe7cf7d82d5;hp=85548bec1ebaa6376f01f52dd228713bfc08abda;hpb=8e3947607bc07f0f181c3b0d8d677e3af0acbf8c;p=ncmpc.git diff --git a/src/main.c b/src/main.c index 85548be..eccb5a0 100644 --- a/src/main.c +++ b/src/main.c @@ -26,12 +26,14 @@ #include "command.h" #include "ncu.h" #include "screen.h" -#include "screen_utils.h" #include "screen_status.h" +#include "xterm_title.h" #include "strfsong.h" #include "i18n.h" #include "player_command.h" +#include "keyboard.h" #include "lirc.h" +#include "signals.h" #ifndef NCMPC_MINI #include "conf.h" @@ -61,7 +63,6 @@ static const guint update_interval = 500; static struct mpdclient *mpd = NULL; static GMainLoop *main_loop; static guint reconnect_source_id, update_source_id; -static int sigwinch_pipes[2]; #ifndef NCMPC_MINI static guint check_key_bindings_source_id; @@ -74,65 +75,23 @@ update_xterm_title(void) const struct mpd_song *song = mpd->song; char tmp[BUFSIZE]; + const char *new_title = NULL; if (options.xterm_title_format && mpd->playing && song) - strfsong(tmp, BUFSIZE, options.xterm_title_format, song); - else - g_strlcpy(tmp, PACKAGE " version " VERSION, BUFSIZE); + new_title = strfsong(tmp, BUFSIZE, options.xterm_title_format, song) > 0 + ? tmp + : NULL; + + if (new_title == NULL) + new_title = PACKAGE " version " VERSION; static char title[BUFSIZE]; - if (strncmp(title, tmp, BUFSIZE)) { - g_strlcpy(title, tmp, BUFSIZE); - set_xterm_title("%s", title); + if (strncmp(title, new_title, BUFSIZE)) { + g_strlcpy(title, new_title, BUFSIZE); + set_xterm_title(title); } } #endif -#ifndef WIN32 -static void -catch_sigint(gcc_unused int sig) -{ - g_main_loop_quit(main_loop); -} - - -static void -catch_sigcont(gcc_unused int sig) -{ - if (1 != write(sigwinch_pipes[1], "", 1)) - exit(EXIT_FAILURE); -} - -void -sigstop(void) -{ - def_prog_mode(); /* save the tty modes */ - endwin(); /* end curses mode temporarily */ - kill(0, SIGSTOP); /* issue SIGSTOP */ -} - -static gboolean -sigwinch_event(gcc_unused GIOChannel *source, - gcc_unused GIOCondition condition, gcc_unused gpointer data) -{ - char ignoreme[64]; - if (1 > read(sigwinch_pipes[0], ignoreme, 64)) - exit(EXIT_FAILURE); - - endwin(); - refresh(); - screen_resize(mpd); - - return TRUE; -} - -static void -catch_sigwinch(gcc_unused int sig) -{ - if (1 != write(sigwinch_pipes[1], "", 1)) - exit(EXIT_FAILURE); -} -#endif /* WIN32 */ - static gboolean timer_mpd_update(gpointer data); @@ -159,11 +118,7 @@ disable_update_timer(void) static bool should_enable_update_timer(void) { - return mpd->playing -#ifndef NCMPC_MINI - || options.display_time -#endif - ; + return mpd->playing; } static void @@ -175,9 +130,6 @@ auto_update_timer(void) disable_update_timer(); } -static void -check_reconnect(void); - static void do_mpd_update(void) { @@ -192,41 +144,6 @@ do_mpd_update(void) screen_update(mpd); mpd->events = 0; - - mpdclient_put_connection(mpd); - check_reconnect(); -} - -static char * -settings_name(const struct mpd_settings *settings) -{ - const char *host = mpd_settings_get_host(settings); - if (host == NULL) - host = _("unknown"); - - if (host[0] == '/') - return g_strdup(host); - - unsigned port = mpd_settings_get_port(settings); - if (port == 0 || port == 6600) - return g_strdup(host); - - return g_strdup_printf("%s:%u", host, port); -} - -static char * -default_settings_name(void) -{ - struct mpd_settings *settings = - mpd_settings_new(options.host, options.port, 0, - NULL, options.password); - if (settings == NULL) - return g_strdup(_("unknown")); - - char *name = settings_name(settings); - mpd_settings_free(settings); - - return name; } /** @@ -240,29 +157,17 @@ timer_reconnect(gcc_unused gpointer data) reconnect_source_id = 0; - char *name = default_settings_name(); + char *name = mpdclient_settings_name(mpd); screen_status_printf(_("Connecting to %s... [Press %s to abort]"), name, get_key_names(CMD_QUIT, false)); g_free(name); doupdate(); - mpdclient_disconnect(mpd); - mpdclient_connect(mpd, options.host, options.port, - options.timeout_ms, - options.password); + mpdclient_connect(mpd); return FALSE; } -static void -check_reconnect(void) -{ - if (mpdclient_is_dead(mpd) && reconnect_source_id == 0) - /* reconnect when the connection is lost */ - reconnect_source_id = g_timeout_add(1000, timer_reconnect, - NULL); -} - void mpdclient_connected_callback(void) { @@ -281,8 +186,8 @@ mpdclient_connected_callback(void) doupdate(); /* try again after 30 seconds */ - reconnect_source_id = g_timeout_add(30000, - timer_reconnect, NULL); + reconnect_source_id = + g_timeout_add_seconds(30, timer_reconnect, NULL); return; } #endif @@ -304,8 +209,7 @@ mpdclient_failed_callback(void) assert(reconnect_source_id == 0); /* try again in 5 seconds */ - reconnect_source_id = g_timeout_add(5000, - timer_reconnect, NULL); + reconnect_source_id = g_timeout_add_seconds(5, timer_reconnect, NULL); } void @@ -315,7 +219,7 @@ mpdclient_lost_callback(void) screen_update(mpd); - reconnect_source_id = g_timeout_add(1000, timer_reconnect, NULL); + reconnect_source_id = g_timeout_add_seconds(1, timer_reconnect, NULL); } /** @@ -356,16 +260,15 @@ void end_input_event(void) screen_update(mpd); mpd->events = 0; - mpdclient_put_connection(mpd); - check_reconnect(); auto_update_timer(); } -int do_input_event(command_t cmd) +bool +do_input_event(command_t cmd) { if (cmd == CMD_QUIT) { g_main_loop_quit(main_loop); - return -1; + return false; } screen_cmd(mpd, cmd); @@ -374,25 +277,19 @@ int do_input_event(command_t cmd) /* make sure we don't update the volume yet */ disable_update_timer(); - return 0; + return true; } -static gboolean -keyboard_event(gcc_unused GIOChannel *source, - gcc_unused GIOCondition condition, - gcc_unused gpointer data) -{ - begin_input_event(); - - command_t cmd = get_keyboard_command(); - if (cmd != CMD_NONE) - if (do_input_event(cmd) != 0) - return FALSE; +#ifdef HAVE_GETMOUSE - end_input_event(); - return TRUE; +void +do_mouse_event(int x, int y, mmask_t bstate) +{ + screen_mouse(mpd, x, y, bstate); } +#endif + #ifndef NCMPC_MINI /** * Check the configured key bindings for errors, and display a status @@ -476,59 +373,6 @@ main(int argc, const char *argv[]) /* parse command line options - 2 pass */ options_parse(argc, argv); -#ifndef WIN32 - /* setup signal behavior - SIGINT */ - struct sigaction act; - 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 */ - - act.sa_handler = catch_sigint; - if (sigaction(SIGTERM, &act, NULL) < 0) { - perror("sigaction()"); - exit(EXIT_FAILURE); - } - - /* setup signal behavior - SIGCONT */ - - act.sa_handler = catch_sigcont; - if (sigaction(SIGCONT, &act, NULL) < 0) { - perror("sigaction(SIGCONT)"); - exit(EXIT_FAILURE); - } - - /* setup signal behaviour - SIGHUP*/ - - act.sa_handler = catch_sigint; - if (sigaction(SIGHUP, &act, NULL) < 0) { - perror("sigaction(SIGHUP)"); - exit(EXIT_FAILURE); - } - - /* setup SIGWINCH */ - - act.sa_flags = SA_RESTART; - act.sa_handler = catch_sigwinch; - if (sigaction(SIGWINCH, &act, NULL) < 0) { - perror("sigaction(SIGWINCH)"); - exit(EXIT_FAILURE); - } - - /* ignore SIGPIPE */ - - act.sa_handler = SIG_IGN; - if (sigaction(SIGPIPE, &act, NULL) < 0) { - perror("sigaction(SIGPIPE)"); - exit(EXIT_FAILURE); - } -#endif - ncu_init(); #ifdef ENABLE_LYRICS_SCREEN @@ -536,7 +380,9 @@ main(int argc, const char *argv[]) #endif /* create mpdclient instance */ - mpd = mpdclient_new(); + mpd = mpdclient_new(options.host, options.port, + options.timeout_ms, + options.password); /* initialize curses */ screen_init(mpd); @@ -545,36 +391,24 @@ main(int argc, const char *argv[]) main_loop = g_main_loop_new(NULL, FALSE); /* watch out for keyboard input */ - GIOChannel *keyboard_channel = g_io_channel_unix_new(STDIN_FILENO); - g_io_add_watch(keyboard_channel, G_IO_IN, keyboard_event, NULL); - g_io_channel_unref(keyboard_channel); + keyboard_init(); /* watch out for lirc input */ ncmpc_lirc_init(); -#ifndef WIN32 - if (!pipe(sigwinch_pipes) && - !fcntl(sigwinch_pipes[1], F_SETFL, O_NONBLOCK)) { - GIOChannel *sigwinch_channel = g_io_channel_unix_new(sigwinch_pipes[0]); - g_io_add_watch(sigwinch_channel, G_IO_IN, sigwinch_event, NULL); - g_io_channel_unref(sigwinch_channel); - } - else { - perror("sigwinch pipe creation failed"); - exit(EXIT_FAILURE); - } -#endif + signals_init(main_loop, mpd); /* attempt to connect */ - reconnect_source_id = g_timeout_add(1, timer_reconnect, NULL); + reconnect_source_id = g_idle_add(timer_reconnect, NULL); auto_update_timer(); #ifndef NCMPC_MINI - check_key_bindings_source_id = g_timeout_add(10000, timer_check_key_bindings, NULL); + check_key_bindings_source_id = + g_timeout_add_seconds(10, timer_check_key_bindings, NULL); #endif - screen_paint(mpd); + screen_paint(mpd, true); g_main_loop_run(main_loop); g_main_loop_unref(main_loop); @@ -593,9 +427,7 @@ main(int argc, const char *argv[]) g_source_remove(check_key_bindings_source_id); #endif - close(sigwinch_pipes[0]); - close(sigwinch_pipes[1]); - + signals_deinit(); ncmpc_lirc_deinit(); screen_exit();