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

📄 screen.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 5 页
字号:
		srp[col] = srp[col - count];	    }	    if (*slp != -1)	    {		*slp += count;		MIN_IT(*slp, r->TermWin.ncol);	    }	    if (		  SEL(r).op && SEL(r).vt == page		  && PVTS(r, page)->current_screen == SEL(r).screen		  && RC_ROW_ATAFTER(SEL(r).beg, PSCR(r, page).cur)	       )	    {		if (		      SEL(r).end.row != CURROW		      || (SEL(r).end.col + count >= r->TermWin.ncol)		   )		    CLEAR_SELECTION(r);		else	    /* shift selection */		{		    SEL(r).beg.col += count;		    SEL(r).mark.col += count;	/* XXX: yes? */		    SEL(r).end.col += count;		}	    }	    rxvt_blank_line(&(stp[CURCOL]),		&(srp[CURCOL]),		(unsigned int)count, PVTS(r, page)->rstyle);	    break;	case ERASE:	    CURCOL += count;	/* don't worry if > r->TermWin.ncol */	    rxvt_selection_check(r, page, 1);	    CURCOL -= count;	    rxvt_blank_line(&(stp[CURCOL]),		&(srp[CURCOL]),		(unsigned int)count, PVTS(r, page)->rstyle);	    break;	case DELETE:	    tr = srp[r->TermWin.ncol - 1]		 & (RS_fgMask | RS_bgMask | RS_baseattrMask);	    for (col = CURCOL; (col + count) < r->TermWin.ncol; col++)	    {		stp[col] = stp[col + count];		srp[col] = srp[col + count];	    }	    rxvt_blank_line(&(stp[r->TermWin.ncol - count]),		&(srp[r->TermWin.ncol - count]),		(unsigned int)count, tr);	    if (*slp == -1) /* break line continuation */		*slp = r->TermWin.ncol;	    *slp -= count;	    MAX_IT(*slp, 0);	    if (		  SEL(r).op && SEL(r).vt == page		  && PVTS(r, page)->current_screen == SEL(r).screen		  && RC_ROW_ATAFTER(SEL(r).beg, PSCR(r, page).cur)	       )	    {		if (		      SEL(r).end.row != CURROW		      || (CURCOL >= SEL(r).beg.col - count)		      || SEL(r).end.col >= r->TermWin.ncol		   )		    CLEAR_SELECTION(r);		else		{		    /* shift selection */		    SEL(r).beg.col -= count;		    SEL(r).mark.col -= count;	/* XXX: yes? */		    SEL(r).end.col -= count;		}	    }	    break;    }#if 0    if (IS_MULTI2(srp[0]))    {	srp[0] &= ~RS_multiMask;	stp[0] = ' ';    }    if (IS_MULTI1(srp[r->TermWin.ncol - 1]))    {	srp[r->TermWin.ncol - 1] &= ~RS_multiMask;	stp[r->TermWin.ncol - 1] = ' ';    }#endif}/* ------------------------------------------------------------------------- *//* * Set the scrolling region * XTERM_SEQ: Set region <top> - <bot> inclusive: ESC [ <top> ; <bot> r *//* EXTPROTO */voidrxvt_scr_scroll_region(rxvt_t* r, int page, int top, int bot){    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN,		"rxvt_scr_scroll_region( %d, %d, %d)\n", page, top, bot));    MAX_IT(top, 0);    MIN_IT(bot, (int)r->TermWin.nrow - 1);    if (top > bot)	return;    PSCR(r, page).tscroll = top;    PSCR(r, page).bscroll = bot;    rxvt_scr_gotorc(r, page, 0, 0, 0);}/* ------------------------------------------------------------------------- *//* * Make the cursor visible/invisible * XTERM_SEQ: Make cursor visible  : ESC [ ? 25 h * XTERM_SEQ: Make cursor invisible: ESC [ ? 25 l *//* EXTPROTO */voidrxvt_scr_cursor_visible(rxvt_t* r, int page, int mode){    PVTS(r, page)->want_refresh = 1;    if (mode)	PSCR(r, page).flags |= Screen_VisibleCursor;    else	PSCR(r, page).flags &= ~Screen_VisibleCursor;}/* ------------------------------------------------------------------------- *//* * Set/unset automatic wrapping * XTERM_SEQ: Set Wraparound  : ESC [ ? 7 h * XTERM_SEQ: Unset Wraparound: ESC [ ? 7 l *//* EXTPROTO */voidrxvt_scr_autowrap(rxvt_t* r, int page, int mode){    if (mode)	PSCR(r, page).flags |= Screen_Autowrap;    else	PSCR(r, page).flags &= ~(Screen_Autowrap | Screen_WrapNext);}/* ------------------------------------------------------------------------- *//* * Set/unset margin origin mode * Absolute mode: line numbers are counted relative to top margin of screen *    and the cursor can be moved outside the scrolling region. * Relative mode: line numbers are relative to top margin of scrolling region *    and the cursor cannot be moved outside. * XTERM_SEQ: Set Absolute: ESC [ ? 6 h * XTERM_SEQ: Set Relative: ESC [ ? 6 l *//* EXTPROTO */voidrxvt_scr_relative_origin(rxvt_t* r, int page, int mode){    if (mode)	PSCR(r, page).flags |= Screen_Relative;    else	PSCR(r, page).flags &= ~Screen_Relative;    rxvt_scr_gotorc(r, page, 0, 0, 0);}/* ------------------------------------------------------------------------- *//* * Set insert/replace mode * XTERM_SEQ: Set Insert mode : ESC [ ? 4 h * XTERM_SEQ: Set Replace mode: ESC [ ? 4 l *//* EXTPROTO */voidrxvt_scr_insert_mode(rxvt_t* r, int page, int mode){    if (mode)	PSCR(r, page).flags |= Screen_Insert;    else	PSCR(r, page).flags &= ~Screen_Insert;}/* ------------------------------------------------------------------------- *//* * Set/Unset tabs * XTERM_SEQ: Set tab at current column  : ESC H * XTERM_SEQ: Clear tab at current column: ESC [ 0 g * XTERM_SEQ: Clear all tabs		 : ESC [ 3 g *//* EXTPROTO */voidrxvt_scr_set_tab(rxvt_t* r, int page, int mode){    if (mode < 0)	MEMSET(r->tabstop, 0, r->TermWin.ncol * sizeof(char));    else if (PSCR(r, page).cur.col < r->TermWin.ncol)	r->tabstop[PSCR(r, page).cur.col] = (mode ? 1 : 0);}/* ------------------------------------------------------------------------- *//* * Set reverse/normal video * XTERM_SEQ: Reverse video: ESC [ ? 5 h * XTERM_SEQ: Normal video : ESC [ ? 5 l *//* EXTPROTO */voidrxvt_scr_rvideo_mode(rxvt_t* r, int page, int mode){    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN, "%s(r, page=%d, mode=%d)\n", __func__, page, mode ));    if (PVTS(r, page)->rvideo != mode)    {	PVTS(r, page)->rvideo = mode;	SWAP_IT( PVTS(r, page)->p_fg, PVTS(r, page)->p_bg, unsigned long );#ifdef XFT_SUPPORT	if( ISSET_OPTION( r, Opt_xft ) )	    SWAP_IT( PVTS(r, page)->p_xftfg, PVTS(r, page)->p_xftbg, XftColor );#endif	if( r->TermWin.fade )	{	    SWAP_IT( PVTS(r, page)->p_fgfade, PVTS(r, page)->p_bgfade,		    unsigned long );#ifdef XFT_SUPPORT	    if( ISSET_OPTION( r, Opt_xft ) )		SWAP_IT( PVTS(r, page)->p_xftfgfade, PVTS(r, page)->p_xftbgfade,			XftColor );#endif	}	if( page == ATAB(r) )	{	    /* Background colors need to be forcibly reset */	    r->fgbg_tabnum = -1;	    rxvt_set_vt_colors( r, ATAB(r) );	}	rxvt_scr_clear( r, page );	rxvt_scr_touch( r, page, True );    }}/* ------------------------------------------------------------------------- *//* * Report current cursor position * XTERM_SEQ: Report position: ESC [ 6 n *//* EXTPROTO */voidrxvt_scr_report_position(rxvt_t* r, int page){    rxvt_tt_printf(r, page, "\033[%d;%dR", CURROW + 1, CURCOL + 1);}/* ------------------------------------------------------------------------- * *				  FONTS					* * ------------------------------------------------------------------------- *//* * Set font style *//* INTPROTO */voidrxvt_set_font_style(rxvt_t *r, int page){    PVTS(r, page)->rstyle &= ~RS_fontMask;    switch (PVTS(r, page)->charsets[PSCR(r, page).charset])    {	case '0':	    /* DEC Special Character & Line Drawing Set */	    PVTS(r, page)->rstyle |= RS_acsFont;	    break;	case 'A':	    /* United Kingdom (UK) */	    PVTS(r, page)->rstyle |= RS_ukFont;	    break;	case 'B':	    /* United States (USASCII) */	    break;	case '<':	    /* Multinational character set */	    break;	case '5':	    /* Finnish character set */	    break;	case 'C':	    /* Finnish character set */	    break;	case 'K':	    /* German character set */	    break;    }}/* ------------------------------------------------------------------------- *//* * Choose a font * XTERM_SEQ: Invoke G0 character set: CTRL-O * XTERM_SEQ: Invoke G1 character set: CTRL-N * XTERM_SEQ: Invoke G2 character set: ESC N * XTERM_SEQ: Invoke G3 character set: ESC O *//* EXTPROTO */voidrxvt_scr_charset_choose(rxvt_t* r, int page, int set){    PSCR(r, page).charset = set;    rxvt_set_font_style(r, page);}/* ------------------------------------------------------------------------- *//* * Set a font * XTERM_SEQ: Set G0 character set: ESC ( <C> * XTERM_SEQ: Set G1 character set: ESC ) <C> * XTERM_SEQ: Set G2 character set: ESC * <C> * XTERM_SEQ: Set G3 character set: ESC + <C> * See set_font_style for possible values for <C> *//* EXTPROTO */voidrxvt_scr_charset_set(rxvt_t* r, int page, int set, unsigned int ch){#ifdef MULTICHAR_SET    PVTS(r, page)->multi_byte = !!(set < 0);    set = abs(set);#endif    PVTS(r, page)->charsets[set] = (unsigned char)ch;    rxvt_set_font_style(r, page);}/* ------------------------------------------------------------------------- * *			MAJOR SCREEN MANIPULATION			  * * ------------------------------------------------------------------------- *//* * Refresh an area */enum{    PART_BEG = 0,    PART_END,    RC_COUNT};/* EXTPROTO */voidrxvt_scr_expose(rxvt_t* r, int page,	int x, int y, int width, int height,	Bool refresh){    int		 i;    row_col_t	   rc[RC_COUNT];    if (PVTS(r, page)->drawn_text == NULL)  /* sanity check */	return;    x = max(x, (int)r->TermWin.int_bwidth);    x = min(x, (int)r->szHint.width);    y = max(y, (int)r->TermWin.int_bwidth);    y = min(y, (int)r->szHint.height);    /* round down */    rc[PART_BEG].col = Pixel2Col(x);    rc[PART_BEG].row = Pixel2Row(y);    /* round up */    rc[PART_END].col = Pixel2Width(x + width + r->TermWin.fwidth - 1);    rc[PART_END].row = Pixel2Row(y + height + r->TermWin.fheight - 1);    /* sanity checks */    for (i = PART_BEG; i < RC_COUNT; i++)    {	MIN_IT(rc[i].col, r->TermWin.ncol - 1);	MIN_IT(rc[i].row, r->TermWin.nrow - 1);    }    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_expose %d (x:%d, y:%d, w:%d, h:%d) area (c:%d,r:%d)-(c:%d,r:%d)\n", page, x, y, width, height, rc[PART_BEG].col, rc[PART_BEG].row, rc[PART_END].col, rc[PART_END].row));	{		register int	j = rc[PART_BEG].col;		register int	k = rc[PART_END].col - rc[PART_BEG].col + 1;		for (i = rc[PART_BEG].row; i <= rc[PART_END].row; i++)		{			rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN, " memset drawn_text[%d][%d], len=%d\n", i, j, k));			MEMSET(&(PVTS(r, page)->drawn_text[i][j]), 0, k);		}	 }    if (refresh)    {	rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "Forcing immediate screen refresh"));	rxvt_scr_refresh(r, page, SLOW_REFRESH | REFRESH_BOUNDS);    }}/* ------------------------------------------------------------------------- *//* * Refresh the entire screen *//* EXTPROTO */voidrxvt_scr_touch(rxvt_t* r, int page, Bool refresh){    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_touch\n"));    rxvt_scr_expose(r, page, 0, 0, VT_WIDTH(r), VT_HEIGHT(r), refresh);}/* ------------------------------------------------------------------------- *//* * Move the display so that the line represented by scrollbar value Y is at * the top of the screen *//* EXTPROTO */intrxvt_scr_move_to(rxvt_t* r, int page, int y, int len){    long	    p = 0;    uint16_t	    oldviewstart;    oldviewstart = VSTART;    if (y < len)    {	p = (r->TermWin.nrow + PVTS(r, page)->nscrolled) * (len - y) / len;	p -= (long)(r->TermWin.nrow - 1);	p = max(p, 0);    }    VSTART = (uint16_t)min(p, PVTS(r, page)->nscrolled);    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN, "rxvt_scr_move_to %d (%d, %d) view_start:%d\n", page, y, len, VSTART));    return rxvt_scr_change_view(r, page, oldviewstart);}/* ------------------------------------------------------------------------- *//* * Page the screen up/down nlines * direction should be UP or DN *//* EXTPROTO */intrxvt_scr_page(rxvt_t* r, int page, enum page_dirn direction, int nlines){    int		n;    uint16_t	oldviewstart;    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN, "rxvt_scr_page %d (%s, %d) view_start:%d\n", page, ((direction == UP) ? "UP" : "DN"), nlines, VSTART));    oldviewstart = VSTART;    if (direction == UP)    {	n = VSTART + nlines;	VSTART = min(n, PVTS(r, page)->nscrolled);    }    else    {	n = VSTART - nlines;	VSTART = max(n, 0);    }    return rxvt_scr_change_view(r, page, oldviewstart);}/* INTPROTO */intrxvt_scr_change_view(rxvt_t* r, int page, uint16_t oldviewstart){    if (VSTART != oldviewstart)    {	PVTS(r, page)->wa

⌨️ 快捷键说明

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