1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 static char sccsid[] = "@(#)init_disp.c 5.1 (Berkeley) 06/06/85"; 9 #endif not lint 10 11 /* 12 * Initialization code for the display package, 13 * as well as the signal handling routines. 14 */ 15 16 #include "talk.h" 17 #include <signal.h> 18 19 /* 20 * Set up curses, catch the appropriate signals, 21 * and build the various windows. 22 */ 23 init_display() 24 { 25 void sig_sent(); 26 struct sigvec sigv; 27 28 initscr(); 29 (void) sigvec(SIGTSTP, (struct sigvec *)0, &sigv); 30 sigv.sv_mask |= sigmask(SIGALRM); 31 (void) sigvec(SIGTSTP, &sigv, (struct sigvec *)0); 32 curses_initialized = 1; 33 clear(); 34 refresh(); 35 noecho(); 36 crmode(); 37 signal(SIGINT, sig_sent); 38 signal(SIGPIPE, sig_sent); 39 /* curses takes care of ^Z */ 40 my_win.x_nlines = LINES / 2; 41 my_win.x_ncols = COLS; 42 my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0); 43 scrollok(my_win.x_win, FALSE); 44 wclear(my_win.x_win); 45 46 his_win.x_nlines = LINES / 2 - 1; 47 his_win.x_ncols = COLS; 48 his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols, 49 my_win.x_nlines+1, 0); 50 scrollok(his_win.x_win, FALSE); 51 wclear(his_win.x_win); 52 53 line_win = newwin(1, COLS, my_win.x_nlines, 0); 54 box(line_win, '-', '-'); 55 wrefresh(line_win); 56 /* let them know we are working on it */ 57 current_state = "No connection yet"; 58 } 59 60 /* 61 * Trade edit characters with the other talk. By agreement 62 * the first three characters each talk transmits after 63 * connection are the three edit characters. 64 */ 65 set_edit_chars() 66 { 67 char buf[3]; 68 int cc; 69 struct sgttyb tty; 70 struct ltchars ltc; 71 72 ioctl(0, TIOCGETP, &tty); 73 ioctl(0, TIOCGLTC, (struct sgttyb *)<c); 74 my_win.cerase = tty.sg_erase; 75 my_win.kill = tty.sg_kill; 76 if (ltc.t_werasc == (char) -1) 77 my_win.werase = '\027'; /* control W */ 78 else 79 my_win.werase = ltc.t_werasc; 80 buf[0] = my_win.cerase; 81 buf[1] = my_win.kill; 82 buf[2] = my_win.werase; 83 cc = write(sockt, buf, sizeof(buf)); 84 if (cc != sizeof(buf) ) 85 p_error("Lost the connection"); 86 cc = read(sockt, buf, sizeof(buf)); 87 if (cc != sizeof(buf) ) 88 p_error("Lost the connection"); 89 his_win.cerase = buf[0]; 90 his_win.kill = buf[1]; 91 his_win.werase = buf[2]; 92 } 93 94 void 95 sig_sent() 96 { 97 98 message("Connection closing. Exiting"); 99 quit(); 100 } 101 102 /* 103 * All done talking...hang up the phone and reset terminal thingy's 104 */ 105 quit() 106 { 107 108 if (curses_initialized) { 109 wmove(his_win.x_win, his_win.x_nlines-1, 0); 110 wclrtoeol(his_win.x_win); 111 wrefresh(his_win.x_win); 112 endwin(); 113 } 114 if (invitation_waiting) 115 send_delete(); 116 exit(0); 117 } 118