]> git.saurik.com Git - apple/network_cmds.git/blob - talk.tproj/init_disp.c
network_cmds-176.tar.gz
[apple/network_cmds.git] / talk.tproj / init_disp.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 /*
26 * Copyright (c) 1983, 1993
27 * The Regents of the University of California. All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by the University of
40 * California, Berkeley and its contributors.
41 * 4. Neither the name of the University nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58
59 /*
60 * Initialization code for the display package,
61 * as well as the signal handling routines.
62 */
63
64 #include <sys/ioctl.h>
65 #include <sys/ioctl_compat.h>
66
67 #include <signal.h>
68 #include <err.h>
69 #include "talk.h"
70
71 /*
72 * Set up curses, catch the appropriate signals,
73 * and build the various windows.
74 */
75 init_display()
76 {
77 void sig_sent();
78 struct sigvec sigv;
79
80 if (initscr() == NULL)
81 errx(1, "Terminal type unset or lacking necessary features.");
82 (void) sigvec(SIGTSTP, (struct sigvec *)0, &sigv);
83 sigv.sv_mask |= sigmask(SIGALRM);
84 (void) _sigvec_nobind(SIGTSTP, &sigv, (struct sigvec *)0);
85 curses_initialized = 1;
86 clear();
87 refresh();
88 noecho();
89 crmode();
90 signal(SIGINT, sig_sent);
91 signal(SIGPIPE, sig_sent);
92 /* curses takes care of ^Z */
93 my_win.x_nlines = LINES / 2;
94 my_win.x_ncols = COLS;
95 my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0);
96 scrollok(my_win.x_win, FALSE);
97 wclear(my_win.x_win);
98
99 his_win.x_nlines = LINES / 2 - 1;
100 his_win.x_ncols = COLS;
101 his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols,
102 my_win.x_nlines+1, 0);
103 scrollok(his_win.x_win, FALSE);
104 wclear(his_win.x_win);
105
106 line_win = newwin(1, COLS, my_win.x_nlines, 0);
107 box(line_win, '-', '-');
108 wrefresh(line_win);
109 /* let them know we are working on it */
110 current_state = "No connection yet";
111 }
112
113 /*
114 * Trade edit characters with the other talk. By agreement
115 * the first three characters each talk transmits after
116 * connection are the three edit characters.
117 */
118 set_edit_chars()
119 {
120 char buf[3];
121 int cc;
122 struct sgttyb tty;
123 struct ltchars ltc;
124
125 ioctl(0, TIOCGETP, &tty);
126 ioctl(0, TIOCGLTC, (struct sgttyb *)&ltc);
127 my_win.cerase = tty.sg_erase;
128 my_win.kill = tty.sg_kill;
129 if (ltc.t_werasc == (char) -1)
130 my_win.werase = '\027'; /* control W */
131 else
132 my_win.werase = ltc.t_werasc;
133 buf[0] = my_win.cerase;
134 buf[1] = my_win.kill;
135 buf[2] = my_win.werase;
136 cc = write(sockt, buf, sizeof(buf));
137 if (cc != sizeof(buf) )
138 p_error("Lost the connection");
139 cc = read(sockt, buf, sizeof(buf));
140 if (cc != sizeof(buf) )
141 p_error("Lost the connection");
142 his_win.cerase = buf[0];
143 his_win.kill = buf[1];
144 his_win.werase = buf[2];
145 }
146
147 void
148 sig_sent()
149 {
150
151 message("Connection closing. Exiting");
152 quit();
153 }
154
155 /*
156 * All done talking...hang up the phone and reset terminal thingy's
157 */
158 quit()
159 {
160
161 if (curses_initialized) {
162 wmove(his_win.x_win, his_win.x_nlines-1, 0);
163 wclrtoeol(his_win.x_win);
164 wrefresh(his_win.x_win);
165 endwin();
166 }
167 if (invitation_waiting)
168 send_delete();
169 exit(0);
170 }