|
|
1.1 root 1: /*
2: * Initialize the windows system
3: *
4: * Copyright (c) 1990-93 by Udo Munk
5: */
6:
7: #ifdef AIX
8: #define NLS
9: #endif
10:
11: #include <curses.h>
12: #include <term.h>
13: #include <setjmp.h>
14: #include <signal.h>
15: #ifdef SCO32
16: #include <sys/termio.h>
17: #include "ptem.h"
18: #endif
19: #ifdef SYSV4
20: #include <termios.h>
21: #endif
22: #ifdef AIX
23: #include <sys/ioctl.h>
24: #endif
25: #include "winfun.h"
26:
27: extern char *malloc();
28: extern void free();
29:
30: chtype ul_corner, ur_corner, ll_corner, lr_corner, r_tee, l_tee, b_tee, t_tee,
31: h_line, v_line, u_arrow, d_arrow, checkboard, fullboard;
32:
33: W_LIST *wl = (W_LIST *) 0;
34:
35: int tab_active = 0;
36:
37: initwin(tflag, eflag, lin, col, errmsg)
38: int tflag;
39: int lin, col;
40: char *errmsg;
41: {
42: register char *p;
43:
44: #if defined(SIGWINCH) && defined(TIOCGWINSZ)
45: int sigwinch_handler();
46: signal(SIGWINCH, sigwinch_handler);
47: #endif
48: initscr();
49: keypad(stdscr, TRUE);
50: raw();
51: noecho();
52: nonl();
53: #ifdef INTRFLUSH
54: intrflush(stdscr, FALSE);
55: #endif
56: #ifdef NOTYPEAHEAD
57: typeahead(-1);
58: #endif
59:
60: if(LINES < lin || COLS < col) {
61: endwin();
62: fprintf(stderr, "%s\n", errmsg);
63: exit(1);
64: }
65:
66: if (wl == (W_LIST *) 0) {
67: if ((wl = (W_LIST *) malloc(sizeof(W_LIST))) == NULL)
68: nomem();
69: wl->w_w = stdscr;
70: wl->w_next = (W_LIST *) 0;
71: }
72:
73: if (!tflag) {
74: ul_corner = '+';
75: ur_corner = '+';
76: ll_corner = '+';
77: lr_corner = '+';
78: r_tee = '+';
79: l_tee = '+';
80: b_tee = '+';
81: t_tee = '+';
82: h_line = '-';
83: v_line = '|';
84: u_arrow = '^';
85: d_arrow = 'v';
86: checkboard = ' ' | A_REVERSE;
87: fullboard = '#';
88: } else {
89: ul_corner = 'l' | A_ALTCHARSET;
90: ur_corner = 'k' | A_ALTCHARSET;
91: ll_corner = 'm' | A_ALTCHARSET;
92: lr_corner = 'j' | A_ALTCHARSET;
93: r_tee = 'u' | A_ALTCHARSET;
94: l_tee = 't' | A_ALTCHARSET;
95: b_tee = 'v' | A_ALTCHARSET;
96: t_tee = 'w' | A_ALTCHARSET;
97: h_line = 'q' | A_ALTCHARSET;
98: v_line = 'x' | A_ALTCHARSET;
99: u_arrow = '^';
100: d_arrow = 'v';
101: checkboard = ' ' | A_REVERSE;
102: fullboard = '#';
103: }
104:
105: if (eflag)
106: return;
107:
108: #ifdef AIX
109: p = box_chars_1;
110: ul_corner = *(p+0) & 0377 | A_ALTCHARSET;
111: h_line = *(p+1) & 0377 | A_ALTCHARSET;
112: ur_corner = *(p+2) & 0377 | A_ALTCHARSET;
113: v_line = *(p+3) & 0377 | A_ALTCHARSET;
114: lr_corner = *(p+4) & 0377 | A_ALTCHARSET;
115: ll_corner = *(p+5) & 0377 | A_ALTCHARSET;
116: t_tee = *(p+6) & 0377 | A_ALTCHARSET;
117: r_tee = *(p+7) & 0377 | A_ALTCHARSET;
118: b_tee = *(p+8) & 0377 | A_ALTCHARSET;
119: l_tee = *(p+9) & 0377 | A_ALTCHARSET;
120: #else
121: #ifdef ACS_ULCORNER
122: ul_corner = ACS_ULCORNER;
123: ur_corner = ACS_URCORNER;
124: lr_corner = ACS_LRCORNER;
125: ll_corner = ACS_LLCORNER;
126: t_tee = ACS_TTEE;
127: b_tee = ACS_BTEE;
128: l_tee = ACS_LTEE;
129: r_tee = ACS_RTEE;
130: h_line = ACS_HLINE;
131: v_line = ACS_VLINE;
132: if (ACS_UARROW)
133: u_arrow = ACS_UARROW;
134: if (ACS_DARROW)
135: d_arrow = ACS_DARROW;
136: if (ACS_CKBOARD)
137: checkboard = ACS_CKBOARD;
138: if (ACS_BLOCK)
139: fullboard = ACS_BLOCK;
140: #else
141: #ifdef OLDACS
142: p = acs_chars;
143: do {
144: switch (*p) {
145: case 'l': /* upper left corner */
146: ul_corner = *++p & 0377 | A_ALTCHARSET;
147: break;
148: case 'k': /* upper right corner */
149: ur_corner = *++p & 0377 | A_ALTCHARSET;
150: break;
151: case 'm': /* lower left corner */
152: ll_corner = *++p & 0377 | A_ALTCHARSET;
153: break;
154: case 'j': /* lower right corner */
155: lr_corner = *++p & 0377 | A_ALTCHARSET;
156: break;
157: case 'q': /* horizontale line */
158: h_line = *++p & 0377 | A_ALTCHARSET;
159: break;
160: case 'x': /* verticale line */
161: v_line = *++p & 0377 | A_ALTCHARSET;
162: break;
163: case 't': /* left tee */
164: l_tee = *++p & 0377 | A_ALTCHARSET;
165: break;
166: case 'u': /* right tee */
167: r_tee = *++p & 0377 | A_ALTCHARSET;
168: break;
169: case 'w': /* upper tee */
170: t_tee = *++p & 0377 | A_ALTCHARSET;
171: break;
172: case 'v': /* lower tee */
173: b_tee = *++p & 0377 | A_ALTCHARSET;
174: break;
175: case '-': /* arrow up */
176: u_arrow = *++p & 0377 | A_ALTCHARSET;
177: break;
178: case '.': /* arrow down */
179: d_arrow = *++p & 0377 | A_ALTCHARSET;
180: break;
181: case 'a': /* checkboard */
182: checkboard = *++p & 0377 | A_ALCHARSET;
183: break;
184: case '0': /* full board */
185: fullboard = *++p & 0377 | A_ALTCHARSET;
186: break;
187: default:
188: p++;
189: }
190: } while (*p && *++p);
191: #endif
192: #endif
193: #endif
194: }
195:
196: #if defined(SIGWINCH) && defined(TIOCGWINSZ)
197: static int sigwinch_handler()
198: {
199: extern jmp_buf reset_win;
200: struct winsize ws;
201:
202: if (ioctl(fileno(stdin), TIOCGWINSZ, (char *) &ws) == 0) {
203: close_all_windows();
204: free(wl);
205: wl = (W_LIST *) 0;
206: delwin(stdscr);
207: endwin();
208: LINES = ws.ws_row;
209: COLS = ws.ws_col;
210: signal(SIGWINCH, sigwinch_handler);
211: longjmp(reset_win, 0);
212: }
213: }
214: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.