degesch: shuffle some code
This commit is contained in:
parent
1b2fabe4cc
commit
699636d9a2
234
degesch.c
234
degesch.c
|
@ -1666,72 +1666,6 @@ init_colors (struct app_context *ctx)
|
||||||
g_log_message_real = log_message_attributed;
|
g_log_message_real = log_message_attributed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Signals -----------------------------------------------------------------
|
|
||||||
|
|
||||||
static int g_signal_pipe[2]; ///< A pipe used to signal... signals
|
|
||||||
|
|
||||||
/// Program termination has been requested by a signal
|
|
||||||
static volatile sig_atomic_t g_termination_requested;
|
|
||||||
/// The window has changed in size
|
|
||||||
static volatile sig_atomic_t g_winch_received;
|
|
||||||
|
|
||||||
static void
|
|
||||||
sigterm_handler (int signum)
|
|
||||||
{
|
|
||||||
(void) signum;
|
|
||||||
|
|
||||||
g_termination_requested = true;
|
|
||||||
|
|
||||||
int original_errno = errno;
|
|
||||||
if (write (g_signal_pipe[1], "t", 1) == -1)
|
|
||||||
soft_assert (errno == EAGAIN);
|
|
||||||
errno = original_errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sigwinch_handler (int signum)
|
|
||||||
{
|
|
||||||
(void) signum;
|
|
||||||
|
|
||||||
g_winch_received = true;
|
|
||||||
|
|
||||||
int original_errno = errno;
|
|
||||||
if (write (g_signal_pipe[1], "w", 1) == -1)
|
|
||||||
soft_assert (errno == EAGAIN);
|
|
||||||
errno = original_errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_signal_handlers (void)
|
|
||||||
{
|
|
||||||
if (pipe (g_signal_pipe) == -1)
|
|
||||||
exit_fatal ("%s: %s", "pipe", strerror (errno));
|
|
||||||
|
|
||||||
set_cloexec (g_signal_pipe[0]);
|
|
||||||
set_cloexec (g_signal_pipe[1]);
|
|
||||||
|
|
||||||
// So that the pipe cannot overflow; it would make write() block within
|
|
||||||
// the signal handler, which is something we really don't want to happen.
|
|
||||||
// The same holds true for read().
|
|
||||||
set_blocking (g_signal_pipe[0], false);
|
|
||||||
set_blocking (g_signal_pipe[1], false);
|
|
||||||
|
|
||||||
signal (SIGPIPE, SIG_IGN);
|
|
||||||
|
|
||||||
struct sigaction sa;
|
|
||||||
sa.sa_flags = SA_RESTART;
|
|
||||||
sa.sa_handler = sigwinch_handler;
|
|
||||||
sigemptyset (&sa.sa_mask);
|
|
||||||
|
|
||||||
if (sigaction (SIGWINCH, &sa, NULL) == -1)
|
|
||||||
exit_fatal ("sigaction: %s", strerror (errno));
|
|
||||||
|
|
||||||
sa.sa_handler = sigterm_handler;
|
|
||||||
if (sigaction (SIGINT, &sa, NULL) == -1
|
|
||||||
|| sigaction (SIGTERM, &sa, NULL) == -1)
|
|
||||||
exit_fatal ("sigaction: %s", strerror (errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Output formatter --------------------------------------------------------
|
// --- Output formatter --------------------------------------------------------
|
||||||
|
|
||||||
// This complicated piece of code makes attributed text formatting simple.
|
// This complicated piece of code makes attributed text formatting simple.
|
||||||
|
@ -5796,49 +5730,6 @@ app_editline_init (struct input *self)
|
||||||
|
|
||||||
#endif // HAVE_EDITLINE
|
#endif // HAVE_EDITLINE
|
||||||
|
|
||||||
// --- I/O event handlers ------------------------------------------------------
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx)
|
|
||||||
{
|
|
||||||
char dummy;
|
|
||||||
(void) read (fd->fd, &dummy, 1);
|
|
||||||
|
|
||||||
if (g_termination_requested && !ctx->quitting)
|
|
||||||
{
|
|
||||||
// There may be a timer set to reconnect to the server
|
|
||||||
// TODO: multiserver
|
|
||||||
struct server *s = &ctx->server;
|
|
||||||
// TODO: a faster timer for quitting
|
|
||||||
irc_reset_connection_timeouts (s);
|
|
||||||
|
|
||||||
// FIXME: use a normal quit message
|
|
||||||
if (irc_is_connected (s))
|
|
||||||
irc_send (s, "QUIT :Terminated by signal");
|
|
||||||
initiate_quit (ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_winch_received)
|
|
||||||
{
|
|
||||||
input_on_terminal_resized (&ctx->input);
|
|
||||||
update_screen_size ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_tty_readable (const struct pollfd *fd, struct app_context *ctx)
|
|
||||||
{
|
|
||||||
(void) ctx;
|
|
||||||
|
|
||||||
if (fd->revents & ~(POLLIN | POLLHUP | POLLERR))
|
|
||||||
print_debug ("fd %d: unexpected revents: %d", fd->fd, fd->revents);
|
|
||||||
|
|
||||||
// XXX: this may loop for a bit: stop the event or eat the input?
|
|
||||||
// (This prevents a segfault when the input has been stopped.)
|
|
||||||
if (ctx->input.active)
|
|
||||||
input_on_readable (&ctx->input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Configuration loading ---------------------------------------------------
|
// --- Configuration loading ---------------------------------------------------
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -5963,7 +5854,114 @@ load_configuration (struct app_context *ctx)
|
||||||
get_config_integer (ctx, "server.reconnect_delay");
|
get_config_integer (ctx, "server.reconnect_delay");
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Main program ------------------------------------------------------------
|
// --- Signals -----------------------------------------------------------------
|
||||||
|
|
||||||
|
static int g_signal_pipe[2]; ///< A pipe used to signal... signals
|
||||||
|
|
||||||
|
/// Program termination has been requested by a signal
|
||||||
|
static volatile sig_atomic_t g_termination_requested;
|
||||||
|
/// The window has changed in size
|
||||||
|
static volatile sig_atomic_t g_winch_received;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigterm_handler (int signum)
|
||||||
|
{
|
||||||
|
(void) signum;
|
||||||
|
|
||||||
|
g_termination_requested = true;
|
||||||
|
|
||||||
|
int original_errno = errno;
|
||||||
|
if (write (g_signal_pipe[1], "t", 1) == -1)
|
||||||
|
soft_assert (errno == EAGAIN);
|
||||||
|
errno = original_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigwinch_handler (int signum)
|
||||||
|
{
|
||||||
|
(void) signum;
|
||||||
|
|
||||||
|
g_winch_received = true;
|
||||||
|
|
||||||
|
int original_errno = errno;
|
||||||
|
if (write (g_signal_pipe[1], "w", 1) == -1)
|
||||||
|
soft_assert (errno == EAGAIN);
|
||||||
|
errno = original_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_signal_handlers (void)
|
||||||
|
{
|
||||||
|
if (pipe (g_signal_pipe) == -1)
|
||||||
|
exit_fatal ("%s: %s", "pipe", strerror (errno));
|
||||||
|
|
||||||
|
set_cloexec (g_signal_pipe[0]);
|
||||||
|
set_cloexec (g_signal_pipe[1]);
|
||||||
|
|
||||||
|
// So that the pipe cannot overflow; it would make write() block within
|
||||||
|
// the signal handler, which is something we really don't want to happen.
|
||||||
|
// The same holds true for read().
|
||||||
|
set_blocking (g_signal_pipe[0], false);
|
||||||
|
set_blocking (g_signal_pipe[1], false);
|
||||||
|
|
||||||
|
signal (SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
struct sigaction sa;
|
||||||
|
sa.sa_flags = SA_RESTART;
|
||||||
|
sa.sa_handler = sigwinch_handler;
|
||||||
|
sigemptyset (&sa.sa_mask);
|
||||||
|
|
||||||
|
if (sigaction (SIGWINCH, &sa, NULL) == -1)
|
||||||
|
exit_fatal ("sigaction: %s", strerror (errno));
|
||||||
|
|
||||||
|
sa.sa_handler = sigterm_handler;
|
||||||
|
if (sigaction (SIGINT, &sa, NULL) == -1
|
||||||
|
|| sigaction (SIGTERM, &sa, NULL) == -1)
|
||||||
|
exit_fatal ("sigaction: %s", strerror (errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- I/O event handlers ------------------------------------------------------
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_signal_pipe_readable (const struct pollfd *fd, struct app_context *ctx)
|
||||||
|
{
|
||||||
|
char dummy;
|
||||||
|
(void) read (fd->fd, &dummy, 1);
|
||||||
|
|
||||||
|
if (g_termination_requested && !ctx->quitting)
|
||||||
|
{
|
||||||
|
// There may be a timer set to reconnect to the server
|
||||||
|
// TODO: multiserver
|
||||||
|
struct server *s = &ctx->server;
|
||||||
|
// TODO: a faster timer for quitting
|
||||||
|
irc_reset_connection_timeouts (s);
|
||||||
|
|
||||||
|
// FIXME: use a normal quit message
|
||||||
|
if (irc_is_connected (s))
|
||||||
|
irc_send (s, "QUIT :Terminated by signal");
|
||||||
|
initiate_quit (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_winch_received)
|
||||||
|
{
|
||||||
|
input_on_terminal_resized (&ctx->input);
|
||||||
|
update_screen_size ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_tty_readable (const struct pollfd *fd, struct app_context *ctx)
|
||||||
|
{
|
||||||
|
(void) ctx;
|
||||||
|
|
||||||
|
if (fd->revents & ~(POLLIN | POLLHUP | POLLERR))
|
||||||
|
print_debug ("fd %d: unexpected revents: %d", fd->fd, fd->revents);
|
||||||
|
|
||||||
|
// XXX: this may loop for a bit: stop the event or eat the input?
|
||||||
|
// (This prevents a segfault when the input has been stopped.)
|
||||||
|
if (ctx->input.active)
|
||||||
|
input_on_readable (&ctx->input);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_poller_events (struct app_context *ctx)
|
init_poller_events (struct app_context *ctx)
|
||||||
|
@ -5979,17 +5977,19 @@ init_poller_events (struct app_context *ctx)
|
||||||
poller_fd_set (&ctx->tty_event, POLLIN);
|
poller_fd_set (&ctx->tty_event, POLLIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Main program ------------------------------------------------------------
|
||||||
|
|
||||||
static void
|
static void
|
||||||
display_logo (void)
|
display_logo (void)
|
||||||
{
|
{
|
||||||
const char *logo =
|
const char *logo =
|
||||||
" __ __ \n"
|
" __ __ \n"
|
||||||
" __/ / ____ ____ ____ ____ ____ / /_ \n"
|
" __/ / ____ ____ ____ ____ ____ / /_ \n"
|
||||||
" / / / , / / / / , / / __/ / __/ / __ \\ \n"
|
" / / / , / / / / , / / __/ / __/ / __ \\ \n"
|
||||||
" / / / / __/ / / / / __/ /_ / / /_ / / / / \n"
|
" / / / / __/ / / / / __/ /_ / / /_ / / / / \n"
|
||||||
" /___/ /___/ /_ / /___/ /___/ /___/ /_/ /_/ \n"
|
" /___/ /___/ /_ / /___/ /___/ /___/ /_/ /_/ \n"
|
||||||
" /___/ \n"
|
" /___/ \n"
|
||||||
" ";
|
" ";
|
||||||
|
|
||||||
struct str_vector v;
|
struct str_vector v;
|
||||||
str_vector_init (&v);
|
str_vector_init (&v);
|
||||||
|
|
Loading…
Reference in New Issue