📄 command.c
字号:
case XK_F5: /* "\033[15~" */ FKEY(11, XK_F1); 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(17, XK_F6); break; case XK_F11: /* "\033[23~" */ case XK_F12: /* "\033[24~" */ case XK_F13: /* "\033[25~" */ case XK_F14: /* "\033[26~" */ FKEY(23, XK_F11); break; case XK_F15: /* "\033[28~" */ case XK_F16: /* "\033[29~" */ FKEY(28, XK_F15); break; case XK_Help: /* "\033[28~" */ FKEY(28, XK_Help); break; case XK_Menu: /* "\033[29~" */ FKEY(29, XK_Menu); 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(31, XK_F17); break;#undef FKEY default: newlen = 0; break; } if (newlen) len = STRLEN(kbuf); } /* * Pass meta for all function keys, if 'meta' option set */#ifdef META8_OPTION if (meta && (r->h->meta_char == 0x80) && len > 0) kbuf[len - 1] |= 0x80;#endif } else if (ctrl && keysym == XK_minus) { len = 1; kbuf[0] = '\037'; /* Ctrl-Minus generates ^_ (31) */ } else {#ifdef META8_OPTION /* set 8-bit on */ if (meta && (r->h->meta_char == 0x80)) { unsigned char *ch; for (ch = kbuf; ch < kbuf + len; ch++) *ch |= 0x80; meta = 0; }#endif#ifdef GREEK_SUPPORT if (r->h->greek_mode) len = greek_xlat(kbuf, len);#endif /* nil */ ; } } if (len <= 0) return; /* not mapped */ if (r->Options & Opt_scrollTtyKeypress) if (r->TermWin.view_start) { r->TermWin.view_start = 0; r->h->want_refresh = 1; }/* * these modifications only affect the static keybuffer * pass Shift/Control indicators for function keys ending with `~' * * eg, * Prior = "ESC[5~" * Shift+Prior = "ESC[5$" * Ctrl+Prior = "ESC[5^" * Ctrl+Shift+Prior = "ESC[5@" * Meta adds an Escape prefix (with META8_OPTION, if meta == <escape>). */ if (kbuf[0] == C0_ESC && kbuf[1] == '[' && kbuf[len - 1] == '~') kbuf[len - 1] = (shft ? (ctrl ? '@' : '$') : (ctrl ? '^' : '~'));/* escape prefix */ if (meta#ifdef META8_OPTION && (r->h->meta_char == C0_ESC)#endif ) { const unsigned char ch = C0_ESC; rxvt_tt_write(r, &ch, 1); }#ifdef DEBUG_CMD if (debug_key) { /* Display keyboard buffer contents */ char *p; int i; fprintf(stderr, "key 0x%04X [%d]: `", (unsigned int)keysym, len); for (i = 0, p = kbuf; i < len; i++, p++) fprintf(stderr, (*p >= ' ' && *p < '\177' ? "%c" : "\\%03o"), *p); fprintf(stderr, "'\n"); }#endif /* DEBUG_CMD */ rxvt_tt_write(r, kbuf, (unsigned int)len);}/*}}} */#if (MENUBAR_MAX)/*{{{ rxvt_cmd_write(), rxvt_cmd_getc() *//* attempt to `write' count to the input buffer *//* EXTPROTO */unsigned intrxvt_cmd_write(rxvt_t *r, const unsigned char *str, unsigned int count){ unsigned int n, s; unsigned char *cmdbuf_base = r->h->cmdbuf_base, *cmdbuf_endp = r->h->cmdbuf_endp, *cmdbuf_ptr = r->h->cmdbuf_ptr; n = cmdbuf_ptr - cmdbuf_base; s = cmdbuf_base + BUFSIZ - 1 - cmdbuf_endp; if (n > 0 && s < count) { MEMMOVE(cmdbuf_base, cmdbuf_ptr, (unsigned int)(cmdbuf_endp - cmdbuf_ptr)); cmdbuf_ptr = cmdbuf_base; cmdbuf_endp -= n; s += n; } if (count > s) { rxvt_print_error("data loss: cmd_write too large"); count = s; } for (; count--;) *cmdbuf_endp++ = *str++; r->h->cmdbuf_ptr = cmdbuf_ptr; r->h->cmdbuf_endp = cmdbuf_endp; return 0;}#endif /* MENUBAR_MAX *//* rxvt_cmd_getc() - Return next input character *//* * Return the next input character after first passing any keyboard input * to the command. *//* INTPROTO */unsigned charrxvt_cmd_getc(rxvt_t *r){#define TIMEOUT_USEC 5000 fd_set readfds; int quick_timeout, select_res; struct timeval value; struct rxvt_hidden *h = r->h; if (h->cmdbuf_ptr < h->cmdbuf_endp) /* characters already read in */ return *h->cmdbuf_ptr++; for (;;) { /* loop until we can return something */ if (h->v_bufstr < h->v_bufptr) /* output any pending chars */ rxvt_tt_write(r, NULL, 0); while (XPending(r->Xdisplay)) { /* process pending X events */ XEvent xev; XNextEvent(r->Xdisplay, &xev);#ifdef USE_XIM if (!XFilterEvent(&xev, xev.xany.window)) rxvt_process_x_event(r, &xev); h->event_type = xev.type;#else rxvt_process_x_event(r, &xev);#endif /* in case button actions pushed chars to cmdbuf */ if (h->cmdbuf_ptr < h->cmdbuf_endp) return *h->cmdbuf_ptr++; }/* * the command input buffer is empty and we have no pending X events */ quick_timeout = 0;#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING) if (h->mouse_slip_wheel_speed) { quick_timeout = 1; if (!h->mouse_slip_wheel_delay-- && rxvt_scr_page(r, h->mouse_slip_wheel_speed > 0 ? UP : DN, abs(h->mouse_slip_wheel_speed))) { h->mouse_slip_wheel_delay = SCROLLBAR_CONTINUOUS_DELAY; h->refresh_type |= SMOOTH_REFRESH; h->want_refresh = 1; } }#endif /* MOUSE_WHEEL && MOUSE_SLIP_WHEELING */#ifndef NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING if (scrollbar_isUp() || scrollbar_isDn()) { quick_timeout = 1; if (!h->scroll_arrow_delay-- && rxvt_scr_page(r, scrollbar_isUp() ? UP : DN, 1)) { h->scroll_arrow_delay = SCROLLBAR_CONTINUOUS_DELAY; h->refresh_type |= SMOOTH_REFRESH; h->want_refresh = 1; } }#endif /* NO_SCROLLBAR_BUTTON_CONTINUAL_SCROLLING */ FD_ZERO(&readfds); FD_SET(r->cmd_fd, &readfds); FD_SET(r->Xfd, &readfds); value.tv_usec = TIMEOUT_USEC; value.tv_sec = 0; if (!r->TermWin.mapped) quick_timeout = 0; else { quick_timeout |= h->want_refresh;#ifdef TRANSPARENT quick_timeout |= h->want_full_refresh;#endif } if ((select_res = select(r->num_fds, &readfds, NULL, NULL, (quick_timeout ? &value : NULL))) == 0) { /* select statement timed out - we're not hard and fast scrolling */ h->refresh_limit = 1; } /* See if we can read new data from the application */ if (select_res > 0 && FD_ISSET(r->cmd_fd, &readfds)) { int n; unsigned int count; h->cmdbuf_ptr = h->cmdbuf_endp = h->cmdbuf_base; for (count = BUFSIZ; count; count -= n, h->cmdbuf_endp += n) if ((n = read(r->cmd_fd, h->cmdbuf_endp, count)) > 0) continue; else if (n == 0 || (n < 0 && errno == EAGAIN)) break; else { rxvt_clean_exit(); exit(EXIT_FAILURE); /* bad order of events? */ } if (count != BUFSIZ) /* some characters read in */ return *h->cmdbuf_ptr++; }#ifdef TRANSPARENT if (h->want_full_refresh) { h->want_full_refresh = 0; rxvt_scr_clear(r); rxvt_scr_touch(r, False); h->want_refresh = 1; }#endif if (h->want_refresh) { rxvt_scr_refresh(r, h->refresh_type); rxvt_scrollbar_show(r, 1);#ifdef USE_XIM rxvt_IMSendSpot(r);#endif } }/* NOTREACHED */}/*}}} *//* INTPROTO */voidrxvt_mouse_report(rxvt_t *r, const XButtonEvent *ev){ int button_number, key_state = 0; int x, y; x = ev->x; y = ev->y; rxvt_pixel_position(r, &x, &y); if (r->h->MEvent.button == AnyButton) { button_number = 3; } else { button_number = r->h->MEvent.button - Button1; /* add 0x3D for wheel events, like xterm does */ if (button_number >= 3) button_number += (64 - 3); } if (r->h->PrivateModes & PrivMode_MouseX10) { /* * do not report ButtonRelease * no state info allowed */ key_state = 0; if (button_number == 3) return; } else { /* XTerm mouse reporting needs these values: * 4 = Shift * 8 = Meta * 16 = Control * plus will add in our own Double-Click reporting * 32 = Double Click */ key_state = ((r->h->MEvent.state & ShiftMask) ? 4 : 0) + ((r->h->MEvent.state & r->h->ModMetaMask) ? 8 : 0) + ((r->h->MEvent.state & ControlMask) ? 16 : 0);#ifdef MOUSE_REPORT_DOUBLECLICK key_state += ((r->h->MEvent.clicks > 1) ? 32 : 0);#endif }#ifdef DEBUG_MOUSEREPORT fprintf(stderr, "Mouse ["); if (key_state & 16) fputc('C', stderr); if (key_state & 4) fputc('S', stderr); if (key_state & 8) fputc('A', stderr); if (key_state & 32) fputc('2', stderr); fprintf(stderr, "]: <%d>, %d/%d\n", button_number, x + 1, y + 1);#else rxvt_tt_printf(r, "\033[M%c%c%c", (32 + button_number + key_state), (32 + x + 1), (32 + y + 1));#endif}#ifdef USING_W11LIB/* EXTPROTO */voidrxvt_W11_process_x_event(XEvent *ev){ rxvt_t *r = rxvt_get_r(); rxvt_process_x_event(r, ev);}#endif/*{{{ process an X event *//* INTPROTO */voidrxvt_process_x_event(rxvt_t *r, XEvent *ev){ int i, want_time = 0; Window unused_root, unused_child; int unused_root_x, unused_root_y; unsigned int unused_mask; struct timeval tp; struct rxvt_hidden *h = r->h;#ifdef DEBUG_X const char *const eventnames[] = { /* mason - this matches my system */ "", "", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease", "MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", "FocusOut", "KeymapNotify", "Expose", "GraphicsExpose", "NoExpose", "VisibilityNotify", "CreateNotify", "DestroyNotify", "UnmapNotify", "MapNotify", "MapRequest", "ReparentNotify", "ConfigureNotify", "ConfigureRequest", "GravityNotify", "ResizeRequest", "CirculateNotify", "CirculateRequest", "PropertyNotify", "SelectionClear", "SelectionRequest", "SelectionNotify", "ColormapNotify", "ClientMessage", "MappingNotify" }; struct tm *ltt;#endif#ifdef DEBUG_X want_time = 1;#else /* * check if we need to get the time for any timeouts */ for (i = NUM_TIMEOUTS; i--; ) if (h->timeout[i].tv_sec) { want_time = 1; break; }#endif if (want_time) (void)gettimeofday(&tp, NULL);#ifdef DEBUG_X ltt = localtime(&(tp.tv_sec)); D_X((stderr, "Event: %-16s %-7s %08lx (%4d-%02d-%02d %02d:%02d:%02d.%.6ld) %s %lu", eventnames[ev->type], (ev->xany.window == r->TermWin.parent[0] ? "parent" : (ev->xany.window == r->TermWin.vt ? "vt" : (ev->xany.window == r->scrollBar.win ? "scroll" : (ev->xany.window == r->menuBar.win ? "menubar" : "UNKNOWN")))), (ev->xany.window == r->TermWin.parent[0] ? r->TermWin.parent[0] : (ev->xany.window == r->TermWin.vt ? r->TermWin.vt : (ev->xany.window == r->scrollBar.win ? r->scrollBar.win : (ev->xany.window == r->menuBar.win ? r->menuBar.win : 0)))), ltt->tm_year + 1900, ltt->tm_mon + 1, ltt->tm_mday, ltt->tm_hour, ltt->tm_min, ltt->tm_sec, tp.tv_usec, ev->xany.send_event ? "S" : " ", ev->xany.serial));#endif /* X event timeouts */ if (want_time) for (i = NUM_TIMEOUTS; i--; ) { if (h->timeout[i].tv_sec == 0) continue; if ((tp.tv_sec < h->timeout[i].tv_sec) || (tp.tv_sec == h->timeout[i].tv_sec && tp.tv_usec < h->timeout[i].tv_usec)) continue; h->timeout[i].tv_sec = 0; switch(i) { case TIMEOUT_INCR: rxvt_print_error("data loss: timeout on INCR selection paste"); h->selection_wait = Sel_none; break; default: break; } } switch (ev->type) { case KeyPress: rxvt_lookup_key(r, (XKeyEvent *)ev); break;#if defined(MOUSE_WHEEL) && defined(MOUSE_SLIP_WHEELING) case KeyRelease: { if (!(ev->xkey.state & ControlMask)) h->mouse_slip_wheel_speed = 0; else { KeySym ks; ks = XKeycodeToKeysym(r->Xdisplay, ev->xkey.keycode, 0); if (ks == XK_Control_L || ks == XK_Control_R) h->mouse_slip_wheel_speed = 0; } break; }#endif case ButtonPress: rxvt_button_press(r, (XButtonEvent *)ev);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -