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

📄 xkeybind.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $XConsortium: XKeyBind.c,v 11.67 92/05/19 11:23:14 converse Exp $ *//* Copyright 1985, 1987, Massachusetts Institute of Technology *//*Permission to use, copy, modify, distribute, and sell this software and itsdocumentation for any purpose is hereby granted without fee, provided thatthe above copyright notice appear in all copies and that both thatcopyright notice and this permission notice appear in supportingdocumentation, and that the name of M.I.T. not be used in advertising orpublicity pertaining to distribution of the software without specific,written prior permission.  M.I.T. makes no representations about thesuitability of this software for any purpose.  It is provided "as is"without express or implied warranty.*//* Beware, here be monsters (still under construction... - JG */#define NEED_EVENTS#include <X11/Xlibint.h>#include <X11/Xutil.h>#define XK_MISCELLANY#define XK_LATIN1#define XK_LATIN2#define XK_LATIN3#define XK_LATIN4#include <X11/keysymdef.h>#include <stdio.h>#define AllMods (ShiftMask|LockMask|ControlMask| \		 Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)static ComputeMaskFromKeytrans();static int Initialize();static void XConvertCase();struct _XKeytrans {	struct _XKeytrans *next;/* next on list */	char *string;		/* string to return when the time comes */	int len;		/* length of string (since NULL is legit)*/	KeySym key;		/* keysym rebound */	unsigned int state;	/* modifier state */	KeySym *modifiers;	/* modifier keysyms you want */	int mlen;		/* length of modifier list */};static KeySymKeyCodetoKeySym(dpy, keycode, col)    register Display *dpy;    KeyCode keycode;    int col;{    register int per = dpy->keysyms_per_keycode;    register KeySym *syms;    KeySym lsym, usym;    if ((col < 0) || ((col >= per) && (col > 3)) ||	((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))      return NoSymbol;    syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];    if (col < 4) {	if (col > 1) {	    while ((per > 2) && (syms[per - 1] == NoSymbol))		per--;	    if (per < 3)		col -= 2;	}	if ((per <= (col|1)) || (syms[col|1] == NoSymbol)) {	    XConvertCase(dpy, syms[col&~1], &lsym, &usym);	    if (!(col & 1))		return lsym;	    else if (usym == lsym)		return NoSymbol;	    else		return usym;	}    }    return syms[col];}#if NeedFunctionPrototypesKeySymXKeycodeToKeysym(Display *dpy,#if NeedWidePrototypes		 unsigned int kc,#else		 KeyCode kc,#endif		 int col)#elseKeySymXKeycodeToKeysym(dpy, kc, col)    Display *dpy;    KeyCode kc;    int col;#endif{    if ((! dpy->keysyms) && (! Initialize(dpy)))	return NoSymbol;    return KeyCodetoKeySym(dpy, kc, col);}KeyCodeXKeysymToKeycode(dpy, ks)    Display *dpy;    KeySym ks;{    register int i, j;    if ((! dpy->keysyms) && (! Initialize(dpy)))	return (KeyCode) 0;    for (j = 0; j < dpy->keysyms_per_keycode; j++) {	for (i = dpy->min_keycode; i <= dpy->max_keycode; i++) {	    if (KeyCodetoKeySym(dpy, (KeyCode) i, j) == ks)		return i;	}    }    return 0;}KeySymXLookupKeysym(event, col)    register XKeyEvent *event;    int col;{    if ((! event->display->keysyms) && (! Initialize(event->display)))	return NoSymbol;    return KeyCodetoKeySym(event->display, event->keycode, col);}static intInitModMap(dpy)    Display *dpy;{    register XModifierKeymap *map;    register int i, j, n;    KeySym sym;    register struct _XKeytrans *p;    if (! (dpy->modifiermap = map = XGetModifierMapping(dpy)))	return 0;    dpy->free_funcs->modifiermap = XFreeModifiermap;    if ((! dpy->keysyms) && (! Initialize(dpy)))	return 0;    LockDisplay(dpy);    /* If any Lock key contains Caps_Lock, then interpret as Caps_Lock,     * else if any contains Shift_Lock, then interpret as Shift_Lock,     * else ignore Lock altogether.     */    dpy->lock_meaning = NoSymbol;    /* Lock modifiers are in the second row of the matrix */    n = 2 * map->max_keypermod;    for (i = map->max_keypermod; i < n; i++) {	for (j = 0; j < dpy->keysyms_per_keycode; j++) {	    sym = KeyCodetoKeySym(dpy, map->modifiermap[i], j);	    if (sym == XK_Caps_Lock) {		dpy->lock_meaning = XK_Caps_Lock;		break;	    } else if (sym == XK_Shift_Lock) {		dpy->lock_meaning = XK_Shift_Lock;	    }	}    }    /* Now find any Mod<n> modifier acting as the Group modifier */    dpy->mode_switch = 0;    n *= 4;    for (i = 3*map->max_keypermod; i < n; i++) {	for (j = 0; j < dpy->keysyms_per_keycode; j++) {	    sym = KeyCodetoKeySym(dpy, map->modifiermap[i], j);	    if (sym == XK_Mode_switch)		dpy->mode_switch |= 1 << (i / map->max_keypermod);	}    }    for (p = dpy->key_bindings; p; p = p->next)	ComputeMaskFromKeytrans(dpy, p);    UnlockDisplay(dpy);    return 1;}XRefreshKeyboardMapping(event)    register XMappingEvent *event;{    if(event->request == MappingKeyboard) {	/* XXX should really only refresh what is necessary	 * for now, make initialize test fail	 */	LockDisplay(event->display);	if (event->display->keysyms) {	     Xfree ((char *)event->display->keysyms);	     event->display->keysyms = NULL;	}	UnlockDisplay(event->display);    }    if(event->request == MappingModifier) {	LockDisplay(event->display);	if (event->display->modifiermap) {	    XFreeModifiermap(event->display->modifiermap);	    event->display->modifiermap = NULL;	}	UnlockDisplay(event->display);	/* go ahead and get it now, since initialize test may not fail */	(void) InitModMap(event->display);    }}static intInitialize(dpy)    Display *dpy;{    int per, n;    KeySym *keysyms;    /*      * lets go get the keysyms from the server.     */    if (!dpy->keysyms) {	n = dpy->max_keycode - dpy->min_keycode + 1;	keysyms = XGetKeyboardMapping (dpy, (KeyCode) dpy->min_keycode,				       n, &per);	/* keysyms may be NULL */	if (! keysyms) return 0;	LockDisplay(dpy);	dpy->keysyms = keysyms;	dpy->keysyms_per_keycode = per;	UnlockDisplay(dpy);    }    if (!dpy->modifiermap)        return InitModMap(dpy);    return 1;}/*ARGSUSED*/static voidXConvertCase(dpy, sym, lower, upper)    Display *dpy;    register KeySym sym;    KeySym *lower;    KeySym *upper;{    *lower = sym;    *upper = sym;    switch(sym >> 8) {    case 0:	if ((sym >= XK_A) && (sym <= XK_Z))	    *lower += (XK_a - XK_A);	else if ((sym >= XK_a) && (sym <= XK_z))	    *upper -= (XK_a - XK_A);	else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))	    *lower += (XK_agrave - XK_Agrave);	else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis))	    *upper -= (XK_agrave - XK_Agrave);	else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn))	    *lower += (XK_oslash - XK_Ooblique);	else if ((sym >= XK_oslash) && (sym <= XK_thorn))	    *upper -= (XK_oslash - XK_Ooblique);	break;#ifdef XK_LATIN2    case 1:	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym == XK_Aogonek)	    *lower = XK_aogonek;	else if (sym >= XK_Lstroke && sym <= XK_Sacute)	    *lower += (XK_lstroke - XK_Lstroke);	else if (sym >= XK_Scaron && sym <= XK_Zacute)	    *lower += (XK_scaron - XK_Scaron);	else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)	    *lower += (XK_zcaron - XK_Zcaron);	else if (sym == XK_aogonek)	    *upper = XK_Aogonek;	else if (sym >= XK_lstroke && sym <= XK_sacute)	    *upper -= (XK_lstroke - XK_Lstroke);	else if (sym >= XK_scaron && sym <= XK_zacute)	    *upper -= (XK_scaron - XK_Scaron);	else if (sym >= XK_zcaron && sym <= XK_zabovedot)	    *upper -= (XK_zcaron - XK_Zcaron);	else if (sym >= XK_Racute && sym <= XK_Tcedilla)	    *lower += (XK_racute - XK_Racute);	else if (sym >= XK_racute && sym <= XK_tcedilla)	    *upper -= (XK_racute - XK_Racute);	break;#endif#ifdef XK_LATIN3    case 2:	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)	    *lower += (XK_hstroke - XK_Hstroke);	else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)	    *lower += (XK_gbreve - XK_Gbreve);	else if (sym >= XK_hstroke && sym <= XK_hcircumflex)

⌨️ 快捷键说明

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