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 + -
显示快捷键?