📄 cursesio.c
字号:
#include <stdlib.h>#include <termcap.h>#include <sys/types.h>#include <sys/ioctl.h>#include <curses.h>#include "curspriv.h"struct termios _orig_tty, _tty;cursv _cursvar;WINDOW *stdscr, *curscr;int LINES, COLS;bool NONL;char termcap[1024]; /* termcap buffer */char tc[200]; /* area to hold string capabilities */char *ttytype; /* terminal type from env */char *arp; /* pointer for use in tgetstr */char *cp; /* character pointer */char *cl; /* clear screen capability */char *cm; /* cursor motion capability */char *so; /* start standout capability */char *se; /* end standout capability */char *mr; /* start of reverse */char *me; /* revert to normal */char *mb; /* start of blink */char *md; /* start of bold */char *us; /* start of underscore */char *ue; /* end of underscore */char *vi; /* cursor invisible */char *ve; /* cursor normal */char *vs; /* cursor good visible */char *as; /* alternative charset start */char *ae; /* alternative charset end */char *bl; /* ring the bell */char *vb; /* visual bell *//* fatal - report error and die. Never returns */void fatal(s)char *s;{ (void) fprintf(stderr, "curses: %s\n", s); exit(1);}/* Outc - call putchar, necessary because putchar is a macro. */void outc(c)int c;{ putchar(c);}/* Move cursor to r,c */void poscur(r, c)int r, c;{ tputs(tgoto(cm, c, r), 1, outc);}/* Clear the screen */void clrscr(){ tputs(cl, 1, outc);}/* This are terminal independent characters which can be used in curses */unsigned int ACS_ULCORNER;unsigned int ACS_LLCORNER;unsigned int ACS_URCORNER;unsigned int ACS_LRCORNER;unsigned int ACS_RTEE;unsigned int ACS_LTEE;unsigned int ACS_BTEE;unsigned int ACS_TTEE;unsigned int ACS_HLINE;unsigned int ACS_VLINE;unsigned int ACS_PLUS;unsigned int ACS_S1;unsigned int ACS_S9;unsigned int ACS_DIAMOND;unsigned int ACS_CKBOARD;unsigned int ACS_DEGREE;unsigned int ACS_PLMINUS;unsigned int ACS_BULLET;unsigned int ACS_LARROW;unsigned int ACS_RARROW;unsigned int ACS_DARROW;unsigned int ACS_UARROW;unsigned int ACS_BOARD;unsigned int ACS_LANTERN;unsigned int ACS_BLOCK;/* These defines describe the full set of grafic block characters which * can be defined via termcap. */#define RIGHTARROW 0#define LEFTARROW 1#define DOWNARROW 2#define UPARROW 3#define FULLSQUARE 4#define GREYSQUARE 5#define EMPTYSQUARE 6#define LATERN 7#define DIAMOND 8#define DEGREE 9#define PLUSMINUS 10#define DOWNRIGHT 11#define UPRIGHT 12#define UPLEFT 13#define DOWNLEFT 14#define CROSS 15#define UPLINE 16#define UPMIDLINE 17#define MIDLINE 18#define DOMIDLINE 19#define DOWNLINE 20#define TEELEFT 21#define TEERIGHT 22#define TEEHEAD 23#define TEENORMAL 24#define VERTLINE 25#define PARAGRAPH 26unsigned int _cursgraftable[27] ={ '>', '<', 'v', '^', '#', ':', ' ', '#', '+', '\'', '#', '+', '+', '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|'};char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~";int setterm(type)char *type;{ unsigned char *ac; int i;#ifdef TIOCGWINSZ struct winsize wsize;#endif if (tgetent(termcap, type) != 1) return ERR;#ifdef TIOCGWINSZ if (ioctl(0, TIOCGWINSZ, &wsize) == 0) { LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li"); COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co"); } else {#endif LINES = tgetnum("li"); COLS = tgetnum("co");#ifdef TIOCGWINSZ }#endif arp = tc; cl = tgetstr("cl", &arp); so = tgetstr("so", &arp); se = tgetstr("se", &arp); cm = tgetstr("cm", &arp); mr = tgetstr("mr", &arp); me = tgetstr("me", &arp); mb = tgetstr("mb", &arp); md = tgetstr("md", &arp); us = tgetstr("us", &arp); ue = tgetstr("ue", &arp); vi = tgetstr("vi", &arp); ve = tgetstr("ve", &arp); vs = tgetstr("vs", &arp); as = tgetstr("as", &arp); ae = tgetstr("ae", &arp); ac = (unsigned char *) tgetstr("ac", &arp); bl = tgetstr("bl", &arp); vb = tgetstr("vb", &arp); if (ac) { while (*ac) { i = 0; while (*ac != _cursident[i]) i++; _cursgraftable[i] = *++ac | A_ALTCHARSET; ac++; } } ACS_ULCORNER = _cursgraftable[UPLEFT]; ACS_LLCORNER = _cursgraftable[DOWNLEFT]; ACS_URCORNER = _cursgraftable[UPRIGHT]; ACS_LRCORNER = _cursgraftable[DOWNRIGHT]; ACS_RTEE = _cursgraftable[TEERIGHT]; ACS_LTEE = _cursgraftable[TEELEFT]; ACS_BTEE = _cursgraftable[TEEHEAD]; ACS_TTEE = _cursgraftable[TEENORMAL]; ACS_HLINE = _cursgraftable[MIDLINE]; ACS_VLINE = _cursgraftable[VERTLINE]; ACS_PLUS = _cursgraftable[CROSS]; ACS_S1 = _cursgraftable[UPLINE]; ACS_S9 = _cursgraftable[DOWNLINE]; ACS_DIAMOND = _cursgraftable[DIAMOND]; ACS_CKBOARD = _cursgraftable[GREYSQUARE]; ACS_DEGREE = _cursgraftable[DEGREE]; ACS_PLMINUS = _cursgraftable[PLUSMINUS]; ACS_BULLET = 'o'; /* where the hell is a bullet defined in * termcap ??? */ ACS_LARROW = _cursgraftable[LEFTARROW]; ACS_RARROW = _cursgraftable[RIGHTARROW]; ACS_DARROW = _cursgraftable[DOWNARROW]; ACS_UARROW = _cursgraftable[UPARROW]; ACS_BOARD = _cursgraftable[EMPTYSQUARE]; ACS_LANTERN = _cursgraftable[LATERN]; ACS_BLOCK = _cursgraftable[FULLSQUARE]; /* Wow, I got it! */ return OK;}void gettmode(){ tcgetattr(0, &_orig_tty); tcgetattr(0, &_tty); _cursvar.echoit = (_tty.c_lflag & ECHO) != 0; _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0; _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG; NONL = (_tty.c_iflag & ICRNL) != 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -