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

📄 screen.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* add rows */    rxvt_scr_reset_realloc(r, page);	/* realloc _first_ */    i = min(PVTS(r, page)->nscrolled, nrow - prev_nrow);    for (p = prev_total_rows; p < total_rows; p++)    {	PSCR(r, page).tlen[p] = 0;	PSCR(r, page).text[p] = NULL;	PSCR(r, page).rend[p] = NULL;    }    for (p = prev_total_rows; p < total_rows - i; p++)	rxvt_blank_screen_mem (r, page, PSCR(r, page).text,	    PSCR(r, page).rend, p, DEFAULT_RSTYLE);    for (p = prev_nrow; p < nrow; p++)    {#if NSCREENS	PVTS(r, page)->swap.tlen[p] = 0;	PVTS(r, page)->swap.text[p] = NULL;	PVTS(r, page)->swap.rend[p] = NULL;	rxvt_blank_screen_mem (r, page, PVTS(r, page)->swap.text,	    PVTS(r, page)->swap.rend, p, DEFAULT_RSTYLE);#endif	PVTS(r, page)->drawn_text[p] = NULL;	PVTS(r, page)->drawn_rend[p] = NULL;	rxvt_blank_screen_mem (r, page, PVTS(r, page)->drawn_text,	    PVTS(r, page)->drawn_rend, p, DEFAULT_RSTYLE);    }    if (i > 0)    {	rxvt_scroll_text(r, page, 0, (int)nrow - 1, -i, 1);	PSCR(r, page).cur.row += i;	PSCR(r, page).s_cur.row += i;	PVTS(r, page)->nscrolled -= i;    }    assert(PSCR(r, page).cur.row < r->TermWin.nrow);    MIN_IT(PSCR(r, page).cur.row, nrow - 1);#if NSCREENS    assert(PVTS(r, page)->swap.cur.row < r->TermWin.nrow);    MIN_IT(PVTS(r, page)->swap.cur.row, nrow - 1);#endif}/* INTPROTO */voidrxvt_scr_adjust_col (rxvt_t* r, int page, unsigned int total_rows){    unsigned int    nrow, ncol, prev_ncol;    unsigned int    p;    nrow = r->TermWin.nrow;    ncol = r->TermWin.ncol;    prev_ncol = PVTS(r, page)->prev_ncol;    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN, "%s( r, page=%d, total_rows=%u ):" "ncol=%d, prev_ncol=%d, nrow=%d\n", __func__, page, total_rows, ncol, prev_ncol, nrow ));    for (p = 0; p < total_rows; p++)    {	if (PSCR(r, page).text[p])	{	    PSCR(r, page).text[p] = rxvt_realloc (		PSCR(r, page).text[p], ncol * sizeof(text_t));	    PSCR(r, page).rend[p] = rxvt_realloc (		PSCR(r, page).rend[p], ncol * sizeof(rend_t));	    MIN_IT(PSCR(r, page).tlen[p], (int16_t)ncol);	    if (ncol > prev_ncol)		rxvt_blank_line (		    &(PSCR(r, page).text[p][prev_ncol]),		    &(PSCR(r, page).rend[p][prev_ncol]),		    ncol - prev_ncol, DEFAULT_RSTYLE);	}    }    for (p = 0; p < nrow; p++)    {	PVTS(r, page)->drawn_text[p] = rxvt_realloc (	    PVTS(r, page)->drawn_text[p], ncol * sizeof(text_t));	PVTS(r, page)->drawn_rend[p] = rxvt_realloc (	    PVTS(r, page)->drawn_rend[p], ncol * sizeof(rend_t));#if NSCREENS	if (PVTS(r, page)->swap.text[p])	{	    PVTS(r, page)->swap.text[p] = rxvt_realloc (		PVTS(r, page)->swap.text[p], ncol * sizeof(text_t));	    PVTS(r, page)->swap.rend[p] = rxvt_realloc (		PVTS(r, page)->swap.rend[p], ncol * sizeof(rend_t));	    MIN_IT(PVTS(r, page)->swap.tlen[p], (int16_t)ncol);	    if (ncol > prev_ncol)		rxvt_blank_line(		    &(PVTS(r, page)->swap.text[p][prev_ncol]),		    &(PVTS(r, page)->swap.rend[p][prev_ncol]),		    ncol - prev_ncol, DEFAULT_RSTYLE);	}#endif	if (ncol > prev_ncol)	    rxvt_blank_line(		&(PVTS(r, page)->drawn_text[p][prev_ncol]),		&(PVTS(r, page)->drawn_rend[p][prev_ncol]),		ncol - prev_ncol, DEFAULT_RSTYLE);    }    MIN_IT(PSCR(r, page).cur.col, (int16_t)ncol - 1);#if NSCREENS    MIN_IT(PVTS(r, page)->swap.cur.col, (int16_t)ncol - 1);#endif    /*    ** Only reset tabstop if expanding columns, save realloc in    ** shrinking columns    */    if (r->tabstop && ncol > prev_ncol)    {	rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "expand r->tabstop to %d\n", ncol));	r->tabstop = rxvt_realloc(r->tabstop, ncol * sizeof(char));	for (p = prev_ncol; p < ncol; p++)	    r->tabstop[p] = (p % TABSTOP_SIZE == 0) ? 1 : 0;    }}/* EXTPROTO */voidrxvt_scr_reset(rxvt_t* r, int page){    unsigned int    ncol, nrow, prev_ncol, prev_nrow,		    total_rows, prev_total_rows;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_reset %d ()\n", page));    VSTART = 0;    RESET_CHSTAT(r, page);    PVTS(r, page)->num_scr = 0;	/* number of lines scrolled */    prev_ncol = PVTS(r, page)->prev_ncol;    prev_nrow = PVTS(r, page)->prev_nrow;    if (r->TermWin.ncol == 0)	r->TermWin.ncol = 80;    if (r->TermWin.nrow == 0)	r->TermWin.nrow = 24;    ncol = r->TermWin.ncol;    nrow = r->TermWin.nrow;    if (PVTS(r, page)->init_screen &&	ncol == prev_ncol && nrow == prev_nrow)	return;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_reset %d () refresh screen\n", page));    PVTS(r, page)->want_refresh = 1;    total_rows = nrow + SVLINES;    prev_total_rows = prev_nrow + SVLINES;    PSCR(r, page).tscroll = 0;    PSCR(r, page).bscroll = nrow - 1;    if (PVTS(r, page)->init_screen == 0)    {	/* Initialize the screen structures */	rxvt_scr_alloc (r, page);    }    else    {	/* B1: resize rows */	if (nrow < prev_nrow)	{	    rxvt_scr_delete_row (r, page);	}	else if (nrow > prev_nrow)	{	    rxvt_scr_add_row (r, page, total_rows, prev_total_rows);	}	/* B2: resize columns */	if (ncol != prev_ncol)	{	    rxvt_scr_adjust_col (r, page, total_rows);	}    }    PVTS(r, page)->prev_nrow = nrow;    PVTS(r, page)->prev_ncol = ncol;    rxvt_tt_winsize(PVTS(r, page)->cmd_fd, r->TermWin.ncol, r->TermWin.nrow, PVTS(r, page)->cmd_pid);}/* ------------------------------------------------------------------------- *//* * Free everything.  That way malloc debugging can find leakage. *//* EXTPROTO */voidrxvt_scr_release(rxvt_t* r, int page){    unsigned int    total_rows;    int		    i;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_release %d ()\n", page));    total_rows = r->TermWin.nrow + SVLINES;    for (i = 0; i < total_rows; i++)    {	if (PSCR(r, page).text[i])	{	    /* then so is PSCR(r, page).rend[i] */	    rxvt_free(PSCR(r, page).text[i]);	    PSCR(r, page).text[i] = NULL;	    assert(PSCR(r, page).rend[i]);	    rxvt_free(PSCR(r, page).rend[i]);	    PSCR(r, page).rend[i] = NULL;	}    }    for (i = 0; i < r->TermWin.nrow; i++)    {	/* if (PVTS(r, page)->drawn_text[i]) */	    rxvt_free(PVTS(r, page)->drawn_text[i]);	PVTS(r, page)->drawn_text[i] = NULL;	/* if (PVTS(r, page)->drawn_rend[i]) */	    rxvt_free(PVTS(r, page)->drawn_rend[i]);	PVTS(r, page)->drawn_rend[i] = NULL;#if NSCREENS	/* if (PVTS(r, page)->swap.text[i]) */	    rxvt_free(PVTS(r, page)->swap.text[i]);	PVTS(r, page)->swap.text[i] = NULL;	/* if (PVTS(r, page)->swap.rend[i])) */	    rxvt_free(PVTS(r, page)->swap.rend[i]);	PVTS(r, page)->swap.rend[i] = NULL;#endif    }    rxvt_free(PSCR(r, page).text); PSCR(r, page).text = NULL;    rxvt_free(PSCR(r, page).tlen); PSCR(r, page).tlen = NULL;    rxvt_free(PSCR(r, page).rend); PSCR(r, page).rend = NULL;    rxvt_free(PVTS(r, page)->drawn_text);  PVTS(r, page)->drawn_text = NULL;    rxvt_free(PVTS(r, page)->drawn_rend);  PVTS(r, page)->drawn_rend = NULL;#if NSCREENS    rxvt_free(PVTS(r, page)->swap.text);   PVTS(r, page)->swap.text = NULL;    rxvt_free(PVTS(r, page)->swap.tlen);   PVTS(r, page)->swap.tlen = NULL;    rxvt_free(PVTS(r, page)->swap.rend);   PVTS(r, page)->swap.rend = NULL;#endif    rxvt_free(PVTS(r, page)->buf_text);	PVTS(r, page)->buf_text = NULL;    rxvt_free(PVTS(r, page)->buf_rend);	PVTS(r, page)->buf_rend = NULL;    /* next rxvt_scr_reset will be the first time initialization */    PVTS(r, page)->init_screen = 0;    /* clear selection if necessary */    if (page == r->selection.vt)    {	rxvt_process_selectionclear (r, page);    }}/* ------------------------------------------------------------------------- *//* * Hard reset *//* EXTPROTO */voidrxvt_scr_poweron(rxvt_t* r, int page){    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_poweron %d ()\n", page));    rxvt_scr_release(r, page);    PVTS(r, page)->prev_nrow = PVTS(r, page)->prev_ncol = 0;    rxvt_scr_reset(r, page);    rxvt_scr_clear(r, page);    rxvt_scr_refresh(r, page, SLOW_REFRESH);}/* ------------------------------------------------------------------------- * *			 PROCESS SCREEN COMMANDS			   * * ------------------------------------------------------------------------- *//* * Save and Restore cursor * XTERM_SEQ: Save cursor   : ESC 7 * XTERM_SEQ: Restore cursor: ESC 8 *//* EXTPROTO */voidrxvt_scr_cursor(rxvt_t* r, int page, int mode){    screen_t	   *s;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_cursor %d (%c)\n", page, mode));#if NSCREENS && !defined(NO_SECONDARY_SCREEN_CURSOR)    if (PVTS(r, page)->current_screen == SECONDARY)	s = &(PVTS(r, page)->swap);    else#endif    s = &(PSCR(r, page));    switch (mode)    {	case SAVE:	    s->s_cur.row = s->cur.row;	    s->s_cur.col = s->cur.col;	    s->s_rstyle = PVTS(r, page)->rstyle;	    s->s_charset = s->charset;	    s->s_charset_char = PVTS(r, page)->charsets[s->charset];	    break;	case RESTORE:	    PVTS(r, page)->want_refresh = 1;	    s->cur.row = s->s_cur.row;	    s->cur.col = s->s_cur.col;	    s->flags &= ~Screen_WrapNext;	    PVTS(r, page)->rstyle = s->s_rstyle;	    s->charset = s->s_charset;	    PVTS(r, page)->charsets[s->charset] = s->s_charset_char;	    rxvt_set_font_style(r, page);	    break;    }/* boundary check in case screen size changed between SAVE and RESTORE */    MIN_IT(s->cur.row, r->TermWin.nrow - 1);    MIN_IT(s->cur.col, r->TermWin.ncol - 1);    assert(s->cur.row >= 0);    assert(s->cur.col >= 0);    MAX_IT(s->cur.row, 0);    MAX_IT(s->cur.col, 0);}/* ------------------------------------------------------------------------- *//* * Swap between primary and secondary screens * XTERM_SEQ: Primary screen  : ESC [ ? 4 7 h * XTERM_SEQ: Secondary screen: ESC [ ? 4 7 l *//* EXTPROTO */intrxvt_scr_change_screen(rxvt_t* r, int page, int scrn){#if NSCREENS    unsigned int	i, offset;#endif    PVTS(r, page)->want_refresh = 1;    rxvt_dbgmsg ((DBG_VERBOSE, DBG_SCREEN, "rxvt_scr_change_screen %d (%d)\n", page, scrn));    VSTART = 0;    RESET_CHSTAT(r, page);    if (PVTS(r, page)->current_screen == scrn)	return PVTS(r, page)->current_screen;    rxvt_selection_check(r, page, 2);	/* check for boundary cross */    SWAP_IT(PVTS(r, page)->current_screen, scrn, int);#if NSCREENS    PVTS(r, page)->num_scr = 0;    offset = SVLINES;    for (i = PVTS(r, page)->prev_nrow; i--;)    {	SWAP_IT(PSCR(r, page).text[i + offset],	    PVTS(r, page)->swap.text[i], text_t *);	SWAP_IT(PSCR(r, page).tlen[i + offset],	    PVTS(r, page)->swap.tlen[i], int16_t);	SWAP_IT(PSCR(r, page).rend[i + offset],	    PVTS(r, page)->swap.rend[i], rend_t *);    }    SWAP_IT(CURROW, PVTS(r, page)->swap.cur.row, int16_t);    SWAP_IT(CURCOL, PVTS(r, page)->swap.cur.col, int16_t);    assert (CURROW >= 0);    assert (CURROW < PVTS(r, page)->prev_nrow);    assert (CURCOL >= 0);    assert (CURCOL < PVTS(r, page)->prev_ncol);    MAX_IT(CURROW, 0);    MIN_IT(CURROW, (int32_t)PVTS(r, page)->prev_nrow - 1);    MAX_IT(CURCOL, 0);    MIN_IT(CURCOL, (int32_t)PVTS(r, page)->prev_ncol - 1);    SWAP_IT(PSCR(r, page).charset, PVTS(r, page)->swap.charset,	int16_t);    SWAP_IT(PSCR(r, page).flags, PVTS(r, page)->swap.flags, int);    PSCR(r, page).flags |= Screen_VisibleCursor;    PVTS(r, page)->swap.flags |= Screen_VisibleCursor;#else# ifdef SCROLL_ON_NO_SECONDARY    if (PVTS(r, page)->current_screen == PRIMARY)	rxvt_scroll_text(r, page, 0, (PVTS(r, page)->prev_nrow - 1),	    PVTS(r, page)->prev_nrow, 0);# endif#endif    /* Need to update tabbar buttons */    if (ISSET_OPTION(r, Opt2_protectSecondary))	rxvt_tabbar_draw_buttons (r);    return scrn;}/* ------------------------------------------------------------------------- *//* * Change the colour for following text *//* EXTPROTO */voidrxvt_scr_color(rxvt_t* r, int page, unsigned int color, int fgbg){    color &= RS_fgMask;    if (Color_fg == fgbg)	PVTS(r, page)->rstyle=SET_FGCOLOR(PVTS(r, page)->rstyle, color);    else 	PVTS(r, page)->rstyle=SET_BGCOLOR(PVTS(r, page)->rstyle, color);}/* ------------------------------------------------------------------------- *//* * Change the rendition style for following text *//* EXTPROTO */voidrxvt_scr_rendition(rxvt_t* r, int page, int set, int style){    if (set)	PVTS(r, page)->rstyle |= style;    else if (style == ~RS_None)	PVTS(r, page)->rstyle = DEFAULT_RSTYLE | (PVTS(r, page)->rstyle & RS_fontMask);    else	PVTS(r, page)->rstyle &= ~style;}/* ------------------------------------------------------------------------- *//* * Scroll text between <row1> and <row2> inclusive, by <count> lines * count positive ==> scroll up * count negative ==> scroll down * spec == 0 for normal routines *//* EXTPROTO */intrxvt_scroll_text(rxvt_t* r, int page, int row1, int row2, int count, int spec){    int		    i, j, ret;    unsigned int    nscrolled;    size_t 	    size;    if (count == 0 || (row1 > row2))	return 0;    PVTS(r, page)->want_refresh = 1;    rxvt_dbgmsg ((DBG_DEBUG, DBG_SCREEN,		"rxvt_scroll_text %d (%d,%d,%d,%d): %s\n", page, row1, row2,		count, spec, (PVTS(r, page)->current_screen == PRIMARY) ?		    "Primary" : "Secondary" ));    if (	  (count > 0)	  && (row1 == 0)

⌨️ 快捷键说明

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