root/usr.bin/mg/spawn.c
/*      $OpenBSD: spawn.c,v 1.13 2023/03/08 04:43:11 guenther Exp $     */

/* This file is in the public domain. */

/*
 * Spawn.  Actually just suspends Mg.
 * Assumes POSIX job control.
 */

#include <sys/queue.h>
#include <signal.h>
#include <stdio.h>
#include <term.h>
#include <termios.h>

#include "def.h"

/*
 * This causes mg to send itself a stop signal.  It assumes the parent
 * shell supports POSIX job control.  If the terminal supports an alternate
 * screen, we will switch to it.
 */
int
spawncli(int f, int n)
{
        sigset_t        oset;

        /* Very similar to what vttidy() does. */
        ttcolor(CTEXT);
        ttnowindow();
        ttmove(nrow - 1, 0);
        if (epresf != FALSE) {
                tteeol();
                epresf = FALSE;
        }
        if (ttcooked() == FALSE)
                return (FALSE);

        /* Exit application mode and tidy. */
        tttidy();
        ttflush();
        (void)sigprocmask(SIG_SETMASK, NULL, &oset);
        (void)kill(0, SIGTSTP);
        (void)sigprocmask(SIG_SETMASK, &oset, NULL);
        ttreinit();

        /* Force repaint. */
        sgarbf = TRUE;
        return (ttraw());
}