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