1 |
|
|
/* $OpenBSD: spawn.c,v 1.12 2015/03/19 21:22:15 bcallah Exp $ */ |
2 |
|
|
|
3 |
|
|
/* This file is in the public domain. */ |
4 |
|
|
|
5 |
|
|
/* |
6 |
|
|
* Spawn. Actually just suspends Mg. |
7 |
|
|
* Assumes POSIX job control. |
8 |
|
|
*/ |
9 |
|
|
|
10 |
|
|
#include <sys/queue.h> |
11 |
|
|
#include <signal.h> |
12 |
|
|
#include <stdio.h> |
13 |
|
|
#include <term.h> |
14 |
|
|
#include <termios.h> |
15 |
|
|
|
16 |
|
|
#include "def.h" |
17 |
|
|
|
18 |
|
|
/* |
19 |
|
|
* This causes mg to send itself a stop signal. It assumes the parent |
20 |
|
|
* shell supports POSIX job control. If the terminal supports an alternate |
21 |
|
|
* screen, we will switch to it. |
22 |
|
|
*/ |
23 |
|
|
/* ARGSUSED */ |
24 |
|
|
int |
25 |
|
|
spawncli(int f, int n) |
26 |
|
|
{ |
27 |
|
|
sigset_t oset; |
28 |
|
|
|
29 |
|
|
/* Very similar to what vttidy() does. */ |
30 |
|
|
ttcolor(CTEXT); |
31 |
|
|
ttnowindow(); |
32 |
|
|
ttmove(nrow - 1, 0); |
33 |
|
|
if (epresf != FALSE) { |
34 |
|
|
tteeol(); |
35 |
|
|
epresf = FALSE; |
36 |
|
|
} |
37 |
|
|
if (ttcooked() == FALSE) |
38 |
|
|
return (FALSE); |
39 |
|
|
|
40 |
|
|
/* Exit application mode and tidy. */ |
41 |
|
|
tttidy(); |
42 |
|
|
ttflush(); |
43 |
|
|
(void)sigprocmask(SIG_SETMASK, NULL, &oset); |
44 |
|
|
(void)kill(0, SIGTSTP); |
45 |
|
|
(void)sigprocmask(SIG_SETMASK, &oset, NULL); |
46 |
|
|
ttreinit(); |
47 |
|
|
|
48 |
|
|
/* Force repaint. */ |
49 |
|
|
sgarbf = TRUE; |
50 |
|
|
return (ttraw()); |
51 |
|
|
} |