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

📄 command.c

📁 multi-tabed terminal based on rxvt
💻 C
📖 第 1 页 / 共 5 页
字号:
		    m = 1;		else if (keysym == XK_Left)		{		    if (col > 0)		    {			if (IS_MULTI2(AVTS(r)->screen.rend[row][col - 1]))			    m = 1;		    }		    else if (AVTS(r)->screen.cur.row > 0)		    {			col = AVTS(r)->screen.tlen[--row];			if (col == -1)			    col = r->TermWin.ncol - 1;			else			    col--;			if (col > 0 &&			    IS_MULTI2(AVTS(r)->screen.rend[row][col]))			    m = 1;		    }		}		if (m)		{		    /* Duplicate the escape sequence in kbuf */		    int len = STRLEN( kbuf );		    MEMMOVE( kbuf + len, kbuf, len + 1);		}	    }#endif	/* MULTICHAR_SET */	    break;# ifdef XK_KP_Prior	case XK_KP_Prior:	/* \033[Oy */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c",			'y', ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */# endif	/* XK_KP_Prior */	case XK_Prior:	    SET_TILDE_KEY_SEQ( kbuf, "\033[5");	    break;# ifdef XK_KP_Next	case XK_KP_Next:	/* \033Os */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c",			's', ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */# endif	/* XK_KP_Next */	case XK_Next:	    SET_TILDE_KEY_SEQ(kbuf, "\033[6");	    break;	case XK_KP_Enter:   /* \033OM */	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP) &&		(!r->numlock_state || ctrl || meta || shft))	    {#ifdef NUMLOCK_ALWAYS_IGNORES_SHIFT		if( r->numlock_state ) shft = 0;#endif		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'M',			ctrl, meta, shft );	    }	    else	    {		kbuf[0] = '\r';		kbuf[1] = '\0';	    }	    break;#ifdef XK_KP_Begin	case XK_KP_Begin:   /* \033Ou (This is keypad 5) */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'u',			ctrl, meta, shft );	    }	    else	    {		kbuf[0] = '5';		kbuf[1] = '\0';	    }	    break;#endif	/* XK_KP_Begin */#ifdef XK_KP_Insert	case XK_KP_Insert:  /* \033Op */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'p',			ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */#endif /* XK_KP_Insert */	case XK_Insert:	    SET_TILDE_KEY_SEQ( kbuf, "\033[2" );	    break;#ifdef XK_KP_Delete	case XK_KP_Delete:  /* \033On */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'n',			ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */#endif	case XK_Delete:#ifndef NO_DELETE_KEY	    STRCPY( kbuf, r->h->key_delete);#else	    SET_TILDE_KEY_SEQ( kbuf, "\033[3" );#endif#ifdef MULTICHAR_SET	    if (ISSET_OPTION(r, Opt_mc_hack))	    {		int	     col, row;		newlen = STRLEN(kbuf);		col = AVTS(r)->screen.cur.col;		row = AVTS(r)->screen.cur.row + AVTS(r)->saveLines;		if (IS_MULTI1(AVTS(r)->screen.rend[row][col]))		    MEMMOVE(kbuf + newlen, kbuf, newlen + 1);	    }#endif	/* MULTICHAR_SET */	    break;	case XK_KP_Multiply:	/* "\033Oj" : "*" */	case XK_KP_Add:		/* "\033Ok" : "+" */	case XK_KP_Separator:	/* "\033Ol" : "," */	case XK_KP_Subtract:	/* "\033Om" : "-" */	case XK_KP_Divide:	/* "\033Oo" : "/" */	case XK_KP_Decimal:	/* "\033On" : "." */	case XK_KP_0:		/* "\033Op" : "0" */	case XK_KP_1:		/* "\033Oq" : "1" */	case XK_KP_2:		/* "\033Or" : "2" */	case XK_KP_3:		/* "\033Os" : "3" */	case XK_KP_4:		/* "\033Ot" : "4" */	case XK_KP_5:		/* "\033Ou" : "5" */	case XK_KP_6:		/* "\033Ov" : "6" */	case XK_KP_7:		/* "\033Ow" : "7" */	case XK_KP_8:		/* "\033Ox" : "8" */	case XK_KP_9:		/* "\033Oy" : "9" */	    /*	     * If numlock is on, and no modifiers are presed, then we should	     * send the actual number key. If modifiers are pressed, send the	     * DEC sequence (after canceling shift ofcourse).	     *	     * If numlock is off, then send the DEC terminal sequence.	     */	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP) &&		(!r->numlock_state || ctrl || meta || shft))	    {		if(			r->numlock_state#ifndef NUMLOCK_ALWAYS_IGNORES_SHIFT			&& keysym >= XK_KP_Decimal && keysym <= XK_KP_9#endif		  )		    /*		     * Cancel shift if numlock is pressed, but only cancel it		     * for keys where shift has some meaning: 0-9 and Decimal.		     * If NUMLOCK_ALWAYS_IGNORES_SHIFT is defined, then shift is		     * always cancelled when numlock is on.		     */		    shft = 0;		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c",			'j' + (keysym - XK_KP_Multiply), ctrl, meta, shft );	    }	    else	    {		kbuf[0] = ('*' + (keysym - XK_KP_Multiply));		kbuf[1] = '\0';	    }	    break;	case XK_Find:	    SET_TILDE_KEY_SEQ(kbuf, "\033[1");	    break;#ifdef DXK_Remove	/* support for DEC remove like key */	case DXK_Remove:	    /* FALLTHROUGH */#endif	/* DXK_Remove */	case XK_Execute:	    SET_TILDE_KEY_SEQ(kbuf, "\033[3");	    break;	case XK_Select:	    SET_TILDE_KEY_SEQ(kbuf, "\033[4");	    break;#ifdef XK_KP_End	case XK_KP_End:	/* \033Oq */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'q',			ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */#endif	/* XK_KP_End */	case XK_End:	    if (ISSET_OPTION(r, Opt2_linuxHomeEndKey))		SET_TILDE_KEY_SEQ( kbuf, KS_END_LINUX);	    else		SET_TILDE_KEY_SEQ( kbuf, KS_END);	    break;#ifdef XK_KP_Home	case XK_KP_Home: /* \033Ow */	    if( r->numlock_state ) shft = 0;	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c", 'w',			ctrl, meta, shft );		break;	    }	    /* FALLTHROUGH */#endif	/* XK_KP_Home */	case XK_Home:	    if (ISSET_OPTION(r, Opt2_linuxHomeEndKey))		SET_TILDE_KEY_SEQ( kbuf, KS_HOME_LINUX);	    else		SET_TILDE_KEY_SEQ( kbuf, KS_HOME);	    break;#define FKEY_SEQ_START( n, fkey)    \	sprintf( (char*) kbuf, "\033[%2d", (n) + (int) (keysym - (fkey)) );	case XK_KP_F1:	/* "\033OP" */	case XK_KP_F2:	/* "\033OQ" */	case XK_KP_F3:	/* "\033OR" */	case XK_KP_F4:	/* "\033OS" */	    /* XXX 2006-04-08 gi1242: Should we cancel shift here? */	    if (ISSET_PMODE(r, ATAB(r), PrivMode_aplKP))	    {		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c",			'P' + (keysym - XK_KP_F1), ctrl, meta, shft);		break;	    }	    else		keysym = XK_F1 + (keysym - XK_KP_F1);	    /* FALLTHROUGH */	case XK_F1: /* "\033[11~" */	case XK_F2: /* "\033[12~" */	case XK_F3: /* "\033[13~" */	case XK_F4: /* "\033[14~" */	    if (TERMENV_XTERM == AVTS(r)->termenv)	    {		/* Xterm sends \eOP, \eOQ, \eOR, \eOS for f1 -- f4 */		set_xterm_key_seq( kbuf, "\033O", "\033O%d%c",			'P' + (keysym - XK_F1), ctrl, meta, shft);		break;	    }	    /* else FALL THROUGH */	case XK_F5: /* "\033[15~" */	    FKEY_SEQ_START( 11, XK_F1);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_F6:	/* "\033[17~" */	case XK_F7:	/* "\033[18~" */	case XK_F8:	/* "\033[19~" */	case XK_F9:	/* "\033[20~" */	case XK_F10:	/* "\033[21~" */	    FKEY_SEQ_START(17, XK_F6);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_F11:	/* "\033[23~" */	case XK_F12:	/* "\033[24~" */	case XK_F13:	/* "\033[25~" */	case XK_F14:	/* "\033[26~" */	    FKEY_SEQ_START(23, XK_F11);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_F15:	/* "\033[28~" */	case XK_F16:	/* "\033[29~" */	    FKEY_SEQ_START(28, XK_F15);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_Help:	/* "\033[28~" */	    FKEY_SEQ_START(28, XK_Help);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_Menu:	/* "\033[29~" */	    FKEY_SEQ_START(29, XK_Menu);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;	case XK_F17:	/* "\033[31~" */	case XK_F18:	/* "\033[32~" */	case XK_F19:	/* "\033[33~" */	case XK_F20:	/* "\033[34~" */	case XK_F21:	/* "\033[35~" */	case XK_F22:	/* "\033[36~" */	case XK_F23:	/* "\033[37~" */	case XK_F24:	/* "\033[38~" */	case XK_F25:	/* "\033[39~" */	case XK_F26:	/* "\033[40~" */	case XK_F27:	/* "\033[41~" */	case XK_F28:	/* "\033[42~" */	case XK_F29:	/* "\033[43~" */	case XK_F30:	/* "\033[44~" */	case XK_F31:	/* "\033[45~" */	case XK_F32:	/* "\033[46~" */	case XK_F33:	/* "\033[47~" */	case XK_F34:	/* "\033[48~" */	case XK_F35:	/* "\033[49~" */	    FKEY_SEQ_START(31, XK_F17);	    SET_TILDE_KEY_SEQ( kbuf + 4, "" );	    break;#undef FKEY_SEQ_START	default:	    newlen = 0;	    break;    }	/* switch (keysym) */    rxvt_dbgmsg ((DBG_DEBUG, DBG_COMMAND,  "Returning %d\n", newlen ? (int) STRLEN(kbuf) : -1 ));    return newlen ? STRLEN(kbuf) : -1;    /*     * B: end of a {} body     */}/* }}} *//*{{{ Convert the keypress event into a string *//* INTPROTO */voidrxvt_process_keypress (rxvt_t* r, XKeyEvent *ev){    int		    ctrl, meta, shft, len;    KeySym	    keysym;#ifdef USE_DEADKEY    static KeySym   accent = 0;#endif	/* USE_DEADKEY */#ifdef DEBUG    static int	    debug_key = 1;  /* accessible by a debugger only */#endif	/* DEBUG */#ifdef USE_XIM    int		    valid_keysym = 0;#endif	/* USE_XIM */    /*    ** kbuf should be static in order to avoid performance penalty    ** on allocation in the stack. And we only define it inside this    ** function to avoid potential abuse of this buffer at somewhere    ** else.    */    static unsigned char kbuf[KBUFSZ];	/* was r->h->kbuf */    rxvt_dbgmsg ((DBG_DEBUG, DBG_COMMAND,  "KeyPress event\n"));    shft = (ev->state & ShiftMask);    ctrl = (ev->state & ControlMask);    meta = (ev->state & r->h->ModMetaMask);#if 0 /* {{{ Old numlock handling (conflicts with Xterm) */    /*     * use Num_Lock to toggle Keypad on/off.  If Num_Lock is off,     * allow an escape sequence to toggle the Keypad. Always permit     * `shift' to override the current setting     */    if (r->numlock_state || (ev->state & r->h->ModNumLockMask))    {	r->numlock_state = (ev->state & r->h->ModNumLockMask);	PrivMode((!r->numlock_state), PrivMode_aplKP, ATAB(r));    }#endif /*}}}*/    /*     * 2006-04-07 gi1242: Don't toggle the Keypad on pressing num lock. Only     * store the numlock state so that we can cancel shift if numlock is     * pressed, and we get an un-shifted keypad key.     */    r->numlock_state = ( ev->state & r->h->ModNumLockMask );#ifdef USE_XIM    if (NOT_NULL(r->h->Input_Context))    {	Status	      status_return;	kbuf[0] = '\0';	len = XmbLookupString(r->h->Input_Context, ev, (char *)kbuf,		  KBUFSZ, &keysym, &status_return);	valid_keysym = ((status_return == XLookupKeySym) ||			(status_return == XLookupBoth));    }    else    {	valid_keysym = 1;#endif	/* USE_XIM */	/*	******************************************************	** Begin of part that is used when XIM is disabled	*/	len = XLookupString(ev, (char *)kbuf, KBUFSZ, &keysym, NULL);	/*	** map unmapped Latin[2-4]/Katakana/Arabic/Cyrillic/Greek	** entries -> Latin1. good for installations with correct	** fonts, but without XLOCALE	*/	if (!len)	{	    if ((keysym >= 0x0100) && (keysym < 0x0800))	    {		kbuf[0] = (keysym & 0xFF);		kbuf[1] = '\0';		len = 1;	    }	    else		kbuf[0] = '\0';	}	/*	** End of part that is used when XIM is disabled	******************************************************	*/#ifdef USE_XIM    }#endif	/* USE_XIM */#ifdef USE_DEADKEY    if (0 != accent)    {

⌨️ 快捷键说明

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