Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /* |
2 | * Copyright (c) 1983 Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by the University of | |
16 | * California, Berkeley and its contributors. | |
17 | * 4. Neither the name of the University nor the names of its contributors | |
18 | * may be used to endorse or promote products derived from this software | |
19 | * without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
32 | */ | |
33 | ||
34 | #ifndef lint | |
35 | static char sccsid[] = "@(#)init_disp.c 5.4 (Berkeley) 6/1/90"; | |
36 | #endif /* not lint */ | |
37 | ||
38 | /* | |
39 | * Initialization code for the display package, | |
40 | * as well as the signal handling routines. | |
41 | */ | |
42 | ||
43 | #include "talk.h" | |
44 | #include <signal.h> | |
45 | ||
46 | /* | |
47 | * Set up curses, catch the appropriate signals, | |
48 | * and build the various windows. | |
49 | */ | |
50 | init_display() | |
51 | { | |
52 | void sig_sent(); | |
53 | struct sigvec sigv; | |
54 | ||
960b7e5d JH |
55 | if (!initscr()) { |
56 | fprintf(stderr, "Couldn't initialize terminal. Is TERM set?\n"); | |
57 | exit(1); | |
58 | } | |
15637ed4 RG |
59 | (void) sigvec(SIGTSTP, (struct sigvec *)0, &sigv); |
60 | sigv.sv_mask |= sigmask(SIGALRM); | |
61 | (void) sigvec(SIGTSTP, &sigv, (struct sigvec *)0); | |
62 | curses_initialized = 1; | |
63 | clear(); | |
64 | refresh(); | |
65 | noecho(); | |
66 | crmode(); | |
67 | signal(SIGINT, sig_sent); | |
68 | signal(SIGPIPE, sig_sent); | |
69 | /* curses takes care of ^Z */ | |
70 | my_win.x_nlines = LINES / 2; | |
71 | my_win.x_ncols = COLS; | |
72 | my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0); | |
81da3e44 | 73 | scrollok(my_win.x_win, TRUE); |
15637ed4 RG |
74 | wclear(my_win.x_win); |
75 | ||
76 | his_win.x_nlines = LINES / 2 - 1; | |
77 | his_win.x_ncols = COLS; | |
78 | his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols, | |
79 | my_win.x_nlines+1, 0); | |
81da3e44 | 80 | scrollok(his_win.x_win, TRUE); |
15637ed4 RG |
81 | wclear(his_win.x_win); |
82 | ||
83 | line_win = newwin(1, COLS, my_win.x_nlines, 0); | |
84 | box(line_win, '-', '-'); | |
85 | wrefresh(line_win); | |
86 | /* let them know we are working on it */ | |
87 | current_state = "No connection yet"; | |
88 | } | |
89 | ||
90 | /* | |
91 | * Trade edit characters with the other talk. By agreement | |
92 | * the first three characters each talk transmits after | |
93 | * connection are the three edit characters. | |
94 | */ | |
95 | set_edit_chars() | |
96 | { | |
97 | char buf[3]; | |
98 | int cc; | |
99 | struct sgttyb tty; | |
100 | struct ltchars ltc; | |
101 | ||
102 | ioctl(0, TIOCGETP, &tty); | |
103 | ioctl(0, TIOCGLTC, (struct sgttyb *)<c); | |
104 | my_win.cerase = tty.sg_erase; | |
105 | my_win.kill = tty.sg_kill; | |
106 | if (ltc.t_werasc == (char) -1) | |
107 | my_win.werase = '\027'; /* control W */ | |
108 | else | |
109 | my_win.werase = ltc.t_werasc; | |
110 | buf[0] = my_win.cerase; | |
111 | buf[1] = my_win.kill; | |
112 | buf[2] = my_win.werase; | |
113 | cc = write(sockt, buf, sizeof(buf)); | |
114 | if (cc != sizeof(buf) ) | |
115 | p_error("Lost the connection"); | |
116 | cc = read(sockt, buf, sizeof(buf)); | |
117 | if (cc != sizeof(buf) ) | |
118 | p_error("Lost the connection"); | |
119 | his_win.cerase = buf[0]; | |
120 | his_win.kill = buf[1]; | |
121 | his_win.werase = buf[2]; | |
122 | } | |
123 | ||
124 | void | |
125 | sig_sent() | |
126 | { | |
127 | ||
128 | message("Connection closing. Exiting"); | |
129 | quit(); | |
130 | } | |
131 | ||
132 | /* | |
133 | * All done talking...hang up the phone and reset terminal thingy's | |
134 | */ | |
135 | quit() | |
136 | { | |
137 | ||
138 | if (curses_initialized) { | |
139 | wmove(his_win.x_win, his_win.x_nlines-1, 0); | |
140 | wclrtoeol(his_win.x_win); | |
141 | wrefresh(his_win.x_win); | |
142 | endwin(); | |
143 | } | |
144 | if (invitation_waiting) | |
145 | send_delete(); | |
146 | exit(0); | |
147 | } |