📄 init.c
字号:
#endif DEFAULT_DISPLAY_TAB_TXT; if( rs[Rs_minVisibleTabs] ) { register int n = atoi( rs[Rs_minVisibleTabs] ); r->TermWin.minVisibleTabs = (n >= 2 && n <= MAX_PAGES) ? n : DEFAULT_MIN_VISIBLE_TABS; } else r->TermWin.minVisibleTabs = DEFAULT_MIN_VISIBLE_TABS;#ifndef NO_FRILLS if (rs[Rs_int_bwidth]) { register int tmp = atoi( rs[Rs_int_bwidth] ); r->TermWin.int_bwidth =( tmp >= 0 && tmp <= MAX_INTERNALBORDERWIDTH ) ? tmp : DEFAULT_INTERNALBORDERWIDTH; } if (rs[Rs_ext_bwidth]) { register int tmp = atoi( rs[Rs_ext_bwidth] ); r->TermWin.ext_bwidth = (tmp >= 0 && tmp <= MAX_EXTERNALBORDERWIDTH) ? tmp : DEFAULT_EXTERNALBORDERWIDTH; }#endif#ifndef NO_LINESPACE if (rs[Rs_lineSpace]) { register int tmp = atoi( rs[Rs_lineSpace] ); r->TermWin.lineSpace = (tmp >= 0 && tmp <= MAX_LINESPACE) ? tmp : DEFAULT_LINESPACE; }#endif#ifdef POINTER_BLANK if (rs[Rs_pointerBlankDelay]) { register int tmp = atoi( rs[Rs_pointerBlankDelay] ); r->h->pointerBlankDelay = (tmp >= 0 && tmp <= MAX_BLANKDELAY) ? tmp : DEFAULT_BLANKDELAY; }#endif /* Handle opacity of translucent window */ if (rs[Rs_opacity]) { register int tmp = atoi( rs[Rs_opacity] ); r->TermWin.opacity = (tmp >= 0 && tmp <= 100) ? 100 - tmp : 0;#ifdef TRANSPARENT if ( None != r->h->xa[XA_NET_WM_WINDOW_OPACITY] && r->Options & Opt_transparent ) { /* Override pseudo-transparent */ r->Options &= ~Opt_transparent; }#endif } if (rs[Rs_opacityDegree]) { register int tmp = atoi (rs[Rs_opacityDegree]); r->TermWin.opacity_degree = (tmp > 0 && tmp <= 100) ? tmp : 1; }#ifdef TINTING_SUPPORT if (rs[Rs_shade]) { register int shade; shade = atoi( rs[Rs_shade] ); if (shade < 0 || shade > 100) shade = 100; r->TermWin.shade = 100 - shade; }#endif#ifdef TRANSPARENT if (rs[Rs_bgRefreshInterval]) { register unsigned long interval = atol( rs[Rs_bgRefreshInterval] ); if( interval > 1000 ) interval = 1000; r->h->bgRefreshInterval = interval * 1000L; /* convert to micro-sec */ }#endif#ifdef OFF_FOCUS_FADING if (rs[Rs_fade]) { register int fade; fade = atoi (rs[Rs_fade]); if (fade < 0 || fade > 100) fade = 100; r->TermWin.fade = 100 - fade; }#endif#ifdef CURSOR_BLINK if (rs[Rs_cursorBlinkInterval]) { register long tmp = atol( rs[Rs_cursorBlinkInterval] ); r->h->blinkInterval = (tmp >= MIN_BLINK_TIME && tmp <= MAX_BLINK_TIME) ? tmp : DEFAULT_BLINK_TIME; } /* convert msec to usec */ r->h->blinkInterval *= 1000;#endif#ifdef PRINTPIPE if (!rs[Rs_print_pipe]) rs[Rs_print_pipe] = PRINTPIPE;#endif if (!rs[Rs_cutchars]) rs[Rs_cutchars] = CUTCHARS;#ifdef ACS_ASCII if( !rs[Rs_acs_chars] ) rs[Rs_acs_chars] = ACS_CHARS; if( (i = STRLEN(rs[Rs_acs_chars])) < 0x20 ) { val = rxvt_realloc( (void*) rs[Rs_acs_chars], 0x20 ); for( ; i < 0x20; ) val[i++] = ' '; rs[Rs_acs_chars] = val; }#endif#ifndef NO_BACKSPACE_KEY if( !rs[Rs_backspace_key] )# ifdef DEFAULT_BACKSPACE r->h->key_backspace = DEFAULT_BACKSPACE;# else r->h->key_backspace = "DEC"; /* can toggle between \010 or \177 */# endif else { char* val = STRDUP(rs[Rs_backspace_key]); rxvt_str_trim( val ); rxvt_str_escaped( val ); r->h->key_backspace = val; }#endif#ifndef NO_DELETE_KEY if( !rs[Rs_delete_key] )# ifdef DEFAULT_DELETE r->h->key_delete = DEFAULT_DELETE;# else r->h->key_delete = "\033[3~";# endif else { char *val = STRDUP( rs[Rs_delete_key] ); rxvt_str_trim( val ); rxvt_str_escaped( val ); r->h->key_delete = val; }#endif if( rs[Rs_answerbackstring] ) { rxvt_str_trim( (char*) rs[Rs_answerbackstring] ); rxvt_str_escaped( (char*) rs[Rs_answerbackstring] ); } if( rs[Rs_selectstyle] ) { if( STRNCASECMP( rs[Rs_selectstyle], "oldword", 7 ) == 0 ) r->selection_style = OLD_WORD_SELECT;#ifndef NO_OLD_SELECTION else if( STRNCASECMP( rs[Rs_selectstyle], "old", 3 ) == 0 ) r->selection_style = OLD_SELECT;#endif } /* Set default X11 fonts */ rxvt_set_default_font_x11( r );#ifdef XFT_SUPPORT if( rs[Rs_xftsz] ) { int sz = atoi( rs[Rs_xftsz] ); r->TermWin.xftsize = (sz >= MIN_XFT_FONT_SIZE) ? sz : MIN_XFT_FONT_SIZE; } else /* default xft font size */ r->TermWin.xftsize = DEFAULT_XFT_FONT_SIZE; if (rs[Rs_xftpsz]) { int sz = atoi (rs[Rs_xftpsz]); r->TermWin.xftpsize = (sz >= MIN_XFT_FONT_SIZE) ? sz : MIN_XFT_FONT_SIZE; } else /* default xft Pfont size */ r->TermWin.xftpsize = DEFAULT_XFT_PFONT_SIZE;# ifdef MULTICHAR_SET if (rs[Rs_xftmsz]) { int sz = (int) atof (rs[Rs_xftmsz]); r->TermWin.xftmsize = (sz >= MIN_XFT_FONT_SIZE) ? sz : MIN_XFT_FONT_SIZE; } else /* default xft font size */ r->TermWin.xftmsize = DEFAULT_XFT_FONT_SIZE;# endif /* MULTICHAR_SET */ /* Set default Freetype fonts */ rxvt_set_default_font_xft (r);#endif /* XFT_SUPPORT */#ifdef TEXT_SHADOW rxvt_init_shadow_mode (r, rs[Rs_textShadowMode]);#endif#ifdef XTERM_REVERSE_VIDEO /* this is how xterm implements reverseVideo */ if (r->Options & Opt_reverseVideo) { if (!rs[Rs_color + Color_fg]) rs[Rs_color + Color_fg] = def_colorName[Color_bg]; if (!rs[Rs_color + Color_bg]) rs[Rs_color + Color_bg] = def_colorName[Color_fg]; for (i = 0; i < MAX_PROFILES; i++) { int vtfg = Rs_foreground + i; int vtbg = Rs_background + i; char* fg = (char*) rs[vtfg]; char* bg = (char*) rs[vtbg]; /* foreground color of i terminal */ if (ISSET_VTFG(r, i)) rs[vtfg] = ISSET_VTBG(r, i) ? bg : def_colorName[Color_bg]; /* background color of i terminal */ if (ISSET_VTBG(r, i)) rs[vtbg] = ISSET_VTFG(r, i) ? fg : def_colorName[Color_fg]; } }#endif for (i = 0; i < NRS_COLORS; i++) if (!rs[Rs_color + i]) rs[Rs_color + i] = def_colorName[i];#ifndef XTERM_REVERSE_VIDEO /* this is how we implement reverseVideo */ if (r->Options & Opt_reverseVideo) { SWAP_IT(rs[Rs_color + Color_fg], rs[Rs_color + Color_bg], const char *); for (i = 0; i < MAX_PROFILES; i++) { int vtfg = Rs_foreground + i; int vtbg = Rs_background + i; SWAP_IT(rs[vtfg], rs[vtbg], const char*); } }#endif /* convenient aliases for setting fg/bg to colors */ rxvt_color_aliases(r, Color_fg); rxvt_color_aliases(r, Color_bg);#ifndef NO_CURSORCOLOR rxvt_color_aliases(r, Color_cursor); rxvt_color_aliases(r, Color_cursor2);#endif /* NO_CURSORCOLOR */ rxvt_color_aliases(r, Color_pointer); rxvt_color_aliases(r, Color_border);#ifndef NO_BOLD_UNDERLINE_REVERSE rxvt_color_aliases(r, Color_BD); rxvt_color_aliases(r, Color_UL); rxvt_color_aliases(r, Color_RV);#endif /* ! NO_BOLD_UNDERLINE_REVERSE */ /* * On startup, use autohideTabbar to override hideTabbar. Thus on startup, * using autohideTabbar will only display the tabbar if there are multiple * tabs. The user can hide / show the tabbar using a macro at will. */ if( r->Options2 & Opt2_autohideTabbar ) r->Options2 |= Opt2_hideTabbar; /* Cleanup the macro list */ rxvt_cleanup_macros( r ); /* * Profile settings. */ for( i=0; i < MAX_PROFILES; i++ ) { /* Set saveLines */ if( r->h->rs[Rs_saveLines + i] ) { int tmp = atoi( r->h->rs[Rs_saveLines + i] ); r->profile[i].saveLines = ( tmp >= 0 && tmp <= MAX_SAVELINES ) ? tmp : DEFAULT_SAVELINES; } else r->profile[i].saveLines = ( i > 0 ) ? r->profile[0].saveLines : DEFAULT_SAVELINES; }#ifdef OS_LINUX if( !r->h->rs[Rs_cwd] ) r->h->rs[Rs_cwd] = ".";#endif return cmd_argv;}/*----------------------------------------------------------------------*//* EXTPROTO */voidrxvt_init_env(rxvt_t *r){ int i; unsigned int u; char* val;#ifdef DISPLAY_IS_IP /* Fixup display_name for export over pty to any interested ** terminal clients via "ESC[7n" (e.g. shells). Note we use ** the pure IP number (for the first non-loopback interface) ** that we get from rxvt_network_display(). This is more ** "name-resolution-portable", if you will, and probably allows ** for faster x-client startup if your name server is beyond ** a slow link or overloaded at client startup. Of course that ** only helps the shell's child processes, not us. ** ** Giving out the display_name also affords a potential ** security hole */ val = rxvt_network_display(r->h->rs[Rs_display_name]); r->h->rs[Rs_display_name] = (const char *)val; if (val == NULL)#endif /* DISPLAY_IS_IP */ val = XDisplayString(r->Xdisplay); if (r->h->rs[Rs_display_name] == NULL) r->h->rs[Rs_display_name] = val; /* use broken `:0' value */ i = STRLEN(val) + 9; if (i <= 0 || i > 1024) /* possible integer overflow */ i = 1024; r->h->env_display = rxvt_malloc(i * sizeof(char)); STRCPY (r->h->env_display, "DISPLAY="); STRNCAT (r->h->env_display, val, i-9); r->h->env_display[i-1] = (char) 0; /* avoiding the math library: * i = (int)(ceil(log10((unsigned int)r->TermWin.parent))) */ for (i = 0, u = (unsigned int)r->TermWin.parent; u; u /= 10, i++) ; MAX_IT(i, 1); r->h->env_windowid = rxvt_malloc((i + 10) * sizeof(char)); sprintf(r->h->env_windowid, "WINDOWID=%u", (unsigned int)r->TermWin.parent); /* ** add entries to the environment: ** @ DISPLAY: in case we started with -display ** @ WINDOWID: X window id number of the window ** @ COLORTERM: terminal sub-name and also indicates its color ** @ TERM: terminal name ** @ TERMINFO: path to terminfo directory */#ifdef HAVE_PUTENV putenv(r->h->env_display); putenv(r->h->env_windowid);# ifdef RXVT_TERMINFO putenv("TERMINFO=" RXVT_TERMINFO);# endif if (XDEPTH <= 2) putenv("COLORTERM=" COLORTERMENV "-mono"); else putenv("COLORTERM=" COLORTERMENVFULL); if (r->h->rs[Rs_term_name] != NULL) { int l = 6 + STRLEN(r->h->rs[Rs_term_name]); if (l <= 0 || l > 1024) /* possible integer overflow */ l = 1024; r->h->env_term = rxvt_malloc(l * sizeof(char)); STRCPY (r->h->env_term, "TERM="); STRNCAT (r->h->env_term, r->h->rs[Rs_term_name], l-6); r->h->env_term[l-1] = (char) 0; putenv(r->h->env_term); } else putenv("TERM=" TERMENV);#endif /* HAVE_PUTENV */#ifdef HAVE_UNSETENV /* avoid passing old settings and confusing term size */ unsetenv("LINES"); unsetenv("COLUMNS"); unsetenv("TERMCAP"); /* terminfo should be okay */#endif /* HAVE_UNSETENV */ /* ** allocate environment variable for MRXVT_TABTITLE, we will ** use it in rxvt_create_termwin later for each tab terminal */ r->h->env_tabtitle = rxvt_malloc(sizeof(TABTITLEENV) + MAX_TAB_TXT + 1);}/*----------------------------------------------------------------------*//* * This is more or less stolen straight from XFree86 xterm. * This should support all European type languages. *//* EXTPROTO */voidrxvt_init_xlocale(rxvt_t *r){#ifdef USE_XIM if (r->h->locale == NULL) rxvt_print_error("Setting locale failed."); else { XChangeProperty(r->Xdisplay, r->TermWin.parent, r->h->xa[XA_WM_LOCALE_NAME], XA_STRING, 8, PropModeReplace, (unsigned char *)r->h->locale, STRLEN(r->h->locale)); if (XSupportsLocale() != True) { rxvt_print_error("The locale is not supported by Xlib"); return; } rxvt_IM_set_fontset (r, 0); /* see if we can connect yet */ rxvt_IM_init_callback (r->Xdisplay, NULL, NULL); /* To avoid Segmentation Fault in C locale: Solaris only? */ if (STRCMP(r->h->locale, "C")) XRegisterIMInstantiateCallback(r->Xdisplay, NULL, NULL, NULL, rxvt_IM_init_callback, NULL); }#endif}/*----------------------------------------------------------------------*//* EXTPROTO */voidrxvt_init_command(rxvt_t* r, const char *const *argv){ /* * Initialize the command connection. This should be called after the X * server connection is established. */ struct sigaction act; /* * Enable delete window protocol so that if the top-level window of the * terminal is destroyed by the Session Manager, we can receive a * ClientMessage event and do something gracefully. */ XSetWMProtocols (r->Xdisplay, r->TermWin.parent, &(r->h->xa[XA_WMDELETEWINDOW]), 1);#ifdef META8_OPTION r->h->meta_char = (r->Options & Opt_meta8 ? 0x80 : C0_ESC);#endif rxvt_get_ourmods(r);#ifdef GREEK_SUPPORT greek_init();#endif r->Xfd = XConnectionNumber(r->Xdisplay);#ifdef CURSOR_BLINK if (r->Options & Opt_cursorBlink) (void)gettimeofday(&r->h->lastcursorchange, NULL);#endif /* * Gracefully exit on term signals. */ act.sa_handler = rxvt_Exit_signal; act.sa_flags = 0; sigemptyset (&act.sa_mask);#ifndef OS_SVR4 sigaction( SIGINT , &act, NULL);#endif sigaction( SIGQUIT, &act, NULL); sigaction( SIGTERM, &act, NULL); /* * 2006-04-28 gi1242: Ignore HUP signals. We sometimes receive this if bash * is killed. Chances are that we don't have to exit ... */ act.sa_handler = SIG_IGN; sigaction( SIGHUP, &act, NULL);#ifdef PRINTPIPE /* * 2006-04-28 gi1242: If there is an error opening the printer command, then * we'll get SIGPIPE. If not handled, mrxvt will exit. * * There's nothing we really need to do on broken pipes, so just ignore * SIGPIPE for now. */ sigaction( SIGPIPE, &act, NULL);#endif act.sa_handler = rxvt_Child_signal; sigaction (SIGCHLD, &act, NULL);}#ifdef OFF_FOCUS_FADING/* EXTPROTO */unsigned longrxvt_fade_color (rxvt_t* r, unsigned long pixel){ if (r->h->rs[Rs_fade]) { XColor faded_xcol; faded_xcol.pixel = pixel; XQueryColor (r->Xdisplay, XCMAP, &faded_xcol); faded_xcol.red = (faded_xcol.red / 100) * r->TermWin.fade; faded_xcol.green = (faded_xcol.green / 100) * r->TermWin.fade; faded_xcol.blue = (faded_xcol.blue / 100) * r->TermWin.fade; rxvt_alloc_color (r, &faded_xcol, "Faded"); return faded_xcol.pixel; } return pixel;}#endif/* * rxvt_restore_ufbg_color should always be called before * rxvt_restore_pix_color. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -