1*22390Sdist /* 2*22390Sdist * Copyright (c) 1983 Regents of the University of California. 3*22390Sdist * All rights reserved. The Berkeley software License Agreement 4*22390Sdist * specifies the terms and conditions for redistribution. 5*22390Sdist */ 6*22390Sdist 716363Skarels #ifndef lint 8*22390Sdist static char sccsid[] = "@(#)display.c 5.1 (Berkeley) 06/06/85"; 9*22390Sdist #endif not lint 1016346Skarels 1116363Skarels /* 1216363Skarels * The window 'manager', initializes curses and handles the actual 1316346Skarels * displaying of text 1416346Skarels */ 1516346Skarels #include "talk.h" 1616346Skarels 1716363Skarels xwin_t my_win; 1816363Skarels xwin_t his_win; 1916363Skarels WINDOW *line_win; 2016346Skarels 2116363Skarels int curses_initialized = 0; 2216346Skarels 2316363Skarels /* 2416363Skarels * max HAS to be a function, it is called with 2516363Skarels * a argument of the form --foo at least once. 2616363Skarels */ 2716346Skarels max(a,b) 2816363Skarels int a, b; 2916346Skarels { 3016363Skarels 3116363Skarels return (a > b ? a : b); 3216346Skarels } 3316346Skarels 3416346Skarels /* 3516346Skarels * Display some text on somebody's window, processing some control 3616346Skarels * characters while we are at it. 3716346Skarels */ 3816346Skarels display(win, text, size) 3916363Skarels register xwin_t *win; 4016363Skarels register char *text; 4116363Skarels int size; 4216346Skarels { 4316363Skarels register int i; 4416363Skarels char cch; 4516346Skarels 4616363Skarels for (i = 0; i < size; i++) { 4716363Skarels if (*text == '\n') { 4816363Skarels xscroll(win, 0); 4916363Skarels text++; 5016363Skarels continue; 5116363Skarels } 5216363Skarels /* erase character */ 5316363Skarels if (*text == win->cerase) { 5416363Skarels wmove(win->x_win, win->x_line, max(--win->x_col, 0)); 5516363Skarels getyx(win->x_win, win->x_line, win->x_col); 5616363Skarels waddch(win->x_win, ' '); 5716363Skarels wmove(win->x_win, win->x_line, win->x_col); 5816363Skarels getyx(win->x_win, win->x_line, win->x_col); 5916363Skarels text++; 6016363Skarels continue; 6116363Skarels } 6216363Skarels /* 6316363Skarels * On word erase search backwards until we find 6416363Skarels * the beginning of a word or the beginning of 6516363Skarels * the line. 6616363Skarels */ 6716363Skarels if (*text == win->werase) { 6816363Skarels int endcol, xcol, i, c; 6916346Skarels 7016363Skarels endcol = win->x_col; 7116363Skarels xcol = endcol - 1; 7216363Skarels while (xcol >= 0) { 7316363Skarels c = readwin(win->x_win, win->x_line, xcol); 7416363Skarels if (c != ' ') 7516363Skarels break; 7616363Skarels xcol--; 7716363Skarels } 7816363Skarels while (xcol >= 0) { 7916363Skarels c = readwin(win->x_win, win->x_line, xcol); 8016363Skarels if (c == ' ') 8116363Skarels break; 8216363Skarels xcol--; 8316363Skarels } 8416363Skarels wmove(win->x_win, win->x_line, xcol + 1); 8516363Skarels for (i = xcol + 1; i < endcol; i++) 8616363Skarels waddch(win->x_win, ' '); 8716363Skarels wmove(win->x_win, win->x_line, xcol + 1); 8816363Skarels getyx(win->x_win, win->x_line, win->x_col); 8916363Skarels continue; 9016363Skarels } 9116363Skarels /* line kill */ 9216363Skarels if (*text == win->kill) { 9316363Skarels wmove(win->x_win, win->x_line, 0); 9416363Skarels wclrtoeol(win->x_win); 9516363Skarels getyx(win->x_win, win->x_line, win->x_col); 9616363Skarels text++; 9716363Skarels continue; 9816363Skarels } 9916363Skarels if (*text == '\f') { 10016363Skarels if (win == &my_win) 10116363Skarels wrefresh(curscr); 10216363Skarels text++; 10316363Skarels continue; 10416363Skarels } 10516363Skarels if (win->x_col == COLS-1) { 10616363Skarels /* check for wraparound */ 10716363Skarels xscroll(win, 0); 10816363Skarels } 10916363Skarels if (*text < ' ' && *text != '\t') { 11016363Skarels waddch(win->x_win, '^'); 11116363Skarels getyx(win->x_win, win->x_line, win->x_col); 11216363Skarels if (win->x_col == COLS-1) /* check for wraparound */ 11316363Skarels xscroll(win, 0); 11416363Skarels cch = (*text & 63) + 64; 11516363Skarels waddch(win->x_win, cch); 11616363Skarels } else 11716363Skarels waddch(win->x_win, *text); 11816363Skarels getyx(win->x_win, win->x_line, win->x_col); 11916363Skarels text++; 12016346Skarels } 12116363Skarels wrefresh(win->x_win); 12216346Skarels } 12316346Skarels 12416346Skarels /* 12516363Skarels * Read the character at the indicated position in win 12616363Skarels */ 12716346Skarels readwin(win, line, col) 12816363Skarels WINDOW *win; 12916346Skarels { 13016363Skarels int oldline, oldcol; 13116363Skarels register int c; 13216346Skarels 13316363Skarels getyx(win, oldline, oldcol); 13416363Skarels wmove(win, line, col); 13516363Skarels c = winch(win); 13616363Skarels wmove(win, oldline, oldcol); 13716363Skarels return (c); 13816346Skarels } 13916346Skarels 14016346Skarels /* 14116363Skarels * Scroll a window, blanking out the line following the current line 14216363Skarels * so that the current position is obvious 14316363Skarels */ 14416346Skarels xscroll(win, flag) 14516363Skarels register xwin_t *win; 14616363Skarels int flag; 14716346Skarels { 14816363Skarels 14916363Skarels if (flag == -1) { 15016363Skarels wmove(win->x_win, 0, 0); 15116363Skarels win->x_line = 0; 15216363Skarels win->x_col = 0; 15316363Skarels return; 15416363Skarels } 15516363Skarels win->x_line = (win->x_line + 1) % win->x_nlines; 15616346Skarels win->x_col = 0; 15716363Skarels wmove(win->x_win, win->x_line, win->x_col); 15816363Skarels wclrtoeol(win->x_win); 15916363Skarels wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); 16016363Skarels wclrtoeol(win->x_win); 16116363Skarels wmove(win->x_win, win->x_line, win->x_col); 16216346Skarels } 163