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