📄 screen.c
字号:
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 + -