login

#include "seqt.h"

#include <string.h>
#include <signal.h>

#define get_terminal_size(TS)   ioctl(0, TIOCGWINSZ, (TS))

#ifndef SIGWINCH
#define SIGWINCH  28
#endif

volatile sig_atomic_t pending_winch;

void
handle_winch(int sig)
{
    (void) sig;
    pending_winch = 1;
}

void
setup_terminal(struct termios *term_prev, struct winsize *term_size)
{
    struct termios term_raw;
    struct sigaction sa;

    /* setup signal handler */
    memset(&sa, 0, sizeof (struct sigaction));
    sa.sa_handler = handle_winch;
    sigaction(SIGWINCH, &sa, NULL);
    /* enter alternate screen buffer */
    printf("\x1B[?47h");
    /* disable echo and canonical mode */
    tcgetattr(0, term_prev);
    term_raw = *term_prev;
    term_raw.c_lflag &= ~(ECHO | ICANON);
    /* blocking read */
    term_raw.c_cc[VMIN] = 1;
    term_raw.c_cc[VTIME] = 0;
    tcsetattr(0, TCSAFLUSH, &term_raw);
    /* get terminal size */
    get_terminal_size(term_size);
}

void
restore_terminal(struct termios *term_prev)
{
    tcsetattr(0, TCSAFLUSH, term_prev);
    printf("\x1B[?47l");
}