122390Sdist /* 222390Sdist * Copyright (c) 1983 Regents of the University of California. 334373Sbostic * All rights reserved. 434373Sbostic * 5*42770Sbostic * %sccs.include.redist.c% 622390Sdist */ 722390Sdist 816363Skarels #ifndef lint 9*42770Sbostic static char sccsid[] = "@(#)display.c 5.4 (Berkeley) 06/01/90"; 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 */ 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 */ 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); 9016363Skarels continue; 9116363Skarels } 9216363Skarels /* line kill */ 9316363Skarels if (*text == win->kill) { 9416363Skarels wmove(win->x_win, win->x_line, 0); 9516363Skarels wclrtoeol(win->x_win); 9616363Skarels getyx(win->x_win, win->x_line, win->x_col); 9716363Skarels text++; 9816363Skarels continue; 9916363Skarels } 10016363Skarels if (*text == '\f') { 10116363Skarels if (win == &my_win) 10216363Skarels wrefresh(curscr); 10316363Skarels text++; 10416363Skarels continue; 10516363Skarels } 10616363Skarels if (win->x_col == COLS-1) { 10716363Skarels /* check for wraparound */ 10816363Skarels xscroll(win, 0); 10916363Skarels } 11016363Skarels if (*text < ' ' && *text != '\t') { 11116363Skarels waddch(win->x_win, '^'); 11216363Skarels getyx(win->x_win, win->x_line, win->x_col); 11316363Skarels if (win->x_col == COLS-1) /* check for wraparound */ 11416363Skarels xscroll(win, 0); 11516363Skarels cch = (*text & 63) + 64; 11616363Skarels waddch(win->x_win, cch); 11716363Skarels } else 11816363Skarels waddch(win->x_win, *text); 11916363Skarels getyx(win->x_win, win->x_line, win->x_col); 12016363Skarels text++; 12116346Skarels } 12216363Skarels wrefresh(win->x_win); 12316346Skarels } 12416346Skarels 12516346Skarels /* 12616363Skarels * Read the character at the indicated position in win 12716363Skarels */ 12816346Skarels readwin(win, line, col) 12916363Skarels WINDOW *win; 13016346Skarels { 13116363Skarels int oldline, oldcol; 13216363Skarels register int c; 13316346Skarels 13416363Skarels getyx(win, oldline, oldcol); 13516363Skarels wmove(win, line, col); 13616363Skarels c = winch(win); 13716363Skarels wmove(win, oldline, oldcol); 13816363Skarels return (c); 13916346Skarels } 14016346Skarels 14116346Skarels /* 14216363Skarels * Scroll a window, blanking out the line following the current line 14316363Skarels * so that the current position is obvious 14416363Skarels */ 14516346Skarels xscroll(win, flag) 14616363Skarels register xwin_t *win; 14716363Skarels int flag; 14816346Skarels { 14916363Skarels 15016363Skarels if (flag == -1) { 15116363Skarels wmove(win->x_win, 0, 0); 15216363Skarels win->x_line = 0; 15316363Skarels win->x_col = 0; 15416363Skarels return; 15516363Skarels } 15616363Skarels win->x_line = (win->x_line + 1) % win->x_nlines; 15716346Skarels win->x_col = 0; 15816363Skarels wmove(win->x_win, win->x_line, win->x_col); 15916363Skarels wclrtoeol(win->x_win); 16016363Skarels wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); 16116363Skarels wclrtoeol(win->x_win); 16216363Skarels wmove(win->x_win, win->x_line, win->x_col); 16316346Skarels } 164