From 9273afeeb4499a0493f120b7525e17b6ae51113e Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Tue, 22 Feb 2011 13:55:31 +0000
Subject: xserver libX11 pixman mesa git update 22 Feb 2011

---
 libX11/modules/im/ximcp/imLcFlt.c  | 240 +++++++++++++++++++------------------
 libX11/modules/im/ximcp/imLcIc.c   |   2 +-
 libX11/modules/im/ximcp/imLcLkup.c |  30 +++--
 3 files changed, 146 insertions(+), 126 deletions(-)

(limited to 'libX11')

diff --git a/libX11/modules/im/ximcp/imLcFlt.c b/libX11/modules/im/ximcp/imLcFlt.c
index 014ad6add..06aa9980a 100644
--- a/libX11/modules/im/ximcp/imLcFlt.c
+++ b/libX11/modules/im/ximcp/imLcFlt.c
@@ -1,115 +1,125 @@
-/******************************************************************
-
-              Copyright 1992 by Fuji Xerox Co., Ltd.
-              Copyright 1992, 1994 by FUJITSU LIMITED
-
-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,
-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
-about the suitability of this software for any purpose.
-It is provided "as is" without express or implied warranty.
-
-FUJI XEROX, FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX,
-FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
-OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-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
-                                fujiwara@a80.tech.yk.fujitsu.co.jp
-
-******************************************************************/
-
-#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) { /* Matched */
-	if(b[t].succession) { /* Intermediate */
-	    ic->private.local.context = b[t].succession;
-	    return(True);
-	} else { /* Terminate (reached to leaf) */
-	    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);
-	    /* initialize internal state for next key sequence */
-	    ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
-	    return(True);
-	}
-    } else { /* Unmatched */
-	if(ic->private.local.context == ((Xim)ic->core.im)->private.local.top) {
-	    return(False);
-	}
-	/* Error (Sequence Unmatch occured) */
-	/* initialize internal state for next key sequence */
-	ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
-	return(True);
-    }
-}
+/******************************************************************
+
+              Copyright 1992 by Fuji Xerox Co., Ltd.
+              Copyright 1992, 1994 by FUJITSU LIMITED
+
+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,
+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
+about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJI XEROX, FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX,
+FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+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
+                                fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#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;
+    Bool	 braille = False;
+
+    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);
+	    return(True);
+	} 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 && ic->private.local.brl_committing) {
+		/* Commited a braille pattern, let it go through compose tree */
+		keysym = XK_braille_blank | ic->private.local.brl_committing;
+		ev->type = KeyPress;
+		braille = True;
+	    } else {
+	        return(True);
+	    }
+	}
+    }
+
+    if(   (ev->type != KeyPress)
+       || (((Xim)ic->core.im)->private.local.top == 0 ) )
+	goto emit_braille;
+
+    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) { /* Matched */
+	if(b[t].succession) { /* Intermediate */
+	    ic->private.local.context = b[t].succession;
+	    return(True);
+	} else { /* Terminate (reached to leaf) */
+	    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);
+	    /* initialize internal state for next key sequence */
+	    ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
+	    return(True);
+	}
+    } else { /* Unmatched */
+	if(ic->private.local.context == ((Xim)ic->core.im)->private.local.top) {
+	    goto emit_braille;
+	}
+	/* Error (Sequence Unmatch occured) */
+	/* initialize internal state for next key sequence */
+	ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
+	return(True);
+    }
+
+emit_braille:
+    if(braille) {
+	/* Braille pattern is not in compose tree, emit alone */
+	ic->private.local.brl_committed = ic->private.local.brl_committing;
+	ic->private.local.composed = 0;
+	ev->xkey.keycode = 0;
+	_XPutBackEvent(d, ev);
+	return(True);
+    }
+    return(False);
+}
diff --git a/libX11/modules/im/ximcp/imLcIc.c b/libX11/modules/im/ximcp/imLcIc.c
index 53d53efec..c0728084f 100644
--- a/libX11/modules/im/ximcp/imLcIc.c
+++ b/libX11/modules/im/ximcp/imLcIc.c
@@ -180,7 +180,7 @@ _XimLocalCreateIC(
 			values, XIM_CREATEIC, True)) {
 	goto Set_Error;
     }
-    ic_values.filter_events = KeyPressMask;
+    ic_values.filter_events = KeyPressMask | KeyReleaseMask;
     _XimSetCurrentICValues(ic, &ic_values);
     if(_XimSetICDefaults(ic, (XPointer)&ic_values,
 				XIM_SETICDEFAULTS, res, num) == False) {
diff --git a/libX11/modules/im/ximcp/imLcLkup.c b/libX11/modules/im/ximcp/imLcLkup.c
index 4891176cc..8e4111a6a 100644
--- a/libX11/modules/im/ximcp/imLcLkup.c
+++ b/libX11/modules/im/ximcp/imLcLkup.c
@@ -63,20 +63,25 @@ _XimLocalMbLookupString(XIC xic, XKeyEvent *ev, char *buffer, int bytes,
 	    unsigned char pattern = ic->private.local.brl_committed;
 	    char mb[XLC_PUBLIC(ic->core.im->core.lcd, mb_cur_max)];
 	    ret = _Xlcwctomb(ic->core.im->core.lcd, mb, BRL_UC_ROW | pattern);
-	    if(ret < 0) {
-		if(status) *status = XLookupNone;
-		return(0);
-	    }
 	    if(ret > bytes) {
 		if(status) *status = XBufferOverflow;
 		return(ret);
 	    }
-	    if(keysym) {
-		*keysym = XK_braille_blank | pattern;
-		if(status) *status = XLookupBoth;
-	    } else
-		if(status) *status = XLookupChars;
-	    memcpy(buffer, mb, ret);
+	    if(keysym) *keysym = XK_braille_blank | pattern;
+	    if(ret > 0) {
+		if (keysym) {
+		    if(status) *status = XLookupBoth;
+		} else {
+		    if(status) *status = XLookupChars;
+		}
+		memcpy(buffer, mb, ret);
+	    } else {
+		if(keysym) {
+		    if(status) *status = XLookupKeySym;
+		} else {
+		    if(status) *status = XLookupNone;
+		}
+	    }
 	} else { /* Composed Event */
 	    ret = strlen(&mb[b[ic->private.local.composed].mb]);
 	    if(ret > bytes) {
@@ -217,6 +222,11 @@ _XimLocalUtf8LookupString(XIC xic, XKeyEvent *ev, char *buffer, int bytes,
 	    buffer[0] = 0xe0 | ((BRL_UC_ROW >> 12) & 0x0f);
 	    buffer[1] = 0x80 | ((BRL_UC_ROW >> 8) & 0x30) | (pattern >> 6);
 	    buffer[2] = 0x80 | (pattern & 0x3f);
+	    if(keysym) {
+		*keysym = XK_braille_blank | pattern;
+		if(status) *status = XLookupBoth;
+	    } else
+		if(status) *status = XLookupChars;
 	} else { /* Composed Event */
 	    ret = strlen(&utf8[b[ic->private.local.composed].utf8]);
 	    if(ret > bytes) {
-- 
cgit v1.2.3