122390Sdist /*
2*62301Sbostic * Copyright (c) 1983, 1993
3*62301Sbostic * The Regents of the University of California. All rights reserved.
434373Sbostic *
542770Sbostic * %sccs.include.redist.c%
622390Sdist */
722390Sdist
816363Skarels #ifndef lint
9*62301Sbostic static char sccsid[] = "@(#)display.c 8.1 (Berkeley) 06/06/93";
1034373Sbostic #endif /* not lint */
1116346Skarels
1216363Skarels /*
1316363Skarels * The window 'manager', initializes curses and handles the actual
1416346Skarels * displaying of text
1516346Skarels */
1616346Skarels #include "talk.h"
1716346Skarels
1816363Skarels xwin_t my_win;
1916363Skarels xwin_t his_win;
2016363Skarels WINDOW *line_win;
2116346Skarels
2216363Skarels int curses_initialized = 0;
2316346Skarels
2416363Skarels /*
2516363Skarels * max HAS to be a function, it is called with
2616363Skarels * a argument of the form --foo at least once.
2716363Skarels */
max(a,b)2816346Skarels max(a,b)
2916363Skarels int a, b;
3016346Skarels {
3116363Skarels
3216363Skarels return (a > b ? a : b);
3316346Skarels }
3416346Skarels
3516346Skarels /*
3616346Skarels * Display some text on somebody's window, processing some control
3716346Skarels * characters while we are at it.
3816346Skarels */
display(win,text,size)3916346Skarels display(win, text, size)
4016363Skarels register xwin_t *win;
4116363Skarels register char *text;
4216363Skarels int size;
4316346Skarels {
4416363Skarels register int i;
4516363Skarels char cch;
4616346Skarels
4716363Skarels for (i = 0; i < size; i++) {
4816363Skarels if (*text == '\n') {
4916363Skarels xscroll(win, 0);
5016363Skarels text++;
5116363Skarels continue;
5216363Skarels }
5316363Skarels /* erase character */
5416363Skarels if (*text == win->cerase) {
5516363Skarels wmove(win->x_win, win->x_line, max(--win->x_col, 0));
5616363Skarels getyx(win->x_win, win->x_line, win->x_col);
5716363Skarels waddch(win->x_win, ' ');
5816363Skarels wmove(win->x_win, win->x_line, win->x_col);
5916363Skarels getyx(win->x_win, win->x_line, win->x_col);
6016363Skarels text++;
6116363Skarels continue;
6216363Skarels }
6316363Skarels /*
6416363Skarels * On word erase search backwards until we find
6516363Skarels * the beginning of a word or the beginning of
6616363Skarels * the line.
6716363Skarels */
6816363Skarels if (*text == win->werase) {
6916363Skarels int endcol, xcol, i, c;
7016346Skarels
7116363Skarels endcol = win->x_col;
7216363Skarels xcol = endcol - 1;
7316363Skarels while (xcol >= 0) {
7416363Skarels c = readwin(win->x_win, win->x_line, xcol);
7516363Skarels if (c != ' ')
7616363Skarels break;
7716363Skarels xcol--;
7816363Skarels }
7916363Skarels while (xcol >= 0) {
8016363Skarels c = readwin(win->x_win, win->x_line, xcol);
8116363Skarels if (c == ' ')
8216363Skarels break;
8316363Skarels xcol--;
8416363Skarels }
8516363Skarels wmove(win->x_win, win->x_line, xcol + 1);
8616363Skarels for (i = xcol + 1; i < endcol; i++)
8716363Skarels waddch(win->x_win, ' ');
8816363Skarels wmove(win->x_win, win->x_line, xcol + 1);
8916363Skarels getyx(win->x_win, win->x_line, win->x_col);
9051583Sbostic text++;
9116363Skarels continue;
9216363Skarels }
9316363Skarels /* line kill */
9416363Skarels if (*text == win->kill) {
9516363Skarels wmove(win->x_win, win->x_line, 0);
9616363Skarels wclrtoeol(win->x_win);
9716363Skarels getyx(win->x_win, win->x_line, win->x_col);
9816363Skarels text++;
9916363Skarels continue;
10016363Skarels }
10116363Skarels if (*text == '\f') {
10216363Skarels if (win == &my_win)
10316363Skarels wrefresh(curscr);
10416363Skarels text++;
10516363Skarels continue;
10616363Skarels }
10716363Skarels if (win->x_col == COLS-1) {
10816363Skarels /* check for wraparound */
10916363Skarels xscroll(win, 0);
11016363Skarels }
11116363Skarels if (*text < ' ' && *text != '\t') {
11216363Skarels waddch(win->x_win, '^');
11316363Skarels getyx(win->x_win, win->x_line, win->x_col);
11416363Skarels if (win->x_col == COLS-1) /* check for wraparound */
11516363Skarels xscroll(win, 0);
11616363Skarels cch = (*text & 63) + 64;
11716363Skarels waddch(win->x_win, cch);
11816363Skarels } else
11916363Skarels waddch(win->x_win, *text);
12016363Skarels getyx(win->x_win, win->x_line, win->x_col);
12116363Skarels text++;
12216346Skarels }
12316363Skarels wrefresh(win->x_win);
12416346Skarels }
12516346Skarels
12616346Skarels /*
12716363Skarels * Read the character at the indicated position in win
12816363Skarels */
readwin(win,line,col)12916346Skarels readwin(win, line, col)
13016363Skarels WINDOW *win;
13116346Skarels {
13216363Skarels int oldline, oldcol;
13316363Skarels register int c;
13416346Skarels
13516363Skarels getyx(win, oldline, oldcol);
13616363Skarels wmove(win, line, col);
13716363Skarels c = winch(win);
13816363Skarels wmove(win, oldline, oldcol);
13916363Skarels return (c);
14016346Skarels }
14116346Skarels
14216346Skarels /*
14316363Skarels * Scroll a window, blanking out the line following the current line
14416363Skarels * so that the current position is obvious
14516363Skarels */
xscroll(win,flag)14616346Skarels xscroll(win, flag)
14716363Skarels register xwin_t *win;
14816363Skarels int flag;
14916346Skarels {
15016363Skarels
15116363Skarels if (flag == -1) {
15216363Skarels wmove(win->x_win, 0, 0);
15316363Skarels win->x_line = 0;
15416363Skarels win->x_col = 0;
15516363Skarels return;
15616363Skarels }
15716363Skarels win->x_line = (win->x_line + 1) % win->x_nlines;
15816346Skarels win->x_col = 0;
15916363Skarels wmove(win->x_win, win->x_line, win->x_col);
16016363Skarels wclrtoeol(win->x_win);
16116363Skarels wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
16216363Skarels wclrtoeol(win->x_win);
16316363Skarels wmove(win->x_win, win->x_line, win->x_col);
16416346Skarels }
165