aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/X11/imLcFlt.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/X11/imLcFlt.c')
-rw-r--r--nx-X11/lib/X11/imLcFlt.c66
1 files changed, 45 insertions, 21 deletions
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);