summaryrefslogtreecommitdiff
path: root/src/xkb/XKBBind.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xkb/XKBBind.c')
-rw-r--r--src/xkb/XKBBind.c259
1 files changed, 73 insertions, 186 deletions
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c
index 4c6334a7..ba9f53fa 100644
--- a/src/xkb/XKBBind.c
+++ b/src/xkb/XKBBind.c
@@ -26,9 +26,12 @@ other dealings in this Software without prior written authorization
from The Open Group.
*/
+/* $XFree86: xc/lib/X11/XKBBind.c,v 3.19 2003/05/27 22:26:25 tsi Exp $ */
+
/* the new monsters ate the old ones */
#define NEED_EVENTS
+#include "XKBlib.h"
#include <X11/Xlibint.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
@@ -47,9 +50,7 @@ from The Open Group.
Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
static int _XkbLoadDpy(
-#if NeedFunctionPrototypes
Display *dpy
-#endif
);
struct _XKeytrans {
@@ -63,7 +64,6 @@ struct _XKeytrans {
};
KeySym
-#if NeedFunctionPrototypes
XkbKeycodeToKeysym(Display *dpy,
#if NeedWidePrototypes
unsigned int kc,
@@ -72,13 +72,6 @@ XkbKeycodeToKeysym(Display *dpy,
#endif
int group,
int level)
-#else
-XkbKeycodeToKeysym(dpy, kc, group, level)
- Display *dpy;
- KeyCode kc;
- int group;
- int level;
-#endif
{
XkbDescRec *xkb;
@@ -107,7 +100,6 @@ XkbKeycodeToKeysym(dpy, kc, group, level)
}
KeySym
-#if NeedFunctionPrototypes
XKeycodeToKeysym(Display *dpy,
#if NeedWidePrototypes
unsigned int kc,
@@ -115,12 +107,6 @@ XKeycodeToKeysym(Display *dpy,
KeyCode kc,
#endif
int col)
-#else
-XKeycodeToKeysym(dpy, kc, col)
- Display *dpy;
- KeyCode kc;
- int col;
-#endif
{
XkbDescRec *xkb;
@@ -165,13 +151,7 @@ XKeycodeToKeysym(dpy, kc, col)
}
KeyCode
-#if NeedFunctionPrototypes
XKeysymToKeycode(Display *dpy, KeySym ks)
-#else
-XKeysymToKeycode(dpy, ks)
- Display *dpy;
- KeySym ks;
-#endif
{
register int i, j, gotOne;
@@ -196,12 +176,7 @@ XKeysymToKeycode(dpy, ks)
}
static int
-#if NeedFunctionPrototypes
_XkbComputeModmap(Display *dpy)
-#else
-_XkbComputeModmap(dpy)
- Display *dpy;
-#endif
{
register XkbDescPtr xkb;
@@ -212,13 +187,7 @@ register XkbDescPtr xkb;
}
unsigned
-#if NeedFunctionPrototypes
XkbKeysymToModifiers(Display *dpy,KeySym ks)
-#else
-XkbKeysymToModifiers(dpy,ks)
- Display *dpy;
- KeySym ks;
-#endif
{
XkbDescRec *xkb;
register int i,j;
@@ -247,13 +216,7 @@ XkbKeysymToModifiers(dpy,ks)
}
KeySym
-#if NeedFunctionPrototypes
XLookupKeysym(register XKeyEvent *event, int col)
-#else
-XLookupKeysym(event, col)
- register XKeyEvent *event;
- int col;
-#endif
{
Display *dpy = event->display;
if (_XkbUnavailable(dpy))
@@ -268,39 +231,27 @@ XLookupKeysym(event, col)
* version will continue to work in a shared library environment.
*/
int
-#if NeedFunctionPrototypes
+XkbTranslateKey( register Display * dpy,
+ KeyCode key,
+ register unsigned int mods,
+ unsigned int * mods_rtrn,
+ KeySym * keysym_rtrn);
+int
XkbTranslateKey( register Display * dpy,
KeyCode key,
register unsigned int mods,
unsigned int * mods_rtrn,
KeySym * keysym_rtrn)
-#else
-XkbTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn)
- register Display *dpy;
- KeyCode key;
- register unsigned int mods;
- unsigned int *mods_rtrn;
- KeySym *keysym_rtrn;
-#endif
{
return XkbLookupKeySym(dpy,key,mods,mods_rtrn,keysym_rtrn);
}
Bool
-#if NeedFunctionPrototypes
XkbLookupKeySym( register Display * dpy,
KeyCode key,
register unsigned int mods,
unsigned int * mods_rtrn,
KeySym * keysym_rtrn)
-#else
-XkbLookupKeySym(dpy, key, mods, mods_rtrn, keysym_rtrn)
- register Display *dpy;
- KeyCode key;
- register unsigned int mods;
- unsigned int *mods_rtrn;
- KeySym *keysym_rtrn;
-#endif
{
if (_XkbUnavailable(dpy))
return _XTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn);
@@ -310,20 +261,11 @@ XkbLookupKeySym(dpy, key, mods, mods_rtrn, keysym_rtrn)
}
Bool
-#if NeedFunctionPrototypes
XkbTranslateKeyCode( register XkbDescPtr xkb,
KeyCode key,
register unsigned int mods,
unsigned int * mods_rtrn,
KeySym * keysym_rtrn)
-#else
-XkbTranslateKeyCode(xkb, key, mods, mods_rtrn, keysym_rtrn)
- register XkbDescPtr xkb;
- KeyCode key;
- register unsigned int mods;
- unsigned int *mods_rtrn;
- KeySym *keysym_rtrn;
-#endif
{
XkbKeyTypeRec *type;
int col,nKeyGroups;
@@ -398,12 +340,7 @@ XkbTranslateKeyCode(xkb, key, mods, mods_rtrn, keysym_rtrn)
}
Status
-#if NeedFunctionPrototypes
XkbRefreshKeyboardMapping(register XkbMapNotifyEvent *event)
-#else
-XkbRefreshKeyboardMapping(event)
- register XkbMapNotifyEvent *event;
-#endif
{
Display *dpy = event->display;
XkbInfoPtr xkbi;
@@ -446,20 +383,18 @@ XkbRefreshKeyboardMapping(event)
}
int
-#if NeedFunctionPrototypes
XRefreshKeyboardMapping(register XMappingEvent *event)
-#else
-XRefreshKeyboardMapping(event)
- register XMappingEvent *event;
-#endif
{
XkbEvent *xkbevent = (XkbEvent *)event;
Display *dpy = event->display;
XkbMapChangesRec changes;
XkbInfoPtr xkbi;
+ /* always do this for input methods, which still use the old keymap */
+ (void) _XRefreshKeyboardMapping(event);
+
if (_XkbUnavailable(dpy))
- return _XRefreshKeyboardMapping(event);
+ return 1;
xkbi = dpy->xkb_info;
@@ -532,6 +467,7 @@ XRefreshKeyboardMapping(event)
UnlockDisplay(dpy);
}
if (event->request==MappingModifier) {
+ LockDisplay(dpy);
if (xkbi->desc->map->modmap) {
_XkbFree(xkbi->desc->map->modmap);
xkbi->desc->map->modmap= NULL;
@@ -556,12 +492,7 @@ XRefreshKeyboardMapping(event)
}
static int
-#if NeedFunctionPrototypes
_XkbLoadDpy(Display *dpy)
-#else
-_XkbLoadDpy(dpy)
- Display *dpy;
-#endif
{
XkbInfoPtr xkbi;
unsigned query,oldEvents;
@@ -582,8 +513,6 @@ _XkbLoadDpy(dpy)
LockDisplay(dpy);
xkbi->desc = desc;
- _XkbGetConverters(_XkbGetCharset(),&xkbi->cvt);
- _XkbGetConverters("ISO8859-1",&xkbi->latin1cvt);
UnlockDisplay(dpy);
oldEvents= xkbi->selected_events;
if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards)) {
@@ -600,12 +529,7 @@ _XkbLoadDpy(dpy)
}
void
-#if NeedFunctionPrototypes
_XkbReloadDpy(Display *dpy)
-#else
-_XkbReloadDpy(dpy)
- Display *dpy;
-#endif
{
XkbInfoPtr xkbi;
XkbDescRec *desc;
@@ -648,56 +572,37 @@ _XkbReloadDpy(dpy)
}
int
-#if NeedFunctionPrototypes
XkbTranslateKeySym( register Display * dpy,
register KeySym * sym_rtrn,
unsigned int mods,
char * buffer,
int nbytes,
int * extra_rtrn)
-#else
-XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn)
- register Display *dpy;
- register KeySym *sym_rtrn;
- unsigned int mods;
- char *buffer;
- int nbytes;
- int *extra_rtrn;
-#endif
{
register XkbInfoPtr xkb;
XkbKSToMBFunc cvtr;
XPointer priv;
char tmp[4];
- register struct _XKeytrans *p;
int n;
+ xkb= dpy->xkb_info;
+ if (!xkb->cvt.KSToMB) {
+ _XkbGetConverters(_XkbGetCharset(),&xkb->cvt);
+ _XkbGetConverters("ISO8859-1",&xkb->latin1cvt);
+ }
+
if (extra_rtrn)
*extra_rtrn= 0;
- if (_XkbUnavailable(dpy))
- return _XTranslateKeySym(dpy, *sym_rtrn, mods, buffer, nbytes);
- _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
-
- xkb= dpy->xkb_info;
if ((buffer==NULL)||(nbytes==0)) {
buffer= tmp;
nbytes= 4;
}
/* see if symbol rebound, if so, return that string. */
- for (p = dpy->key_bindings; p; p = p->next) {
- if (((mods & AllMods) == p->state) && (*sym_rtrn == p->key)) {
- int tmp = p->len;
- if (tmp > nbytes) {
- if (extra_rtrn)
- *extra_rtrn= tmp-nbytes;
- tmp = nbytes;
- }
- memcpy (buffer, p->string, tmp);
- return tmp;
- }
- }
+ n = XkbLookupKeyBinding(dpy,*sym_rtrn,mods,buffer,nbytes,extra_rtrn);
+ if (n)
+ return n;
if ( nbytes>0 )
buffer[0]= '\0';
@@ -717,35 +622,23 @@ XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn)
if ((!xkb->cvt.KSToUpper)&&( mods&LockMask )) {
register int i;
-
- if (!xkb->cvt.KSToUpper) {
- int change;
- char ch;
- for (i=change=0;i<n;i++) {
- ch= toupper(buffer[i]);
- change= (change||(buffer[i]!=ch));
- buffer[i] = ch;
- }
- if (change) {
- if (n==1)
- *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv,
- buffer,n,0);
- else *sym_rtrn= NoSymbol;
- }
+ int change;
+ char ch;
+ for (i=change=0;i<n;i++) {
+ ch= toupper(buffer[i]);
+ change= (change||(buffer[i]!=ch));
+ buffer[i] = ch;
+ }
+ if (change) {
+ if (n==1)
+ *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv,buffer,n,0);
+ else *sym_rtrn= NoSymbol;
}
}
if ( mods&ControlMask ) {
if ( n==1 ) {
- register char c = buffer[0];
-
- 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;
+ buffer[0]= XkbToControl(buffer[0]);
if ( nbytes>1 )
buffer[1]= '\0';
return 1;
@@ -758,38 +651,54 @@ XkbTranslateKeySym(dpy, sym_rtrn, mods, buffer, nbytes, extra_rtrn)
}
int
-#if NeedFunctionPrototypes
XLookupString ( register XKeyEvent * event,
char * buffer,
int nbytes,
KeySym * keysym,
XComposeStatus * status)
-#else
-XLookupString (event, buffer, nbytes, keysym, status)
- register XKeyEvent *event;
- char *buffer; /* buffer */
- int nbytes; /* space in buffer for characters */
- KeySym *keysym;
- XComposeStatus *status;
-#endif
{
KeySym dummy;
int rtrnLen;
unsigned int new_mods;
Display *dpy = event->display;
- XkbDescPtr xkb;
-
- if (_XkbUnavailable(dpy))
- return _XLookupString(event, buffer, nbytes, keysym, status);
- _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
if (keysym==NULL)
keysym= &dummy;
- xkb= dpy->xkb_info->desc;
- if (!XkbTranslateKeyCode(xkb,event->keycode,event->state, &new_mods,keysym))
+ if (!XkbLookupKeySym(dpy,event->keycode,event->state, &new_mods,keysym))
return 0;
new_mods= (event->state&(~new_mods));
+ /* find the group where a symbol can be converted to control one */
+ if (new_mods&ControlMask && *keysym > 0x7F &&
+ (dpy->xkb_info->xlib_ctrls & XkbLC_ControlFallback)) {
+ XKeyEvent tmp_ev = *event;
+ KeySym tmp_keysym;
+ unsigned int tmp_new_mods;
+ if (_XkbUnavailable(dpy)) {
+ tmp_ev.state= event->state ^ dpy->mode_switch;
+ if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state,
+ &tmp_new_mods, &tmp_keysym) &&
+ tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) {
+ *keysym = tmp_keysym;
+ }
+ } else {
+ int n = XkbKeyNumGroups(dpy->xkb_info->desc, tmp_ev.keycode);
+ int i;
+ for (i = 0; i < n; i++) {
+ if (XkbGroupForCoreState(event->state) == i)
+ continue;
+ tmp_ev.state= XkbBuildCoreState(tmp_ev.state, i);
+ if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state,
+ &tmp_new_mods, &tmp_keysym) &&
+ tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) {
+ *keysym = tmp_keysym;
+ new_mods= (event->state&(~tmp_new_mods));
+ break;
+ }
+ }
+ }
+ }
+
#ifdef USE_OWN_COMPOSE
if ( status ) {
static int been_here= 0;
@@ -887,44 +796,25 @@ XLookupString (event, buffer, nbytes, keysym, status)
/* We *should* use the new_mods (which does not contain any modifiers */
/* that were used to compute the symbol here, but pre-XKB XLookupString */
/* did not and we have to remain compatible. Sigh. */
- if ((dpy->xkb_info->flags&XkbLC_ConsumeLookupMods)==0)
+ if (_XkbUnavailable(dpy) ||
+ (dpy->xkb_info->xlib_ctrls&XkbLC_ConsumeLookupMods)==0)
new_mods= event->state;
rtrnLen= XkbLookupKeyBinding(dpy,*keysym,new_mods,buffer,nbytes,NULL);
if (rtrnLen>0)
return rtrnLen;
- rtrnLen = XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL);
- if ((event->state&ControlMask)&&(nbytes>0)&&
- ((rtrnLen==0)||((rtrnLen==1)&&(buffer[0]>=' ')))&&
- (XkbGroupForCoreState(event->state)!=XkbGroup1Index)&&
- (dpy->xkb_info->xlib_ctrls&XkbLC_ControlFallback)) {
- XKeyEvent tmp_ev;
- tmp_ev= *event;
- tmp_ev.state= XkbBuildCoreState(event->state,XkbGroup1Index);
- return XLookupString (&tmp_ev, buffer, nbytes, keysym, status);
- }
- return rtrnLen;
+ return XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL);
}
int
-#if NeedFunctionPrototypes
XkbLookupKeyBinding( Display * dpy,
register KeySym sym,
unsigned int mods,
char * buffer,
int nbytes,
int * extra_rtrn)
-#else
-XkbLookupKeyBinding(dpy, sym, mods, buffer, nbytes, extra_rtrn)
- Display *dpy;
- register KeySym sym;
- unsigned int mods;
- char *buffer;
- int nbytes;
- int * extra_rtrn;
-#endif
{
register struct _XKeytrans *p;
@@ -947,13 +837,10 @@ XkbLookupKeyBinding(dpy, sym, mods, buffer, nbytes, extra_rtrn)
}
char
-#if NeedFunctionPrototypes
-XkbToControl( char c )
-#else
-XkbToControl( c )
- char c;
-#endif
+XkbToControl( char ch )
{
+ register char c = ch;
+
if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
else if (c == '2') c = '\000';
else if (c >= '3' && c <= '7') c -= ('3' - '\033');