|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)display.c 5.1 (Berkeley) 6/6/85";
9: #endif not lint
10:
11: /*
12: * The window 'manager', initializes curses and handles the actual
13: * displaying of text
14: */
15: #include "talk.h"
16:
17: xwin_t my_win;
18: xwin_t his_win;
19: WINDOW *line_win;
20:
21: int curses_initialized = 0;
22:
23: /*
24: * max HAS to be a function, it is called with
25: * a argument of the form --foo at least once.
26: */
27: max(a,b)
28: int a, b;
29: {
30:
31: return (a > b ? a : b);
32: }
33:
34: /*
35: * Display some text on somebody's window, processing some control
36: * characters while we are at it.
37: */
38: display(win, text, size)
39: register xwin_t *win;
40: register char *text;
41: int size;
42: {
43: register int i;
44: char cch;
45:
46: for (i = 0; i < size; i++) {
47: if (*text == '\n') {
48: xscroll(win, 0);
49: text++;
50: continue;
51: }
52: /* erase character */
53: if (*text == win->cerase) {
54: wmove(win->x_win, win->x_line, max(--win->x_col, 0));
55: getyx(win->x_win, win->x_line, win->x_col);
56: waddch(win->x_win, ' ');
57: wmove(win->x_win, win->x_line, win->x_col);
58: getyx(win->x_win, win->x_line, win->x_col);
59: text++;
60: continue;
61: }
62: /*
63: * On word erase search backwards until we find
64: * the beginning of a word or the beginning of
65: * the line.
66: */
67: if (*text == win->werase) {
68: int endcol, xcol, i, c;
69:
70: endcol = win->x_col;
71: xcol = endcol - 1;
72: while (xcol >= 0) {
73: c = readwin(win->x_win, win->x_line, xcol);
74: if (c != ' ')
75: break;
76: xcol--;
77: }
78: while (xcol >= 0) {
79: c = readwin(win->x_win, win->x_line, xcol);
80: if (c == ' ')
81: break;
82: xcol--;
83: }
84: wmove(win->x_win, win->x_line, xcol + 1);
85: for (i = xcol + 1; i < endcol; i++)
86: waddch(win->x_win, ' ');
87: wmove(win->x_win, win->x_line, xcol + 1);
88: getyx(win->x_win, win->x_line, win->x_col);
89: continue;
90: }
91: /* line kill */
92: if (*text == win->kill) {
93: wmove(win->x_win, win->x_line, 0);
94: wclrtoeol(win->x_win);
95: getyx(win->x_win, win->x_line, win->x_col);
96: text++;
97: continue;
98: }
99: if (*text == '\f') {
100: if (win == &my_win)
101: wrefresh(curscr);
102: text++;
103: continue;
104: }
105: if (win->x_col == COLS-1) {
106: /* check for wraparound */
107: xscroll(win, 0);
108: }
109: if (*text < ' ' && *text != '\t') {
110: waddch(win->x_win, '^');
111: getyx(win->x_win, win->x_line, win->x_col);
112: if (win->x_col == COLS-1) /* check for wraparound */
113: xscroll(win, 0);
114: cch = (*text & 63) + 64;
115: waddch(win->x_win, cch);
116: } else
117: waddch(win->x_win, *text);
118: getyx(win->x_win, win->x_line, win->x_col);
119: text++;
120: }
121: wrefresh(win->x_win);
122: }
123:
124: /*
125: * Read the character at the indicated position in win
126: */
127: readwin(win, line, col)
128: WINDOW *win;
129: {
130: int oldline, oldcol;
131: register int c;
132:
133: getyx(win, oldline, oldcol);
134: wmove(win, line, col);
135: c = winch(win);
136: wmove(win, oldline, oldcol);
137: return (c);
138: }
139:
140: /*
141: * Scroll a window, blanking out the line following the current line
142: * so that the current position is obvious
143: */
144: xscroll(win, flag)
145: register xwin_t *win;
146: int flag;
147: {
148:
149: if (flag == -1) {
150: wmove(win->x_win, 0, 0);
151: win->x_line = 0;
152: win->x_col = 0;
153: return;
154: }
155: win->x_line = (win->x_line + 1) % win->x_nlines;
156: win->x_col = 0;
157: wmove(win->x_win, win->x_line, win->x_col);
158: wclrtoeol(win->x_win);
159: wmove(win->x_win, (win->x_line + 1) % win->x_nlines, win->x_col);
160: wclrtoeol(win->x_win);
161: wmove(win->x_win, win->x_line, win->x_col);
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.