⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curses.c

📁 操作系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#if OSK		write(2, "\l", 1);#endif		exit(3);	}	/* get strings */	musthave(&UP, "up");	mayhave(&VB, "vb");	musthave(&CM, "cm");	pair(&SO, &SE, "so", "se");	mayhave(&TI, "ti");	mayhave(&TE, "te");	if (tgetnum("ug") <= 0)	{		pair(&US, &UE, "us", "ue");		pair(&MD, &ME, "md", "me");		/* get italics, or have it default to underline */		pair(&AS, &AE, "as", "ae");		if (!*AS)		{			AS = US;			AE = UE;		}	}#ifndef NO_VISIBLE	MV = SO; /* by default */	mayhave(&MV, "mv");#endif	mayhave(&AL, "al");	mayhave(&DL, "dl");	musthave(&CE, "ce");	mayhave(&CD, "cd");#if OSK	mayhave(&SR_, "sr");#else		mayhave(&SR, "sr");#endif	pair(&IM, &EI, "im", "ei");	mayhave(&IC, "ic");	mayhave(&DC, "dc");	/* other termcap stuff */	AM = (tgetflag("am") && !tgetflag("xn"));	PT = tgetflag("pt");#if AMIGA	amiopenwin(termtype);	/* Must run this before ttysetup(); */	ttysetup();	/* Must run this before getsize(0); */#endif	getsize(0);	/* Key sequences */	pair(&KS, &KE, "ks", "ke");	mayhave(&KU, "ku");		/* up */	mayhave(&KD, "kd");		/* down */	mayhave(&KL, "kl");		/* left */	mayhave(&KR, "kr");		/* right */	mayhave(&PU, "kP");		/* PgUp */	mayhave(&PD, "kN");		/* PgDn */	mayhave(&HM, "kh");		/* Home */	mayhave(&EN, "kH");		/* End */	mayhave(&KI, "kI");		/* Insert */#ifndef CRUNCH	if (!PU) mayhave(&PU, "K2");	/* "3x3 pad" names for PgUp, etc. */	if (!PD) mayhave(&PD, "K5");	if (!HM) mayhave(&HM, "K1");	if (!EN) mayhave(&EN, "K4");	mayhave(&PU, "PU");		/* old XENIX names for PgUp, etc. */	mayhave(&PD, "PD");		/* (overrides others, if used.) */	mayhave(&HM, "HM");	mayhave(&EN, "EN");#endif#ifndef NO_FKEY	mayhave(&FKEY[0], "k0");		/* function key codes */	mayhave(&FKEY[1], "k1");	mayhave(&FKEY[2], "k2");	mayhave(&FKEY[3], "k3");	mayhave(&FKEY[4], "k4");	mayhave(&FKEY[5], "k5");	mayhave(&FKEY[6], "k6");	mayhave(&FKEY[7], "k7");	mayhave(&FKEY[8], "k8");	mayhave(&FKEY[9], "k9");# ifndef NO_SHIFT_FKEY	mayhave(&FKEY[10], "s0");		/* shift function key codes */	mayhave(&FKEY[11], "s1");	mayhave(&FKEY[12], "s2");	mayhave(&FKEY[13], "s3");	mayhave(&FKEY[14], "s4");	mayhave(&FKEY[15], "s5");	mayhave(&FKEY[16], "s6");	mayhave(&FKEY[17], "s7");	mayhave(&FKEY[18], "s8");	mayhave(&FKEY[19], "s9");#  ifndef NO_CTRL_FKEY	mayhave(&FKEY[20], "c0");		/* control function key codes */	mayhave(&FKEY[21], "c1");	mayhave(&FKEY[22], "c2");	mayhave(&FKEY[23], "c3");	mayhave(&FKEY[24], "c4");	mayhave(&FKEY[25], "c5");	mayhave(&FKEY[26], "c6");	mayhave(&FKEY[27], "c7");	mayhave(&FKEY[28], "c8");	mayhave(&FKEY[29], "c9");#   ifndef NO_ALT_FKEY	mayhave(&FKEY[30], "a0");		/* alt function key codes */	mayhave(&FKEY[31], "a1");	mayhave(&FKEY[32], "a2");	mayhave(&FKEY[33], "a3");	mayhave(&FKEY[34], "a4");	mayhave(&FKEY[35], "a5");	mayhave(&FKEY[36], "a6");	mayhave(&FKEY[37], "a7");	mayhave(&FKEY[38], "a8");	mayhave(&FKEY[39], "a9");#   endif#  endif# endif#endif#ifndef NO_CURSORSHAPE	/* cursor shapes */	CQ = tgetstr("cQ", &capbuf);	if (has_CQ)	{		CX = tgetstr("cX", &capbuf);		if (!CX) CX = CQ;		CV = tgetstr("cV", &capbuf);		if (!CV) CV = CQ;		CI = tgetstr("cI", &capbuf);		if (!CI) CI = CQ;		CR = tgetstr("cR", &capbuf);		if (!CR) CR = CQ;	}# ifndef CRUNCH	else	{		CQ = CV = "";		pair(&CQ, &CV, "ve", "vs");		CX = CI = CR = CQ;	}# endif /* !CRUNCH */#endif /* !NO_CURSORSHAPE */#ifndef NO_COLOR	strcpy(SOcolor, SO);	strcpy(SEcolor, SE);	strcpy(AScolor, AS);	strcpy(AEcolor, AE);	strcpy(MDcolor, MD);	strcpy(MEcolor, ME);	strcpy(UScolor, US);	strcpy(UEcolor, UE);# ifndef NO_POPUP	strcpy(POPUPcolor, SO);# endif# ifndef NO_VISIBLE	strcpy(VISIBLEcolor, MV);# endif#endif}/* This function gets the window size.  It uses the TIOCGWINSZ ioctl call if * your system has it, or tgetnum("li") and tgetnum("co") if it doesn't. * This function is called once during initialization, and thereafter it is * called whenever the SIGWINCH signal is sent to this process. */int getsize(signo)	int	signo;{	int	lines;	int	cols;#ifdef TIOCGWINSZ	struct winsize size;#endif#ifdef SIGWINCH	/* reset the signal vector */	signal(SIGWINCH, getsize);#endif	/* get the window size, one way or another. */	lines = cols = 0;#ifdef TIOCGWINSZ	if (ioctl(2, TIOCGWINSZ, &size) >= 0)	{		lines = size.ws_row;		cols = size.ws_col;	}#endif#if AMIGA	/* Amiga gets window size by asking the console.device */	if (!strcmp(TERMTYPE, termtype))	{	    auto long len;	    auto char buf[30];	    	    Write(Output(), "\2330 q", 4); /* Ask the console.device */	    len = Read(Input(), buf, 29);	    buf[len] = '\000';	    sscanf(&buf[5], "%d;%d", &lines, &cols);	}#endif	if ((lines == 0 || cols == 0) && signo == 0)	{		LINES = tgetnum("li");		COLS = tgetnum("co");	}#if MSDOS# ifdef RAINBOW	if (!strcmp(termtype, "rainbow"))	{		/* Determine whether Rainbow is in 80-column or 132-column mode */		cols = *(unsigned char far *)0xee000f57L;	}	else# endif	{		lines = v_rows();		cols = v_cols();	}#endif	if (lines >= 2)	{		LINES = lines;	}	if (cols >= 30)	{		COLS = cols;	}	/* Make sure we got values that we can live with */	if (LINES < 2 || COLS < 30)	{		write(2, "Screen too small\n", (unsigned)17);#if OSK		write(2, "\l", 1);#endif		endwin();		exit(2);	}#if AMIGA	if (*o_lines != LINES || *o_columns != COLS)	{		*o_lines = LINES;		*o_columns = COLS;	}#endif	return 0;}/* This is a function version of addch() -- it is used by tputs() */int faddch(ch)	int	ch;{	addch(ch);	return 0;}/* This function quickly adds a string to the output queue.  It does *NOT* * convert \n into <CR><LF>. */void qaddstr(str)	char	*str;{	REG char *s_, *d_;#if MSDOS	if (o_pcbios[0])	{		while (*str)			qaddch(*str++);		return;	}#endif	for (s_=(str), d_=stdscr; *d_++ = *s_++; )	{	}	stdscr = d_ - 1;}/* Output the ESC sequence needed to go into any video mode, if supported */void attrset(a)	int	a;{	do_aend();	if (a == A_BOLD)	{		do_MD();		aend = ME;	}	else if (a == A_UNDERLINE)	{		do_US();		aend = UE;	}	else if (a == A_ALTCHARSET)	{		do_AS();		aend = AE;	}	else	{		aend = "";	}}/* Insert a single character into the display */void insch(ch)	int	ch;{	if (has_IM)		do_IM();	do_IC();	qaddch(ch);	if (has_EI)		do_EI();}void wrefresh(){	if (stdscr != kbuf)	{		VOIDBIOS(;,ttywrite(kbuf, (unsigned)(stdscr - kbuf)));		stdscr = kbuf;	}}void wqrefresh(){	if (stdscr - kbuf > 2000)	{		VOIDBIOS(stdscr = kbuf,		{			ttywrite(kbuf, (unsigned)(stdscr - kbuf)); 			stdscr = kbuf;		});	}}#ifndef NO_COLOR/* This function is called during termination.  It resets color modes */int ansiquit(){	/* if ANSI color terminal, then reset the colors */	if (!strcmp(UP, "\033[A"))	{		tputs("\033[37;40m\033[m", 1, faddch);		clrtoeol();		return 1;	}	return 0;}/* This sets the color strings that work for ANSI terminals.  If the TERMCAP * doesn't look like an ANSI terminal, then it returns FALSE.  If the colors * aren't understood, it also returns FALSE.  If all goes well, it returns TRUE */int ansicolor(cmode, attrbyte)	int	cmode;		/* mode to set, e.g. A_NORMAL */	int	attrbyte;	/* IBM PC attribute byte */{	char	temp[16];	/* hold the new mode string */	/* if not ANSI-ish, then fail */	if (strcmp(UP, "\033[A") && strcmp(UP, "\033OA"))	{		msg("Don't know how to set colors for this terminal");		return 0;	}	/* construct the color string */	sprintf(temp, "\033[m\033[3%c;4%c%s%sm",		"04261537"[attrbyte & 0x07],		"04261537"[(attrbyte >> 4) & 0x07],		(attrbyte & 0x08) ? ";1" : "",		(attrbyte & 0x80) ? ";5" : "");	/* stick it in the right place */	switch (cmode)	{	  case A_NORMAL:		if (!strcmp(MEcolor, normalcolor))			strcpy(MEcolor, temp);		if (!strcmp(UEcolor, normalcolor))			strcpy(UEcolor, temp);		if (!strcmp(AEcolor, normalcolor))			strcpy(AEcolor, temp);		if (!strcmp(SEcolor, normalcolor))			strcpy(SEcolor, temp);		strcpy(normalcolor, temp);		tputs(normalcolor, 1, faddch);		break;	  case A_BOLD:		strcpy(MDcolor, temp);		strcpy(MEcolor, normalcolor);		break;	  case A_UNDERLINE:		strcpy(UScolor, temp);		strcpy(UEcolor, normalcolor);		break;	  case A_ALTCHARSET:		strcpy(AScolor, temp);		strcpy(AEcolor, normalcolor);		break;	  case A_STANDOUT:		strcpy(SOcolor, temp);		strcpy(SEcolor, normalcolor);		break;#ifndef NO_POPUP	  case A_POPUP:		strcpy(POPUPcolor, temp);		break;#endif#ifndef NO_VISIBLE	  case A_VISIBLE:		strcpy(VISIBLEcolor, temp);		break;#endif	}	return 1;}/* This function outputs the ESC sequence needed to switch the screen back * to "normal" mode.  On color terminals which haven't had their color set * yet, this is one of the termcap strings; for color terminals that really * have had colors defined, we just the "normal color" escape sequence. */endcolor(){	if (aend == ME)		tputs(MEcolor, 1, faddch);	else if (aend == UE)		tputs(UEcolor, 1, faddch);	else if (aend == AE)		tputs(AEcolor, 1, faddch);	else if (aend == SE)		tputs(SEcolor, 1, faddch);	aend = "";	return 0;}#endif /* !NO_COLOR */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -