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

📄 xkeybind.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	    *upper -= (XK_hstroke - XK_Hstroke);	else if (sym >= XK_gbreve && sym <= XK_jcircumflex)	    *upper -= (XK_gbreve - XK_Gbreve);	else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)	    *lower += (XK_cabovedot - XK_Cabovedot);	else if (sym >= XK_cabovedot && sym <= XK_scircumflex)	    *upper -= (XK_cabovedot - XK_Cabovedot);	break;#endif#ifdef XK_LATIN4    case 3:	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Rcedilla && sym <= XK_Tslash)	    *lower += (XK_rcedilla - XK_Rcedilla);	else if (sym >= XK_rcedilla && sym <= XK_tslash)	    *upper -= (XK_rcedilla - XK_Rcedilla);	else if (sym == XK_ENG)	    *lower = XK_eng;	else if (sym == XK_eng)	    *upper = XK_ENG;	else if (sym >= XK_Amacron && sym <= XK_Umacron)	    *lower += (XK_amacron - XK_Amacron);	else if (sym >= XK_amacron && sym <= XK_umacron)	    *upper -= (XK_amacron - XK_Amacron);	break;#endif    }}static intXTranslateKey(dpy, keycode, modifiers, modifiers_return, keysym_return)    register Display *dpy;    KeyCode keycode;    register unsigned int modifiers;    unsigned int *modifiers_return;    KeySym *keysym_return;{    int per;    register KeySym *syms;    KeySym sym, lsym, usym;    if ((! dpy->keysyms) && (! Initialize(dpy)))	return 0;    *modifiers_return = (ShiftMask|LockMask) | dpy->mode_switch;    if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))    {	*keysym_return = NoSymbol;	return 1;    }    per = dpy->keysyms_per_keycode;    syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];    while ((per > 2) && (syms[per - 1] == NoSymbol))	per--;    if ((per > 2) && (modifiers & dpy->mode_switch)) {	syms += 2;	per -= 2;    }    if (!(modifiers & ShiftMask) &&	(!(modifiers & LockMask) || (dpy->lock_meaning == NoSymbol))) {	if ((per == 1) || (syms[1] == NoSymbol))	    XConvertCase(dpy, syms[0], keysym_return, &usym);	else	    *keysym_return = syms[0];    } else if (!(modifiers & LockMask) ||	       (dpy->lock_meaning != XK_Caps_Lock)) {	if ((per == 1) || ((usym = syms[1]) == NoSymbol))	    XConvertCase(dpy, syms[0], &lsym, &usym);	*keysym_return = usym;    } else {	if ((per == 1) || ((sym = syms[1]) == NoSymbol))	    sym = syms[0];	XConvertCase(dpy, sym, &lsym, &usym);	if (!(modifiers & ShiftMask) && (sym != syms[0]) &&	    ((sym != usym) || (lsym == usym)))	    XConvertCase(dpy, syms[0], &lsym, &usym);	*keysym_return = usym;    }    if (*keysym_return == XK_VoidSymbol)	*keysym_return = NoSymbol;    return 1;}static intXTranslateKeySym(dpy, symbol, modifiers, buffer, nbytes)    Display *dpy;    register KeySym symbol;    unsigned int modifiers;    char *buffer;    int nbytes;{    register struct _XKeytrans *p;     int length;    unsigned long hiBytes;    register unsigned char c;    if (!symbol)	return 0;    /* see if symbol rebound, if so, return that string. */    for (p = dpy->key_bindings; p; p = p->next) {	if (((modifiers & AllMods) == p->state) && (symbol == p->key)) {	    length = p->len;	    if (length > nbytes) length = nbytes;	    bcopy (p->string, buffer, length);	    return length;	}    }    /* try to convert to Latin-1, handling control */    hiBytes = symbol >> 8;    if (!(nbytes &&	  ((hiBytes == 0) ||	   ((hiBytes == 0xFF) &&	    (((symbol >= XK_BackSpace) && (symbol <= XK_Clear)) ||	     (symbol == XK_Return) ||	     (symbol == XK_Escape) ||	     (symbol == XK_KP_Space) ||	     (symbol == XK_KP_Tab) ||	     (symbol == XK_KP_Enter) ||	     ((symbol >= XK_KP_Multiply) && (symbol <= XK_KP_9)) ||	     (symbol == XK_KP_Equal) ||	     (symbol == XK_Delete))))))	return 0;    /* if X keysym, convert to ascii by grabbing low 7 bits */    if (symbol == XK_KP_Space)	c = XK_space & 0x7F; /* patch encoding botch */    else if (symbol == XK_hyphen)	c = XK_minus & 0xFF; /* map to equiv character */    else if (hiBytes == 0xFF)	c = symbol & 0x7F;    else	c = symbol & 0xFF;    /* only apply Control key if it makes sense, else ignore it */    if (modifiers & ControlMask) {	if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;	else if (c == '2') c = '\000';	else if (c >= '3' && c <= '7') c -= ('3' - '\033');	else if (c == '8') c = '\177';	else if (c == '/') c = '_' & 0x1F;    }    buffer[0] = c;    return 1;}  /*ARGSUSED*/intXLookupString (event, buffer, nbytes, keysym, status)    register XKeyEvent *event;    char *buffer;	/* buffer */    int nbytes;	/* space in buffer for characters */    KeySym *keysym;    XComposeStatus *status;	/* not implemented */{    unsigned int modifiers;    KeySym symbol;    if (! XTranslateKey(event->display, event->keycode, event->state,		  &modifiers, &symbol))	return 0;    if (keysym)	*keysym = symbol;    /* arguable whether to use (event->state & ~modifiers) here */    return XTranslateKeySym(event->display, symbol, event->state,			    buffer, nbytes);}static void_XFreeKeyBindings (dpy)    Display *dpy;{    register struct _XKeytrans *p, *np;    for (p = dpy->key_bindings; p; p = np) {	np = p->next;	Xfree(p->string);	Xfree((char *)p->modifiers);	Xfree((char *)p);    }   }#if NeedFunctionPrototypesXRebindKeysym (    Display *dpy,    KeySym keysym,    KeySym *mlist,    int nm,		/* number of modifiers in mlist */    _Xconst unsigned char *str,    int nbytes)#elseXRebindKeysym (dpy, keysym, mlist, nm, str, nbytes)    Display *dpy;    KeySym keysym;    KeySym *mlist;    int nm;		/* number of modifiers in mlist */    unsigned char *str;    int nbytes;#endif{    register struct _XKeytrans *tmp, *p;    int nb;    if ((! dpy->keysyms) && (! Initialize(dpy)))	return;    LockDisplay(dpy);    tmp = dpy->key_bindings;    nb = sizeof(KeySym) * nm;    if ((! (p = (struct _XKeytrans *) Xmalloc( sizeof(struct _XKeytrans)))) ||	((! (p->string = (char *) Xmalloc( (unsigned) nbytes))) && 	 (nbytes > 0)) ||	((! (p->modifiers = (KeySym *) Xmalloc( (unsigned) nb))) &&	 (nb > 0))) {	if (p) {	    if (p->string) Xfree(p->string);	    if (p->modifiers) Xfree((char *) p->modifiers);	    Xfree((char *) p);	}	UnlockDisplay(dpy);	return;    }    dpy->key_bindings = p;    dpy->free_funcs->key_bindings = _XFreeKeyBindings;    p->next = tmp;	/* chain onto list */    bcopy ((char *) str, p->string, nbytes);    p->len = nbytes;    bcopy ((char *) mlist, (char *) p->modifiers, nb);    p->key = keysym;    p->mlen = nm;    ComputeMaskFromKeytrans(dpy, p);    UnlockDisplay(dpy);    return;}/* * given a KeySym, returns the first keycode containing it, if any. */static CARD8FindKeyCode(dpy, code)    register Display *dpy;    register KeySym code;{    register KeySym *kmax = dpy->keysyms + 	(dpy->max_keycode - dpy->min_keycode + 1) * dpy->keysyms_per_keycode;    register KeySym *k = dpy->keysyms;    while (k < kmax) {	if (*k == code)	    return (((k - dpy->keysyms) / dpy->keysyms_per_keycode) +		    dpy->min_keycode);	k += 1;	}    return 0;}	/* * given a list of modifiers, computes the mask necessary for later matching. * This routine must lookup the key in the Keymap and then search to see * what modifier it is bound to, if any.  Sets the AnyModifier bit if it * can't map some keysym to a modifier. */staticComputeMaskFromKeytrans(dpy, p)    Display *dpy;    register struct _XKeytrans *p;{    register int i;    register CARD8 code;    register XModifierKeymap *m = dpy->modifiermap;    p->state = AnyModifier;    for (i = 0; i < p->mlen; i++) {	/* if not found, then not on current keyboard */	if ((code = FindKeyCode(dpy, p->modifiers[i])) == 0)		return;	/* code is now the keycode for the modifier you want */	{	    register int j = m->max_keypermod<<3;	    while ((--j >= 0) && (code != m->modifiermap[j]))		;	    if (j < 0)		return;	    p->state |= (1<<(j/m->max_keypermod));	}    }    p->state &= AllMods;}

⌨️ 快捷键说明

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