#define NEED_EVENTS
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
#include <X11/keysym.h>
#include "Xlcint.h"
#include "Ximint.h"
Bool
_XimLocalFilter(Display *d, Window w, XEvent *ev, XPointer client_data)
{
Xic ic = (Xic)client_data;
KeySym keysym;
static char buf[256];
DefTree *b = ic->private.local.base.tree;
DTIndex t;
if(ev->xkey.keycode == 0)
return (False);
XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &keysym, NULL);
if(IsModifierKey(keysym))
return (False);
if(keysym >= XK_braille_dot_1 && keysym <= XK_braille_dot_8) {
if(ev->type == KeyPress) {
ic->private.local.brl_pressed |=
1<<(keysym-XK_braille_dot_1);
} else {
if(!ic->private.local.brl_committing
|| ev->xkey.time - ic->private.local.brl_release_start > 300) {
ic->private.local.brl_committing = ic->private.local.brl_pressed;
ic->private.local.brl_release_start = ev->xkey.time;
}
ic->private.local.brl_pressed &= ~(1<<(keysym-XK_braille_dot_1));
if(!ic->private.local.brl_pressed) {
if(ic->private.local.brl_committing) {
ic->private.local.brl_committed =
ic->private.local.brl_committing;
ic->private.local.composed = 0;
ev->type = KeyPress;
ev->xkey.keycode = 0;
_XPutBackEvent(d, ev);
}
}
}
return(True);
}
if( (ev->type != KeyPress)
|| (((Xim)ic->core.im)->private.local.top == 0 ) )
return(False);
for(t = ic->private.local.context; t; t = b[t].next) {
if(((ev->xkey.state & b[t].modifier_mask) == b[t].modifier) &&
(keysym == b[t].keysym))
break;
}
if(t) {
if(b[t].succession) {
ic->private.local.context = b[t].succession;
return(True);
} else {
ic->private.local.composed = t;
ic->private.local.brl_committed = 0;
ev->xkey.keycode = 0;
XPutBackEvent(d, ev);
ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
return(True);
}
} else {
if(ic->private.local.context == ((Xim)ic->core.im)->private.local.top) {
return(False);
}
ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
return(True);
}
}