File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / ucb / talk / init_disp.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:29:26 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

/* $Header: /var/lib/cvsd/repos/cci/cci/usr/src/ucb/talk/init_disp.c,v 1.1.1.1 2019/07/28 12:29:26 root Exp $ */

/*
 * init_disp contains the initialization code for the display package,
 * as well as the signal handling routines
 */

#include "talk.h"
#include <signal.h>

/*
 * Changes:
 *	. add function to verify that the terminal is cursor addressable.
 *	. add function to handle QUIT signal.
 *
 */
/* 
 * set up curses, catch the appropriate signals, and build the
 * various windows
 */

init_display()
{
    void sig_sent();

    checkcrt();			/* check if terminal is cursor addressable */
    initscr();
    curses_initialized = 1;

    clear();
    refresh();

    noecho();
    crmode();

    signal(SIGINT, sig_sent);
    signal(SIGQUIT, sig_sent);
    signal(SIGPIPE, sig_sent);

	/* curses takes care of ^Z */

    my_win.x_nlines = LINES / 2;
    my_win.x_ncols = COLS;
    my_win.x_win = newwin(my_win.x_nlines, my_win.x_ncols, 0, 0);
    scrollok(my_win.x_win, FALSE);
    wclear(my_win.x_win);

    his_win.x_nlines = LINES / 2 - 1;
    his_win.x_ncols = COLS;
    his_win.x_win = newwin(his_win.x_nlines, his_win.x_ncols,
					     my_win.x_nlines+1, 0);
    scrollok(his_win.x_win, FALSE);
    wclear(his_win.x_win);

    line_win = newwin(1, COLS, my_win.x_nlines, 0);
    box(line_win, '-', '-');
    wrefresh(line_win);

	/* let them know we are working on it */

    current_state = "No connection yet";
}

    /* trade edit characters with the other talk. By agreement
     * the first three characters each talk transmits after
     * connection are the three edit characters
     */

set_edit_chars()
{
    char buf[3];
    int cc;
    struct sgttyb tty;
    struct ltchars ltc;
    
    gtty(0, &tty);

    ioctl(0, TIOCGLTC, (struct sgttyb *) &ltc);
	
    my_win.cerase = tty.sg_erase;
    my_win.kill = tty.sg_kill;

    if (ltc.t_werasc == (char) -1) {
	my_win.werase = '\027';	 /* control W */
    } else {
	my_win.werase = ltc.t_werasc;
    }

    buf[0] = my_win.cerase;
    buf[1] = my_win.kill;
    buf[2] = my_win.werase;

    cc = write(sockt, buf, sizeof(buf));

    if (cc != sizeof(buf) ) {
	p_error("Lost the connection");
    }

    cc = read(sockt, buf, sizeof(buf));

    if (cc != sizeof(buf) ) {
	p_error("Lost the connection");
    }

    his_win.cerase = buf[0];
    his_win.kill = buf[1];
    his_win.werase = buf[2];
}

void sig_sent()
{
    message("Connection closing. Exiting");
    quit();
}

/*
 * All done talking...hang up the phone and reset terminal thingy's
 */

quit()
{
	if (curses_initialized) {
	    wmove(his_win.x_win, his_win.x_nlines-1, 0);
	    wclrtoeol(his_win.x_win);
	    wrefresh(his_win.x_win);
	    endwin();
	}

	if (invitation_waiting) {
	    send_delete();
	}

	exit(0);
}
/*------------------------------------------------------------
  checkcrt
	verify if the terminal is cursor addressable
  ----------------------------------------------------------*/
char	*CM;
char	*getenv(); 
char	*tgetstr();
checkcrt(){
	char	*termname;
	char	*x; 
	char	*y;
	char	cm[1024];
	char	buf[1024];

	if ((termname = getenv("TERM")) == (char *)0) {
		printf("talk:terminal type not defined.\n");
		exit(2);
	}
	switch (tgetent(buf, termname)) {
	case -1:
		printf("talk:cannot open termcap file.\n");
		exit(3);
	case 0:
		printf("talk:terminal type not defined in termcap file.\n");
		exit(4);
	}

	x = cm;
	CM = tgetstr("cm",&x);
	if (!CM || *CM==0) {
		printf("talk: terminal must have addressable cursor.\n");
		exit(5);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.