1 1.12 joerg /* $NetBSD: init_disp.c,v 1.12 2011/09/06 18:32:03 joerg Exp $ */ 2 1.6 jtc 3 1.1 cgd /* 4 1.6 jtc * Copyright (c) 1983, 1993 5 1.6 jtc * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.11 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.7 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.6 jtc #if 0 35 1.6 jtc static char sccsid[] = "@(#)init_disp.c 8.2 (Berkeley) 2/16/94"; 36 1.6 jtc #endif 37 1.12 joerg __RCSID("$NetBSD: init_disp.c,v 1.12 2011/09/06 18:32:03 joerg Exp $"); 38 1.1 cgd #endif /* not lint */ 39 1.1 cgd 40 1.1 cgd /* 41 1.1 cgd * Initialization code for the display package, 42 1.1 cgd * as well as the signal handling routines. 43 1.1 cgd */ 44 1.1 cgd 45 1.7 lukem #include "talk.h" 46 1.6 jtc #include <sys/ioctl.h> 47 1.6 jtc #include <sys/ioctl_compat.h> 48 1.7 lukem #include <err.h> 49 1.7 lukem #include <signal.h> 50 1.6 jtc #include <termios.h> 51 1.9 matt #include <stdlib.h> 52 1.7 lukem #include <unistd.h> 53 1.1 cgd 54 1.1 cgd /* 55 1.1 cgd * Set up curses, catch the appropriate signals, 56 1.1 cgd * and build the various windows. 57 1.1 cgd */ 58 1.7 lukem void 59 1.12 joerg init_display(void) 60 1.1 cgd { 61 1.8 christos struct sigaction sa; 62 1.1 cgd 63 1.6 jtc if (initscr() == NULL) 64 1.6 jtc errx(1, "Terminal type unset or lacking necessary features."); 65 1.8 christos (void)sigaction(SIGTSTP, NULL, &sa); 66 1.8 christos sigaddset(&sa.sa_mask, SIGALRM); 67 1.8 christos (void)sigaction(SIGTSTP, &sa, NULL); 68 1.1 cgd curses_initialized = 1; 69 1.1 cgd clear(); 70 1.1 cgd refresh(); 71 1.1 cgd noecho(); 72 1.10 blymn cbreak(); 73 1.1 cgd signal(SIGINT, sig_sent); 74 1.1 cgd signal(SIGPIPE, sig_sent); 75 1.1 cgd /* curses takes care of ^Z */ 76 1.1 cgd my_win.x_nlines = LINES / 2; 77 1.1 cgd my_win.x_ncols = COLS; 78 1.1 cgd my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0); 79 1.1 cgd scrollok(my_win.x_win, FALSE); 80 1.1 cgd wclear(my_win.x_win); 81 1.1 cgd 82 1.1 cgd his_win.x_nlines = LINES / 2 - 1; 83 1.1 cgd his_win.x_ncols = COLS; 84 1.1 cgd his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols, 85 1.1 cgd my_win.x_nlines+1, 0); 86 1.1 cgd scrollok(his_win.x_win, FALSE); 87 1.1 cgd wclear(his_win.x_win); 88 1.1 cgd 89 1.1 cgd line_win = newwin(1, COLS, my_win.x_nlines, 0); 90 1.1 cgd box(line_win, '-', '-'); 91 1.1 cgd wrefresh(line_win); 92 1.1 cgd /* let them know we are working on it */ 93 1.1 cgd current_state = "No connection yet"; 94 1.1 cgd } 95 1.1 cgd 96 1.1 cgd /* 97 1.1 cgd * Trade edit characters with the other talk. By agreement 98 1.1 cgd * the first three characters each talk transmits after 99 1.1 cgd * connection are the three edit characters. 100 1.1 cgd */ 101 1.7 lukem void 102 1.12 joerg set_edit_chars(void) 103 1.1 cgd { 104 1.1 cgd char buf[3]; 105 1.1 cgd int cc; 106 1.3 mycroft struct termios tty; 107 1.1 cgd 108 1.3 mycroft tcgetattr(0, &tty); 109 1.3 mycroft my_win.cerase = tty.c_cc[VERASE]; 110 1.3 mycroft my_win.kill = tty.c_cc[VKILL]; 111 1.5 cgd if (tty.c_cc[VWERASE] == (unsigned char) -1) 112 1.1 cgd my_win.werase = '\027'; /* control W */ 113 1.1 cgd else 114 1.3 mycroft my_win.werase = tty.c_cc[VWERASE]; 115 1.1 cgd buf[0] = my_win.cerase; 116 1.1 cgd buf[1] = my_win.kill; 117 1.1 cgd buf[2] = my_win.werase; 118 1.1 cgd cc = write(sockt, buf, sizeof(buf)); 119 1.1 cgd if (cc != sizeof(buf) ) 120 1.1 cgd p_error("Lost the connection"); 121 1.1 cgd cc = read(sockt, buf, sizeof(buf)); 122 1.1 cgd if (cc != sizeof(buf) ) 123 1.1 cgd p_error("Lost the connection"); 124 1.1 cgd his_win.cerase = buf[0]; 125 1.1 cgd his_win.kill = buf[1]; 126 1.1 cgd his_win.werase = buf[2]; 127 1.1 cgd } 128 1.1 cgd 129 1.1 cgd void 130 1.12 joerg sig_sent(int dummy) 131 1.1 cgd { 132 1.1 cgd 133 1.1 cgd message("Connection closing. Exiting"); 134 1.1 cgd quit(); 135 1.1 cgd } 136 1.1 cgd 137 1.1 cgd /* 138 1.1 cgd * All done talking...hang up the phone and reset terminal thingy's 139 1.1 cgd */ 140 1.7 lukem void 141 1.12 joerg quit(void) 142 1.1 cgd { 143 1.1 cgd 144 1.1 cgd if (curses_initialized) { 145 1.1 cgd wmove(his_win.x_win, his_win.x_nlines-1, 0); 146 1.1 cgd wclrtoeol(his_win.x_win); 147 1.1 cgd wrefresh(his_win.x_win); 148 1.1 cgd endwin(); 149 1.1 cgd } 150 1.1 cgd if (invitation_waiting) 151 1.1 cgd send_delete(); 152 1.1 cgd exit(0); 153 1.1 cgd } 154