From 1baa27d098d5282cb942455f3f4a642ed21924d6 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 27 Aug 2016 02:13:27 +0200 Subject: update files from modules dir of libX11 1.3.4 --- nx-X11/lib/X11/imLcFlt.c | 66 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 21 deletions(-) (limited to 'nx-X11/lib/X11/imLcFlt.c') diff --git a/nx-X11/lib/X11/imLcFlt.c b/nx-X11/lib/X11/imLcFlt.c index 6e054e34b..e812fdd0d 100644 --- a/nx-X11/lib/X11/imLcFlt.c +++ b/nx-X11/lib/X11/imLcFlt.c @@ -7,7 +7,7 @@ Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear -in supporting documentation, and that the name of Fuji Xerox, +in supporting documentation, and that the name of Fuji Xerox, FUJITSU LIMITED not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Fuji Xerox, FUJITSU LIMITED make no representations @@ -24,7 +24,7 @@ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author : Kazunori Nishihara Fuji Xerox - Modifier : Takashi Fujiwara FUJITSU LIMITED + Modifier : Takashi Fujiwara FUJITSU LIMITED fujiwara@a80.tech.yk.fujitsu.co.jp ******************************************************************/ @@ -38,43 +38,67 @@ PERFORMANCE OF THIS SOFTWARE. #include "Ximint.h" Bool -_XimLocalFilter(d, w, ev, client_data) - Display *d; - Window w; - XEvent *ev; - XPointer client_data; +_XimLocalFilter(Display *d, Window w, XEvent *ev, XPointer client_data) { Xic ic = (Xic)client_data; KeySym keysym; static char buf[256]; - DefTree *p; + DefTree *b = ic->private.local.base.tree; + DTIndex t; - if( (ev->type != KeyPress) - || (ev->xkey.keycode == 0) - || (((Xim)ic->core.im)->private.local.top == (DefTree *)NULL) ) - return(False); + if(ev->xkey.keycode == 0) + return (False); XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &keysym, NULL); if(IsModifierKey(keysym)) return (False); - for(p = ic->private.local.context; p; p = p->next) { - if(((ev->xkey.state & p->modifier_mask) == p->modifier) && - (keysym == p->keysym)) { - break; + 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(p) { /* Matched */ - if(p->succession) { /* Intermediate */ - ic->private.local.context = p->succession; + if(t) { /* Matched */ + if(b[t].succession) { /* Intermediate */ + ic->private.local.context = b[t].succession; return(True); } else { /* Terminate (reached to leaf) */ - ic->private.local.composed = p; + ic->private.local.composed = t; + ic->private.local.brl_committed = 0; /* return back to client KeyPressEvent keycode == 0 */ ev->xkey.keycode = 0; - _XPutBackEvent(d, ev); + XPutBackEvent(d, ev); /* initialize internal state for next key sequence */ ic->private.local.context = ((Xim)ic->core.im)->private.local.top; return(True); -- cgit v1.2.3