00001 #include <stdlib.h>
00002 #include <termcap.h>
00003 #include <sys/types.h>
00004 #include <sys/ioctl.h>
00005 #include <curses.h>
00006 #include "curspriv.h"
00007
00008 struct termios _orig_tty, _tty;
00009 cursv _cursvar;
00010
00011 WINDOW *stdscr, *curscr;
00012 int LINES, COLS;
00013 bool NONL;
00014
00015 char termcap[1024];
00016 char tc[200];
00017 char *ttytype;
00018 static char *arp;
00019 char *cp;
00020
00021 char *cl;
00022 char *cm;
00023 char *so;
00024 char *se;
00025 char *mr;
00026 char *me;
00027 char *mb;
00028 char *md;
00029 char *us;
00030 char *ue;
00031 char *vi;
00032 char *ve;
00033 char *vs;
00034 char *as;
00035 char *ae;
00036 char *bl;
00037 char *vb;
00038
00039
00040 void fatal(s)
00041 char *s;
00042 {
00043 (void) fprintf(stderr, "curses: %s\n", s);
00044 exit(1);
00045 }
00046
00047
00048 void outc(c)
00049 int c;
00050 {
00051 putchar(c);
00052 }
00053
00054
00055 void poscur(r, c)
00056 int r, c;
00057 {
00058 tputs(tgoto(cm, c, r), 1, outc);
00059 }
00060
00061
00062 void clrscr()
00063 {
00064 tputs(cl, 1, outc);
00065 }
00066
00067
00068
00069 unsigned int ACS_ULCORNER;
00070 unsigned int ACS_LLCORNER;
00071 unsigned int ACS_URCORNER;
00072 unsigned int ACS_LRCORNER;
00073 unsigned int ACS_RTEE;
00074 unsigned int ACS_LTEE;
00075 unsigned int ACS_BTEE;
00076 unsigned int ACS_TTEE;
00077 unsigned int ACS_HLINE;
00078 unsigned int ACS_VLINE;
00079 unsigned int ACS_PLUS;
00080 unsigned int ACS_S1;
00081 unsigned int ACS_S9;
00082 unsigned int ACS_DIAMOND;
00083 unsigned int ACS_CKBOARD;
00084 unsigned int ACS_DEGREE;
00085 unsigned int ACS_PLMINUS;
00086 unsigned int ACS_BULLET;
00087 unsigned int ACS_LARROW;
00088 unsigned int ACS_RARROW;
00089 unsigned int ACS_DARROW;
00090 unsigned int ACS_UARROW;
00091 unsigned int ACS_BOARD;
00092 unsigned int ACS_LANTERN;
00093 unsigned int ACS_BLOCK;
00094
00095
00096
00097
00098
00099 #define RIGHTARROW 0
00100 #define LEFTARROW 1
00101 #define DOWNARROW 2
00102 #define UPARROW 3
00103 #define FULLSQUARE 4
00104 #define GREYSQUARE 5
00105 #define EMPTYSQUARE 6
00106 #define LATERN 7
00107 #define DIAMOND 8
00108 #define DEGREE 9
00109 #define PLUSMINUS 10
00110 #define DOWNRIGHT 11
00111 #define UPRIGHT 12
00112 #define UPLEFT 13
00113 #define DOWNLEFT 14
00114 #define CROSS 15
00115 #define UPLINE 16
00116 #define UPMIDLINE 17
00117 #define MIDLINE 18
00118 #define DOMIDLINE 19
00119 #define DOWNLINE 20
00120 #define TEELEFT 21
00121 #define TEERIGHT 22
00122 #define TEEHEAD 23
00123 #define TEENORMAL 24
00124 #define VERTLINE 25
00125 #define PARAGRAPH 26
00126
00127 unsigned int _cursgraftable[27] =
00128 {
00129 '>', '<', 'v', '^', '#', ':', ' ', '#', '+', '\'', '#', '+', '+',
00130 '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|'
00131 };
00132 char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~";
00133
00134 int setterm(type)
00135 char *type;
00136 {
00137 unsigned char *ac;
00138 int i;
00139 #ifdef TIOCGWINSZ
00140 struct winsize wsize;
00141 #endif
00142
00143 if (tgetent(termcap, type) != 1) return ERR;
00144
00145 #ifdef TIOCGWINSZ
00146 if (ioctl(0, TIOCGWINSZ, &wsize) == 0) {
00147 LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li");
00148 COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co");
00149 } else {
00150 #endif
00151 LINES = tgetnum("li");
00152 COLS = tgetnum("co");
00153 #ifdef TIOCGWINSZ
00154 }
00155 #endif
00156 arp = tc;
00157 cl = tgetstr("cl", &arp);
00158 so = tgetstr("so", &arp);
00159 se = tgetstr("se", &arp);
00160 cm = tgetstr("cm", &arp);
00161 mr = tgetstr("mr", &arp);
00162 me = tgetstr("me", &arp);
00163 mb = tgetstr("mb", &arp);
00164 md = tgetstr("md", &arp);
00165 us = tgetstr("us", &arp);
00166 ue = tgetstr("ue", &arp);
00167 vi = tgetstr("vi", &arp);
00168 ve = tgetstr("ve", &arp);
00169 vs = tgetstr("vs", &arp);
00170 as = tgetstr("as", &arp);
00171 ae = tgetstr("ae", &arp);
00172 ac = (unsigned char *) tgetstr("ac", &arp);
00173 bl = tgetstr("bl", &arp);
00174 vb = tgetstr("vb", &arp);
00175
00176 if (ac) {
00177 while (*ac) {
00178 i = 0;
00179 while (*ac != _cursident[i]) i++;
00180 _cursgraftable[i] = *++ac | A_ALTCHARSET;
00181 ac++;
00182 }
00183 }
00184
00185 ACS_ULCORNER = _cursgraftable[UPLEFT];
00186 ACS_LLCORNER = _cursgraftable[DOWNLEFT];
00187 ACS_URCORNER = _cursgraftable[UPRIGHT];
00188 ACS_LRCORNER = _cursgraftable[DOWNRIGHT];
00189 ACS_RTEE = _cursgraftable[TEERIGHT];
00190 ACS_LTEE = _cursgraftable[TEELEFT];
00191 ACS_BTEE = _cursgraftable[TEEHEAD];
00192 ACS_TTEE = _cursgraftable[TEENORMAL];
00193 ACS_HLINE = _cursgraftable[MIDLINE];
00194 ACS_VLINE = _cursgraftable[VERTLINE];
00195 ACS_PLUS = _cursgraftable[CROSS];
00196 ACS_S1 = _cursgraftable[UPLINE];
00197 ACS_S9 = _cursgraftable[DOWNLINE];
00198 ACS_DIAMOND = _cursgraftable[DIAMOND];
00199 ACS_CKBOARD = _cursgraftable[GREYSQUARE];
00200 ACS_DEGREE = _cursgraftable[DEGREE];
00201 ACS_PLMINUS = _cursgraftable[PLUSMINUS];
00202 ACS_BULLET = 'o';
00203
00204 ACS_LARROW = _cursgraftable[LEFTARROW];
00205 ACS_RARROW = _cursgraftable[RIGHTARROW];
00206 ACS_DARROW = _cursgraftable[DOWNARROW];
00207 ACS_UARROW = _cursgraftable[UPARROW];
00208 ACS_BOARD = _cursgraftable[EMPTYSQUARE];
00209 ACS_LANTERN = _cursgraftable[LATERN];
00210 ACS_BLOCK = _cursgraftable[FULLSQUARE];
00211
00212 return OK;
00213 }
00214
00215 void gettmode()
00216 {
00217 tcgetattr(0, &_orig_tty);
00218 tcgetattr(0, &_tty);
00219 _cursvar.echoit = (_tty.c_lflag & ECHO) != 0;
00220 _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0;
00221 _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG;
00222 NONL = (_tty.c_iflag & ICRNL) != 0;
00223 }