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

📄 init.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 5 页
字号:
    }#endif /* LOCAL_X_IS_UNIX */    rxvt_msg( DBG_INFO, DBG_INIT, "Open X display %s\n", rs[Rs_display_name] );    r->Xdisplay = XOpenDisplay( rs[Rs_display_name] );    if( IS_NULL(r->Xdisplay) )    {	rxvt_msg( DBG_ERROR, DBG_INIT, "Error opening display %s\n",		rs[Rs_display_name] );	exit( EXIT_FAILURE );    }#ifdef DEBUG_X    /*     * Makes life a lot simpler when handling X events, as they are not cached,     * but processed immediately.     */    XSynchronize( r->Xdisplay, True );#endif    /*     * Always set XErrorHandler to our own error handler because sometimes     * errors are legal! Our error handler will abort when errors are not     * allowed.     */    XSetErrorHandler( (XErrorHandler) rxvt_xerror_handler );    /* Initialize all atoms after establishing connection to X */    for (i = 0; i < NUM_XA; i++)	r->h->xa[i] = XInternAtom( r->Xdisplay, xa_names[i], False );    rxvt_extract_resources( r, r->Xdisplay, rs[Rs_name] );    /*     * set any defaults not already set     */    if( cmd_argv && cmd_argv[0] )    {	if( !rs[Rs_title] )	    rs[Rs_title] = rxvt_r_basename( cmd_argv[0] );	if( !rs[Rs_iconName] )	    rs[Rs_iconName] = rs[Rs_title];    }    else    {	if( !rs[Rs_title] )	    rs[Rs_title] = rs[Rs_name];	if( !rs[Rs_iconName] )	    rs[Rs_iconName] = rs[Rs_name];    }    if( rs[Rs_maxTabWidth] )    {	register int	tmp = atoi( rs[ Rs_maxTabWidth]);	r->TermWin.maxTabWidth = ( tmp >=1 && tmp <= MAX_DISPLAY_TAB_TXT ) ?					tmp : MAX_DISPLAY_TAB_TXT;    }    else	/*	 * If we're using Xft, then we will probably also use a PFont. So we	 * should set this to the maximum possible.	 */	r->TermWin.maxTabWidth =#ifdef XFT_SUPPORT	    ISSET_OPTION(r, Opt_xft) ? MAX_DISPLAY_TAB_TXT :#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 (	      IS_ATOM(r->h->xa[XA_NET_WM_WINDOW_OPACITY]) &&	      ISSET_OPTION(r, Opt_transparent)	   )	{	    /* Override pseudo-transparent */	    UNSET_OPTION(r, 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    rxvt_set_jumpscroll(r);#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    if (rs[Rs_fade])    {	register int	fade;	fade = atoi( rs[Rs_fade] );	/*	 * Fade levels of 0 will make the text completely black, so let's ignore	 * it.	 */	if( fade <= 0 || fade > 100 )	    fade = 100;	r->TermWin.fade = 100 - fade;    }    /* else r->TermWin.fade is 0 */#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 )    {	char *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 (ISSET_OPTION(r, 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 (ISSET_OPTION(r, Opt_reverseVideo))    {	if (!rs[Rs_color + Color_fg])	    rs[Rs_color + Color_fg] = def_colorName[Color_fg];	if (!rs[Rs_color + Color_bg])	    rs[Rs_color + Color_bg] = def_colorName[Color_bg];	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;	    if (!rs[vtfg])		rs[vtfg] = def_colorName[Color_fg];	    if (!rs[vtbg])		rs[vtbg] = def_colorName[Color_bg];	    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(ISSET_OPTION(r, Opt2_autohideTabbar))	SET_OPTION(r, 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;	/* Set holdOption */	if( r->h->rs[Rs_holdExit + i] )	{	    const char *s = r->h->rs[Rs_holdExit + i];	    /* Backward compatibility hack */	    if(		 !STRCASECMP( s, "true" )	    ||		 !STRCASECMP( s, "yes" )	    ||		 !STRCASECMP( s, "on" )	      )		r->profile[i].holdOption = HOLD_ALWAYSBIT;	    else		r->profile[i].holdOption = strtoul( s, NULL, 0 );	}	else	    r->profile[i].holdOption = (i > 0) ? r->profile[0].holdOption :					    (HOLD_STATUSBIT|HOLD_NORMALBIT);    } /* for(i) */    if( !r->h->rs[Rs_holdExitTtl] )	r->h->rs[Rs_holdExitTtl] = "(Done) %t";    if( !r->h->rs[Rs_holdExitTxt] )	r->h->rs[Rs_holdExitTxt] = "\n\n\r\e[31m"				   "Process exited %N with status %S. "				   "Press any key to close tab.\e[0m";#ifdef OS_LINUX    if( !r->h->rs[Rs_cwd] )	r->h->rs[Rs_cwd] = ".";#endif#ifndef NO_BEEP    if( r->h->rs[Rs_vBellDuration] )	r->TermWin.vBellDuration =	    1000000ul * strtoul( r->h->rs[Rs_vBellDuration], NULL, 0 );    else	r->TermWin.vBellDuration = 0;#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 (IS_NULL(val))#endif		    /* DISPLAY_IS_IP */    val = XDisplayString(r->Xdisplay);    if (IS_NULL(r->h->rs[Rs_display_name]))	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 (NOT_NULL(r->h->rs[Rs_term_name]))    {	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 */    /*

⌨️ 快捷键说明

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