122390Sdist /* 222390Sdist * Copyright (c) 1983 Regents of the University of California. 3*34373Sbostic * All rights reserved. 4*34373Sbostic * 5*34373Sbostic * Redistribution and use in source and binary forms are permitted 6*34373Sbostic * provided that this notice is preserved and that due credit is given 7*34373Sbostic * to the University of California at Berkeley. The name of the University 8*34373Sbostic * may not be used to endorse or promote products derived from this 9*34373Sbostic * software without specific prior written permission. This software 10*34373Sbostic * is provided ``as is'' without express or implied warranty. 1122390Sdist */ 1222390Sdist 1316363Skarels #ifndef lint 14*34373Sbostic static char sccsid[] = "@(#)display.c 5.2 (Berkeley) 05/20/88"; 15*34373Sbostic #endif /* not lint */ 1616346Skarels 1716363Skarels /* 1816363Skarels * The window 'manager', initializes curses and handles the actual 1916346Skarels * displaying of text 2016346Skarels */ 2116346Skarels #include "talk.h" 2216346Skarels 2316363Skarels xwin_t my_win; 2416363Skarels xwin_t his_win; 2516363Skarels WINDOW *line_win; 2616346Skarels 2716363Skarels int curses_initialized = 0; 2816346Skarels 2916363Skarels /* 3016363Skarels * max HAS to be a function, it is called with 3116363Skarels * a argument of the form --foo at least once. 3216363Skarels */ 3316346Skarels max(a,b) 3416363Skarels int a, b; 3516346Skarels { 3616363Skarels 3716363Skarels return (a > b ? a : b); 3816346Skarels } 3916346Skarels 4016346Skarels /* 4116346Skarels * Display some text on somebody's window, processing some control 4216346Skarels * characters while we are at it. 4316346Skarels */ 4416346Skarels display(win, text, size) 4516363Skarels register xwin_t *win; 4616363Skarels register char *text; 4716363Skarels int size; 4816346Skarels { 4916363Skarels register int i; 5016363Skarels char cch; 5116346Skarels 5216363Skarels for (i = 0; i < size; i++) { 5316363Skarels if (*text == '\n') { 5416363Skarels xscroll(win, 0); 5516363Skarels text++; 5616363Skarels continue; 5716363Skarels } 5816363Skarels /* erase character */ 5916363Skarels if (*text == win->cerase) { 6016363Skarels wmove(win->x_win, win->x_line, max(--win->x_col, 0)); 6116363Skarels getyx(win->x_win, win->x_line, win->x_col); 6216363Skarels waddch(win->x_win, ' '); 6316363Skarels wmove(win->x_win, win->x_line, win->x_col); 6416363Skarels getyx(win->x_win, win->x_line, win->x_col); 6516363Skarels text++; 6616363Skarels continue; 6716363Skarels } 6816363Skarels /* 6916363Skarels * On word erase search backwards until we find 7016363Skarels * the beginning of a word or the beginning of 7116363Skarels * the line. 7216363Skarels */ 7316363Skarels if (*text == win->werase) { 7416363Skarels int endcol, xcol, i, c; 7516346Skarels 7616363Skarels endcol = win->x_col; 7716363Skarels xcol = endcol - 1; 7816363Skarels while (xcol >= 0) { 7916363Skarels c = readwin(win->x_win, win->x_line, xcol); 8016363Skarels if (c != ' ') 8116363Skarels break; 8216363Skarels xcol--; 8316363Skarels } 8416363Skarels while (xcol >= 0) { 8516363Skarels c = readwin(win->x_win, win->x_line, xcol); 8616363Skarels if (c == ' ') 8716363Skarels break; 8816363Skarels xcol--; 8916363Skarels } 9016363Skarels wmove(win->x_win, win->x_line, xcol + 1); 9116363Skarels for (i = xcol + 1; i < endcol; i++) 9216363Skarels waddch(win->x_win, ' '); 9316363Skarels wmove(win->x_win, win->x_line, xcol + 1); 9416363Skarels getyx(win->x_win, win->x_line, win->x_col); 9516363Skarels continue; 9616363Skarels } 9716363Skarels /* line kill */ 9816363Skarels if (*text == win->kill) { 9916363Skarels wmove(win->x_win, win->x_line, 0); 10016363Skarels wclrtoeol(win->x_win); 10116363Skarels getyx(win->x_win, win->x_line, win->x_col); 10216363Skarels text++; 10316363Skarels continue; 10416363Skarels } 10516363Skarels if (*text == '\f') { 10616363Skarels if (win == &my_win) 10716363Skarels wrefresh(curscr); 10816363Skarels text++; 10916363Skarels continue; 11016363Skarels } 11116363Skarels if (win->x_col == COLS-1) { 11216363Skarels /* check for wraparound */ 11316363Skarels xscroll(win, 0); 11416363Skarels } 11516363Skarels if (*text < ' ' && *text != '\t') { 11616363Skarels waddch(win->x_win, '^'); 11716363Skarels getyx(win->x_win, win->x_line, win->x_col); 11816363Skarels if (win->x_col == COLS-1) /* check for wraparound */ 11916363Skarels xscroll(win, 0); 12016363Skarels cch = (*text & 63) + 64; 12116363Skarels waddch(win->x_win, cch); 12216363Skarels } else 12316363Skarels waddch(win->x_win, *text); 12416363Skarels getyx(win->x_win, win->x_line, win->x_col); 12516363Skarels text++; 12616346Skarels } 12716363Skarels wrefresh(win->x_win); 12816346Skarels } 12916346Skarels 13016346Skarels /* 13116363Skarels * Read the character at the indicated position in win 13216363Skarels */ 13316346Skarels readwin(win, line, col) 13416363Skarels WINDOW *win; 13516346Skarels { 13616363Skarels int oldline, oldcol; 13716363Skarels register int c; 13816346Skarels 13916363Skarels getyx(win, oldline, oldcol); 14016363Skarels wmove(win, line, col); 14116363Skarels c = winch(win); 14216363Skarels wmove(win, oldline, oldcol); 14316363Skarels return (c); 14416346Skarels } 14516346Skarels 14616346Skarels /* 14716363Skarels * Scroll a window, blanking out the line following the current line 14816363Skarels * so that the current position is obvious 14916363Skarels */ 15016346Skarels xscroll(win, flag) 15116363Skarels register xwin_t *win; 15216363Skarels int flag; 15316346Skarels { 15416363Skarels 15516363Skarels if (flag == -1) { 15616363Skarels wmove(win->x_win, 0, 0); 15716363Skarels win->x_line = 0; 15816363Skarels win->x_col = 0; 15916363Skarels return; 16016363Skarels } 16116363Skarels win->x_line = (win->x_line + 1) % win->x_nlines; 16216346Skarels win->x_col = 0; 16316363Skarels wmove(win->x_win, win->x_line, win->x_col); 16416363Skarels wclrtoeol(win->x_win); 16516363Skarels wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col); 16616363Skarels wclrtoeol(win->x_win); 16716363Skarels wmove(win->x_win, win->x_line, win->x_col); 16816346Skarels } 169