rxvtlib_command.c
来自「具有IDE功能的编辑器」· C语言 代码 · 共 2,607 行 · 第 1/5 页
C
2,607 行
# ifdef VSWTCH FOO (VSWTCH, "VSWTCH");# endif FOO (VSTART, "VSTART"); FOO (VSTOP, "VSTOP"); FOO (VSUSP, "VSUSP");# ifdef VDSUSP FOO (VDSUSP, "VDSUSP");# endif# ifdef VREPRINT FOO (VREPRINT, "VREPRINT");# endif# ifdef VDISCRD FOO (VDISCRD, "VDISCRD");# endif# ifdef VWERSE FOO (VWERSE, "VWERSE");# endif# ifdef VLNEXT FOO (VLNEXT, "VLNEXT");# endif fprintf (stderr, "\n\n");#endif /* HAVE_TERMIOS_H */}#endif /* DEBUG_TTYMODE *//*}}} *//*{{{ get_ttymode() *//* INTPROTO */void get_ttymode (ttymode_t * tio){#ifdef HAVE_TERMIOS_H/* * standard System V termios interface */ if (GET_TERMIOS (0, tio) < 0) { /* return error - use system defaults */ tio->c_cc[VINTR] = CINTR; tio->c_cc[VQUIT] = CQUIT; tio->c_cc[VERASE] = CERASE; tio->c_cc[VKILL] = CKILL; tio->c_cc[VSTART] = CSTART; tio->c_cc[VSTOP] = CSTOP; tio->c_cc[VSUSP] = CSUSP;# ifdef VDSUSP tio->c_cc[VDSUSP] = CDSUSP;# endif# ifdef VREPRINT tio->c_cc[VREPRINT] = CRPRNT;# endif# ifdef VDISCRD tio->c_cc[VDISCRD] = CFLUSH;# endif# ifdef VWERSE tio->c_cc[VWERSE] = CWERASE;# endif# ifdef VLNEXT tio->c_cc[VLNEXT] = CLNEXT;# endif } tio->c_cc[VEOF] = CEOF; tio->c_cc[VEOL] = VDISABLE;# ifdef VEOL2 tio->c_cc[VEOL2] = VDISABLE;# endif# ifdef VSWTC tio->c_cc[VSWTC] = VDISABLE;# endif# ifdef VSWTCH tio->c_cc[VSWTCH] = VDISABLE;# endif# if VMIN != VEOF tio->c_cc[VMIN] = 1;# endif# if VTIME != VEOL tio->c_cc[VTIME] = 0;# endif/* input modes */ tio->c_iflag = (BRKINT | IGNPAR | ICRNL | IXON# ifdef IMAXBEL | IMAXBEL# endif );/* output modes */ tio->c_oflag = (OPOST | ONLCR);/* control modes */ tio->c_cflag = (CS8 | CREAD);/* line discipline modes */ tio->c_lflag = (ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK# if defined (ECHOCTL) && defined (ECHOKE) | ECHOCTL | ECHOKE# endif );#else /* HAVE_TERMIOS_H *//* * sgtty interface *//* get parameters -- gtty */ if (ioctl (0, TIOCGETP, &(tio->sg)) < 0) { tio->sg.sg_erase = CERASE; /* ^H */ tio->sg.sg_kill = CKILL; /* ^U */ } tio->sg.sg_flags = (CRMOD | ECHO | EVENP | ODDP);/* get special characters */ if (ioctl (0, TIOCGETC, &(tio->tc)) < 0) { tio->tc.t_intrc = CINTR; /* ^C */ tio->tc.t_quitc = CQUIT; /* ^\ */ tio->tc.t_startc = CSTART; /* ^Q */ tio->tc.t_stopc = CSTOP; /* ^S */ tio->tc.t_eofc = CEOF; /* ^D */ tio->tc.t_brkc = -1; }/* get local special chars */ if (ioctl (0, TIOCGLTC, &(tio->lc)) < 0) { tio->lc.t_suspc = CSUSP; /* ^Z */ tio->lc.t_dsuspc = CDSUSP; /* ^Y */ tio->lc.t_rprntc = CRPRNT; /* ^R */ tio->lc.t_flushc = CFLUSH; /* ^O */ tio->lc.t_werasc = CWERASE; /* ^W */ tio->lc.t_lnextc = CLNEXT; /* ^V */ }/* get line discipline */ ioctl (0, TIOCGETD, &(tio->line));# ifdef NTTYDISC tio->line = NTTYDISC;# endif /* NTTYDISC */ tio->local = (LCRTBS | LCRTERA | LCTLECH | LPASS8 | LCRTKIL);#endif /* HAVE_TERMIOS_H */}/*}}} *//* * Probe the modifier keymap to get the Meta (Alt) and Num_Lock settings * Use resource ``modifier'' to override the modifier *//* INTPROTO */void rxvtlib_get_ourmods (rxvtlib *o){ int i, j, k, m; int got_meta, got_numlock; XModifierKeymap *map; KeyCode *kc; unsigned int modmasks[] = { Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; got_meta = got_numlock = m = 0; if (o->rs[Rs_modifier] && o->rs[Rs_modifier][0] == 'm' && o->rs[Rs_modifier][1] == 'o' && o->rs[Rs_modifier][2] == 'd' && o->rs[Rs_modifier][3] >= '1' && o->rs[Rs_modifier][3] <= '5' && !o->rs[Rs_modifier][4]) { o->ModMetaMask = modmasks[(o->rs[Rs_modifier][3] - '1')]; got_meta = 1; } map = XGetModifierMapping (o->Xdisplay); kc = map->modifiermap; for (i = 3; i < 8; i++) { k = i * map->max_keypermod; for (j = 0; j < map->max_keypermod; j++, k++) { if (kc[k] == 0) break; switch (XKeycodeToKeysym (o->Xdisplay, kc[k], 0)) { case XK_Num_Lock: if (!got_numlock) { o->ModNumLockMask = modmasks[i - 3]; got_numlock = 1; } break; case XK_Meta_L: case XK_Meta_R: if (o->rs[Rs_modifier] && !strncasecmp (o->rs[Rs_modifier], "meta", 4)) { o->ModMetaMask = modmasks[i - 3]; got_meta = 1; break; } /* FALLTHROUGH */ case XK_Alt_L: case XK_Alt_R: if (o->rs[Rs_modifier] && !strncasecmp (o->rs[Rs_modifier], "alt", 3)) { o->ModMetaMask = modmasks[i - 3]; got_meta = 1; break; } m = modmasks[i - 3]; break; case XK_Super_L: case XK_Super_R: if (o->rs[Rs_modifier] && !strncasecmp (o->rs[Rs_modifier], "super", 5)) { o->ModMetaMask = modmasks[i - 3]; got_meta = 1; } break; case XK_Hyper_L: case XK_Hyper_R: if (o->rs[Rs_modifier] && !strncasecmp (o->rs[Rs_modifier], "hyper", 5)) { o->ModMetaMask = modmasks[i - 3]; got_meta = 1; } /* FALLTHROUGH */ default: break; } } if (got_meta && got_numlock) break; } XFreeModifiermap (map); if (!got_meta && m) o->ModMetaMask = m;}/*{{{ init_command() *//* EXTPROTO */void rxvtlib_init_command (rxvtlib *o, const char *const *argv, int do_sleep){/* * Initialize the command connection. * This should be called after the X server connection is established. *//* Enable delete window protocol */ o->wmDeleteWindow = XInternAtom (o->Xdisplay, "WM_DELETE_WINDOW", False); XSetWMProtocols (o->Xdisplay, o->TermWin.parent[0], &o->wmDeleteWindow, 1);/* get number of available file descriptors */#if defined(_POSIX_VERSION) || ! defined(__svr4__) o->num_fds = sysconf (_SC_OPEN_MAX);#else o->num_fds = getdtablesize ();#endif#ifdef META8_OPTION o->meta_char = (o->Options & Opt_meta8 ? 0x80 : 033);#endif rxvtlib_get_ourmods (o); if (!(o->Options & Opt_scrollTtyOutput)) o->PrivateModes |= PrivMode_TtyOutputInh; if (o->Options & Opt_scrollKeypress) o->PrivateModes |= PrivMode_Keypress;#ifndef NO_BACKSPACE_KEY if (strcmp (o->key_backspace, "DEC") == 0) o->PrivateModes |= PrivMode_HaveBackSpace;#endif#ifdef GREEK_SUPPORT greek_init ();#endif o->Xfd = XConnectionNumber (o->Xdisplay); o->cmdbuf_ptr = o->cmdbuf_endp = o->cmdbuf_base; rxvtlib_run_command (o, argv, do_sleep); if (o->cmd_fd < 0) { print_error ("aborting"); o->killed = EXIT_FAILURE | DO_EXIT; }}/*}}} */#ifndef STANDALONEextern int option_use_xim;#endif/*{{{ Xlocale *//* * This is more or less stolen straight from XFree86 xterm. * This should support all European type languages. *//* EXTPROTO */void rxvtlib_init_xlocale (rxvtlib * o){ char *locale = NULL;#if !defined(NO_XSETLOCALE) || !defined(NO_SETLOCALE) locale = setlocale (LC_CTYPE, "");#endif#ifdef USE_XIM if (locale == NULL) print_error ("Setting locale failed."); else { /* To avoid Segmentation Fault in C locale */ rxvtlib_setTermFontSet (o);#ifndef STANDALONE if (option_use_xim)#endif#ifdef MULTICHAR_SET if (strcmp (locale, "C"))#endif XRegisterIMInstantiateCallback (o->Xdisplay, NULL, NULL, NULL, rxvtlib_IMInstantiateCallback, (XPointer) o); }#endif}/*}}} *//*{{{ window resizing *//* * Tell the teletype handler what size the window is. * Called after a window size change. *//* INTPROTO */void rxvtlib_tt_winsize (rxvtlib *o, int fd){ struct winsize ws; if (fd < 0) return; ws.ws_col = (unsigned short)o->TermWin.ncol; ws.ws_row = (unsigned short)o->TermWin.nrow; ws.ws_xpixel = ws.ws_ypixel = 0; ioctl (fd, TIOCSWINSZ, &ws);}/* EXTPROTO */void rxvtlib_tt_resize (rxvtlib *o){ rxvtlib_tt_winsize (o, o->cmd_fd);}/*}}} *//*{{{ Convert the keypress event into a string *//* INTPROTO */void rxvtlib_lookup_key (rxvtlib *o, XEvent * ev){ int ctrl, meta, shft, len; KeySym keysym; static XComposeStatus compose = { NULL, 0 }; static unsigned char kbuf[KBUFSZ]; static int numlock_state = 0;#ifdef DEBUG_CMD static int debug_key = 1; /* accessible by a debugger only */#endif#ifdef GREEK_SUPPORT static short greek_mode = 0;#endif#ifdef USE_XIM int valid_keysym = 0;#endif/* * 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 */ shft = (ev->xkey.state & ShiftMask); ctrl = (ev->xkey.state & ControlMask); meta = (ev->xkey.state & o->ModMetaMask); if (numlock_state || (ev->xkey.state & o->ModNumLockMask)) { numlock_state = (ev->xkey.state & o->ModNumLockMask); PrivMode ((!numlock_state), PrivMode_aplKP); }#ifdef USE_XIM len = 0; if (o->Input_Context != NULL) { Status status_return; kbuf[0] = '\0'; len = XmbLookupString (o->Input_Context, &ev->xkey, (char *)kbuf, sizeof (kbuf), &keysym, &status_return); valid_keysym = ((status_return == XLookupKeySym) || (status_return == XLookupBoth)); } else len = XLookupString (&ev->xkey, (char *)kbuf, sizeof (kbuf), &keysym, &compose);#else /* USE_XIM */ len = XLookupString (&ev->xkey, (char *)kbuf, sizeof (kbuf), &keysym, &compose);/* * map unmapped Latin[2-4]/Katakana/Arabic/Cyrillic/Greek entries -> Latin1 * good for installations with correct fonts, but without XLOCALE */ if (!len && (keysym >= 0x0100) && (keysym < 0x0800)) { len = 1; kbuf[0] = (keysym & 0xFF); }#endif /* USE_XIM */ if (len && (o->Options & Opt_scrollKeypress)) o->TermWin.view_start = 0;#ifdef USE_XIM if (valid_keysym) {#endif/* for some backwards compatibility */#if defined(HOTKEY_CTRL) || defined(HOTKEY_META)# ifdef HOTKEY_CTRL if (ctrl)# else if (meta)# endif { if (keysym == o->ks_bigfont) { rxvtlib_change_font (o, 0, FONT_UP); return; } else if (keysym == o->ks_smallfont) { rxvtlib_change_font (o, 0, FONT_DN); return; } }#endif if (o->TermWin.saveLines) {#ifdef UNSHIFTED_SCROLLKEYS if (!ctrl && !meta)#else if (IS_SCROLL_MOD)#endif { int lnsppg;#ifdef PAGING_CONTEXT_LINES lnsppg = o->TermWin.nrow - PAGING_CONTEXT_LINES;#else lnsppg = o->TermWin.nrow * 4 / 5;#endif if (keysym == XK_Prior) { rxvtlib_scr_page (o, UP, lnsppg); return; } else if (keysym == XK_Next) { rxvtlib_scr_page (o, DN, lnsppg); return; } } if (IS_SCROLL_MOD) { if (keysym == XK_Up) { rxvtlib_scr_page (o, UP, 1); return; } else if (keysym == XK_Down) { rxvtlib_scr_page (o, DN, 1); return; } } } if (shft) { /* Shift + F1 - F10 generates F11 - F20 */ if (keysym >= XK_F1 && keysym <= XK_F10) { keysym += (XK_F11 - XK_F1); shft = 0; /* turn off Shift */ } else if (!ctrl && !meta && (o->PrivateModes & PrivMode_ShiftKeys)) { switch (keysym) { /* normal XTerm key bindings */ case XK_Insert: /* Shift+Insert = paste mouse selection */ rxvtlib_selection_request (o, ev->xkey.time, 0, 0); return; /* rxvt extras */ case XK_KP_Add: /* Shift+KP_Add = bigger font */ rxvtlib_change_font (o, 0, FONT_UP); return; case XK_KP_Subtract: /* Shift+KP_Subtract = smaller font */ rxvtlib_change_font (o, 0, FONT_DN); return; } } }#ifdef PRINTPIPE if (keysym == XK_Print) { rxvtlib_scr_printscreen (o, ctrl | shft); return; }#endif#ifdef GREEK_SUPPORT if (keysym == XK_Mode_switch) { greek_mode = !greek_mode; if (greek_mode) { rxvtlib_xterm_seq (o, XTerm_title, (greek_getmode () == GREEK_ELOT928 ? "[Greek: iso]" : "[Greek: ibm]")); greek_reset (); } else rxvtlib_xterm_seq (o, XTerm_title, APL_NAME "-" VERSION); return; }#endif if (keysym >= 0xFF00 && keysym <= 0xFFFF) {#ifdef KEYSYM_RESOURCE if (!(shft | ctrl) && o->KeySym_map[keysym - 0xFF00] != NULL) { unsigned int len; const unsigned char *kbuf; const unsigned char ch = '\033'; kbuf = (o->KeySym_map[keysym - 0xFF00]); len = *kbuf++; /* escape prefix */ if (meta)# ifdef META8_OPTION if (o->meta_char == 033)# endif rxvtlib_tt_write (o, &ch, 1); rxvtlib_tt_write (o, kbuf, len); return; } else#endif switch (keysym) {#ifndef NO_BACKSPACE_KEY case XK_BackSpace:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?