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

📄 macros.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 3 页
字号:
	    }	    else		rxvt_exit_request( r );	    break;	case MacroFnGoto:	{	    /* Goto tab in position astr */	    int tabno;	    	    if (NOT_NULL(astr) && *(astr) )	    {		tabno = atoi( (char*) astr );		if( *(astr)  == '+' || *(astr) == '-' )		{		    /*		     * Relative movement of tabs		     */		    tabno += ATAB(r);		    /* Wrap around */		    tabno = tabno % (LTAB(r) + 1);		    if( tabno < 0 ) tabno += LTAB(r) + 1;		}		else if( tabno == 0 )		{		    /*		     * Previous active tab		     */		    tabno = PTAB(r);		}		else if( --tabno > LTAB(r) )		{		    /*		     * Absolute tab number. If we're too far to the right,		     * activate the last tab.		     */		    tabno = LTAB(r);		}	    }	    else tabno = PTAB(r);	    rxvt_activate_page( r, tabno);	    break;	}	case MacroFnMove:	    /* Move active tab to position in astr */	    if( alen > 0 && *(astr) )	    {		short tabno = atoi( (char*) astr );		if( *(astr) == '+' || *(astr) == '-' )		    rxvt_tabbar_move_tab( r, tabno + ATAB(r));		else		    rxvt_tabbar_move_tab( r, tabno-1 );	    }	    else		retval = -1;	    break;	case MacroFnScroll:	    /* Scroll by an amount specified in astr */	    if( alen > 1 )	    {		int		amount	    = abs( atoi( (char*) astr ));		enum page_dirn	direction   = (*(astr) == '-' ? UP : DN);		rxvt_dbgmsg ((DBG_DEBUG, DBG_MACROS, "astr: '%s', alen: %d\n", astr, alen));		if( tolower( astr[ alen - 2] ) == 'p' )		    /* scroll pages */		    amount *=#ifdef PAGING_CONTEXT_LINES				r->TermWin.nrow - PAGING_CONTEXT_LINES#else				r->TermWin.nrow * 4 / 5#endif		    ;		rxvt_scr_page( r, ATAB(r), direction, amount);#  ifdef HAVE_SCROLLBARS		rxvt_scrollbar_update(r, 1);#  endif    /* HAVE_SCROLLBARS */	    }	    break;#if 0	case MacroFnCopy:#endif	case MacroFnPaste:	{	    int sel = XA_PRIMARY;	    if (NOT_NULL(ev))	    {		if( NOT_NULL(astr) && *astr )		{		    if(strcmp ("PRIMARY", astr) == 0)			sel=XA_PRIMARY;		    else if (strcmp ("SECONDARY", astr) == 0)		      sel=XA_SECONDARY;		    else if (strcmp ("CLIPBOARD", astr) == 0)		      sel=XA_CLIPBOARD;		    else		      break;		    rxvt_selection_request_by_sel( r, ATAB(r), ev->xkey.time,			    0, 0, sel);		}		else		    rxvt_selection_request (r, ATAB(r), ev->xkey.time, 0, 0);	    }	    else	    {		retval = -1;	    }	    break;	}	case MacroFnPasteFile:	{	    if (NOT_NULL(ev))	    {	        if( NOT_NULL(astr) && *astr )		    rxvt_paste_file (r, ATAB(r), ev->xkey.time, 0, 0, astr);	        else		    break;	    }	    else		retval = -1;	   break;	}	case MacroFnMonitorTab:	{	    if (NOT_NULL(ev))	    {		if( NOT_NULL(astr) && *astr )		{		    short doit = 0;		    /* which monitoring type do we need ? */		    if(strcmp ("ACTIVITY", astr) == 0)		    {		      AVTS(r)->monitor_tab = 			  (AVTS(r)->monitor_tab == TAB_MON_ACTIVITY ) ? TAB_MON_OFF : TAB_MON_ACTIVITY;		      doit = 1;		      rxvt_msg (DBG_INFO, DBG_MACROS,  "Macro %s ACTIVITY : activity monitoring request on tab %i.",			macroNames[action->type], AVTS(r)->vts_idx );		    }		    else if (strcmp ("INACTIVITY", astr) == 0)		    {		      AVTS(r)->monitor_tab = 			  (AVTS(r)->monitor_tab == TAB_MON_INACTIVITY) ? TAB_MON_OFF : TAB_MON_INACTIVITY;		      doit = 1;		      rxvt_msg (DBG_INFO, DBG_MACROS,  "Macro %s INACTIVITY : inactivity monitoring request on tab %i.",		 	 macroNames[action->type], AVTS(r)->vts_idx );		    }		    else if (strcmp ("AUTO", astr) == 0)		    {		      AVTS(r)->monitor_tab = 			  (AVTS(r)->monitor_tab == TAB_MON_AUTO) ? TAB_MON_OFF : TAB_MON_AUTO;		      doit = 1;		      rxvt_msg (DBG_INFO, DBG_MACROS,  			 "Macro %s AUTO : request for automatic (in-)activity monitoring on tab %i.",		 	 macroNames[action->type], AVTS(r)->vts_idx );		    }		    else		    {		      rxvt_msg (DBG_INFO, DBG_MACROS,  "Macro %s requires argument or invalid argument provided.",		 	 macroNames[action->type] );		      break;		    }		    /* activating/deactivating the macro */		    if (doit != 0)		    {		      if (AVTS(r)->monitor_tab == TAB_MON_OFF )		      {			  rxvt_msg (DBG_INFO, DBG_MACROS,  "Macro %s was already active, deactivating previous macro call.",			     macroNames[action->type] );		      }else		      {			  AVTS(r)->monitor_nbytes_read = 0;			  gettimeofday( &AVTS(r)->monitor_start , NULL);		      }		    }		}	    }	    else	    {		retval = -1;	    }	    break;	}	case MacroFnToggleSubwin:	    rxvt_toggle_subwin( r, (unsigned char*) astr);	    break;	case MacroFnFont:	{	    const int MaxFontLen = 8;	/* Only need space for "#+xx" */	    char fontname[MaxFontLen];	    if( alen >= MaxFontLen - 1 ) break;	/* Remember that						   alen includes						   the trailing null						   char */	    fontname[0] = FONT_CMD;		/* Internal prefix */	    STRNCPY( fontname + 1, astr, MaxFontLen - 1);	    fontname[MaxFontLen - 1] = '\0';	/* Null terminate */	    rxvt_resize_on_font( r, fontname );	    break;	}	case MacroFnToggleVeryBold:	    TOGGLE_OPTION( r, Opt2_veryBold );	    rxvt_scr_touch (r, ATAB(r), True);	    break;	case MacroFnToggleBoldColors:	    TOGGLE_OPTION( r, Opt2_boldColors );	    rxvt_scr_touch (r, ATAB(r), True);	    break;	case MacroFnToggleVeryBright:	    TOGGLE_OPTION( r, Opt_veryBright );	    rxvt_scr_touch (r, ATAB(r), True);	    break;	case MacroFnToggleTransp:#ifdef TRANSPARENT	    rxvt_toggle_transparency(r);#else	    retval = -1;#endif	    break;	case MacroFnToggleBcst:	    if( NOT_NULL(astr) && *astr )	    {		long state = strtol( astr, NULL, 0 );		switch(state)		{		    case 1:			SET_OPTION( r, Opt2_broadcast );			break;		    case 0:			UNSET_OPTION( r, Opt2_broadcast );			break;		    case -1:			TOGGLE_OPTION( r, Opt2_broadcast );			break;		    default:			rxvt_msg( DBG_ERROR, DBG_MACROS,				"Badly formed argument '%s' to %s\n",				astr, macroNames[action->type] );			retval = -1;			break;		}	    }	    else		TOGGLE_OPTION(r, Opt2_broadcast);	    break;	case MacroFnToggleHold:	    if( NOT_NULL(astr) && *astr )	    {		/* Set the hold option for this tab */		char		op = *astr++;		unsigned long	holdMask;				holdMask = strtoul( astr, NULL, 0 );		switch( op )		{		    case '+':			AVTS(r)->holdOption |= holdMask;			break;		    case '-':			AVTS(r)->holdOption &= ~holdMask;			break;		    case '!':			AVTS(r)->holdOption ^= holdMask;			break;		    default:			rxvt_msg (DBG_ERROR, DBG_MACROS,  "Badly formed argument '%s' to %s\n",				astr, macroNames[action->type] );			retval = -1;			break;		}		/* Remove the ATAB if it no longer needs to be held */		if(		     AVTS(r)->dead && AVTS(r)->hold > 1 &&		     !SHOULD_HOLD( r, ATAB(r) )		  )		    rxvt_remove_page( r, ATAB(r) );	    }	    else	    {		/*		 * Behaviour almost compatible with mrxvt-0.5.1: Just get rid of		 * all held tabs.		 */		int k;		for (k = LTAB(r); k>= 0; k --)		    if (PVTS(r, k)->dead && PVTS(r, k)->hold > 1)			rxvt_remove_page (r, k);	    }	    break;	case MacroFnToggleFullscreen:	    ewmh_message( r->Xdisplay, XROOT, r->TermWin.parent,		XInternAtom( r->Xdisplay, "_NET_WM_STATE", True),		_NET_WM_STATE_TOGGLE,		XInternAtom( r->Xdisplay, "_NET_WM_STATE_FULLSCREEN", True),		0, 0, 0 );	    break;	case MacroFnRaise:	    ewmh_message( r->Xdisplay, XROOT, r->TermWin.parent,		XInternAtom( r->Xdisplay, "_NET_ACTIVE_WINDOW", True),		1, 0 /*timestamp?*/, r->TermWin.parent, 0, 0 );	    break;	case MacroFnSetTitle:	    if (NOT_NULL(astr))		rxvt_tabbar_set_title( r, ATAB(r),			(unsigned char*) astr);	    else if (NOT_NULL(r->selection.text))		rxvt_tabbar_set_title( r, ATAB(r),			(const unsigned char TAINTED*) r->selection.text);	    else		retval = -1;	    break;#ifdef USE_FIFO	case MacroFnUseFifo:	    if( NOT_NULL( astr ) )	    {		int state = strtol( astr, NULL, 0 );		if( state == -1 )		    state = ISSET_OPTION( r, Opt_useFifo ) ? 0 : 1;		if( state == 1 && !ISSET_OPTION( r, Opt_useFifo ) )		{		    SET_OPTION( r, Opt_useFifo );		    rxvt_init_fifo( r );		}		else if( state == 0 && ISSET_OPTION( r, Opt_useFifo ) )		{		    if( r->fifo_fd != -1 )		    {			close( r->fifo_fd );			if( r->num_fds == r->fifo_fd + 1)			    rxvt_adjust_fd_number( r );			r->fifo_fd = -1;			unlink( r->fifo_name );		    }		    UNSET_OPTION( r, Opt_useFifo );		}	    }	    break;#endif/*USE_FIFO*/	case MacroFnPrintScreen:	{	    /*	     * Arguments: [-{s,n,p}] command	     *	s: Dump whole scroll back buffer.	     *	p: Pretty print (i.e. with escape sequences for ANSII color)	     *	n: No line continuation	     * scroll back buffer. The argument if any is the command to use for	     * the printer pipe.	     */	    char    *s		= (char*) astr;	    int	    pretty	= 0,		    scrollback	= 0,		    linecont	= 1;	    if( *s && *s == '-' )	    {		while( *(++s) && !isspace( *s ) )		{		    switch( *s )		    {			case 's': scrollback	= 1; break;			case 'p': pretty	= 1; break;			case 'n': linecont	= 0; break;			default:			    rxvt_msg (DBG_ERROR, DBG_MACROS,  "Bad option %c to macro %s",				    *s, macroNames[action->type] );			    retval = -1;		    }		}		while( isspace(*s) ) s++;	    }	    rxvt_scr_printscreen( r, ATAB(r), scrollback, pretty, linecont,		    *s ? s : NULL );	    break;	}	case MacroFnSaveConfig:	{	    char    cfile[PATH_MAX] = "";	    if (NOT_NULL(astr))		STRNCPY( cfile, astr, PATH_MAX-1 );	    else	    {		char*	home = getenv ("HOME");		if (IS_NULL(home)) return -1; /* Failure */		snprintf (cfile, PATH_MAX-1, "%s/%s", home,			".mrxvtrc.save");	    }	    cfile[PATH_MAX-1] = (char) 0;   /* Null terminate */	    retval = rxvt_save_options (r, cfile) ? 1 : -1;	    break;	}	case MacroFnToggleMacros:	    TOGGLE_OPTION(r, Opt2_disableMacros);	    break;	default:	    assert( action->type < sizeof( macroNames ) / sizeof( char ** ) );	    rxvt_msg (DBG_ERROR, DBG_MACROS,  "Support for macro type '%s' not compiled.",		    macroNames[action->type]);	    retval = -1;    }    return retval;}/* }}} *//* vim: set fdm=marker: *//*----------------------- end-of-file (C source) -----------------------*/

⌨️ 快捷键说明

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