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

📄 vidupdate.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ifndef lintstatic	char sccsid[] = "@(#)vidupdate.c 1.1 92/07/30 SMI"; /* from S5R3.1 1.10 */#endif#include	"curses_inc.h"#define	NUM_OF_SPECIFIC_TURN_OFFS	3extern	chtype	bit_attributes[];voidvidupdate(newmode, oldmode, outc)register	chtype	newmode, oldmode;register	int	(*outc)();{    /* If you have set_attributes let the terminfo writer worry about it. */    if (!set_attributes)    {	/*	 * The trick is that we want to pre-process the new and oldmode	 * so that we now know what they will really translate to on	 * the physical screen.	 * In the case where some attributes are being faked	 * we get rid of the attributes being asked for and just have	 * STANDOUT mode set.  Therefore, if STANDOUT and UNDERLINE were	 * on the screen but UNDERLINE was being faked to STANDOUT; and	 * the new mode is just UNDERLINE, we will get rid of any faked	 * modes and be left with and oldmode of STANDOUT and a new mode	 * of STANDOUT, in which case the check for newmode and oldmode	 * being equal will be true.	 *	 *	 * This test is similar to the concept explained above.	 * counter is the maximum attributes allowed on a terminal.	 * For instance, on an hp/tvi950 without set_attributes	 * the last video sequence sent will be the one the terminal	 * will be in (on that spot).  Therefore, in setupterm.c	 * if ceol_standout_glitch or magic_cookie_glitch is set	 * max_attributes is set to 1.  This is because on those terminals	 * only one attribute can be on at once.  So, we pre-process the	 * oldmode and the newmode and only leave the bits that are	 * significant.  In other words, if on an hp you ask for STANDOUT	 * and UNDERLINE it will become only STANDOUT since that is the	 * first bit that is looked at.  If then the user goes from	 * STANDOUT and UNDERLINE to STANDOUT and REVERSE the oldmode will	 * become STANDOUT and the newmode will become STANDOUT.	 *	 * This also helps the code below in that on a hp or tvi950 only	 * one bit will ever be set so that no code has to be added to	 * cut out early in case two attributes were asked for.	 */	chtype	check_faked, modes[2];	int	counter = max_attributes, i, j, tempmode, k;	if (oldmode == cur_term->non_faked_mode)	    oldmode = cur_term->sgr_mode;	k = (cur_term->sgr_mode == oldmode) ? 1 : 2;	modes[0] = cur_term->non_faked_mode = newmode;	modes[1] = oldmode;	while (k-- > 0)	{	    if ((check_faked = (modes[k] & cur_term->sgr_faked)) != A_NORMAL)	    {		modes[k] &= ~check_faked;		modes[k] |= A_STANDOUT;	    }	    if ((j = counter) >= 0)	    {		tempmode = A_NORMAL;		if (j > 0)		{		    for (i = 0; i < NUM_ATTRIBUTES; i++)		    {			if (modes[k] & bit_attributes[i])			{			    tempmode |= bit_attributes[i];			    if (--j == 0)				break;			}		    }		}		modes[k] = tempmode;	    }	}	newmode = modes[0];	oldmode = modes[1];    }    if (newmode == oldmode)	return;#ifdef	DEBUG    if (outf)	fprintf(outf, "vidupdate oldmode=%o, newmode=%o\n", oldmode, newmode);#endif	/* DEBUG */    if (set_attributes)    {	tputs(tparm(set_attributes,			newmode & A_STANDOUT,			newmode & A_UNDERLINE,			newmode & A_REVERSE,			newmode & A_BLINK,			newmode & A_DIM,			newmode & A_BOLD,			newmode & A_INVIS,			newmode & A_PROTECT,			newmode & A_ALTCHARSET),		1, outc);    }    else    {	register	chtype	turn_on, turn_off;	int			i;	/*	 * If we are going to turn something on anyway and we are	 * on a glitchy terminal, don't bother turning it off	 * since by turning something on you turn everything else off.	 */	if ((ceol_standout_glitch || magic_cookie_glitch >= 0) &&	    ((turn_on = ((oldmode ^ newmode) & newmode)) != A_NORMAL))	{	    goto turn_on_code;	}	if ((turn_off = (oldmode & newmode) ^ oldmode) != A_NORMAL)	{	    /*	     * Check for things to turn off.	     * First see if we are going to turn off something	     * that doesn't have a specific turn off capability.	     * If we are, and if there is a generic "turn all attributes	     * off" capability, use it.	     */	    if (exit_attribute_mode != 0 &&		((turn_off & ~(A_ALTCHARSET | A_STANDOUT | A_UNDERLINE)) ||		(turn_off != (turn_off & cur_term->check_turn_off))))	    {		tputs(exit_attribute_mode, 1, outc);		oldmode = A_NORMAL;	    }	    else	    {		for (i = 0; i < NUM_OF_SPECIFIC_TURN_OFFS; i++)		    if (turn_off & bit_attributes[i])			tputs(cur_term->turn_off_seq[i], 1, outc);		/*		 * We have to assume that any exit_video_mode will		 * turn everything off, except for alternate char. set.		 * So, the only thing we leave on in our oldmode is		 * A_ALTCHARSET if it was and will be on.		 */		oldmode = (oldmode & newmode & A_ALTCHARSET);	    }	}	if ((turn_on = ((oldmode ^ newmode) & newmode)) != A_NORMAL)	{turn_on_code:	    /* Check for modes to turn on. */	    for (i = 0; i < NUM_ATTRIBUTES; i++)		if (turn_on & bit_attributes[i])		{		    tputs(cur_term->turn_on_seq[i], 1, outc);		    /*		     * Keep turning off the bit(s) that we just sent to		     * the screen.  As soon as turn_on reaches A_NORMAL		     * we don't have to turn anything else on and we can		     * break out of the loop.		     */		    if ((turn_on &= ~bit_attributes[i]) == A_NORMAL)			break;		}	}	if (magic_cookie_glitch > 0)	    tputs(cursor_left, 1, outc);    }    cur_term->sgr_mode = newmode;}

⌨️ 快捷键说明

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