<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title></title>
</head>
<body>
<b>Modifyied files</b>: keyboard.c window.c desktop.c<br>
<b>CVS Version</b>: 20021225<br>
<br>
<b>Change Log:<br>
&nbsp;&nbsp;&nbsp; </b>Add dead key support using XmbLookupString on ToUnicode function,
if <b>xkb</b> is available otherwise It falls back<br>
to the old code.<br>
&nbsp;&nbsp;&nbsp; The first Window will be used to define the XIC used by the functions.<br>
<b><br>
<br>
Author</b>: Mauro Carvalho Chehab <a class="moz-txt-link-rfc2396E" href="mailto:mchehab@brturbo.com">&lt;mchehab@brturbo.com&gt;</a> <br>
______________________________________________________________________________________________<br>
<br>
<br>
--- keyboard.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 11:24:51 -0000&nbsp;&nbsp;&nbsp; 1.1<br>
+++ keyboard.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 14:30:53 -0000<br>
@@ -1389,6 +1389,44 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp; wine_tsx11_unlock();<br>
&nbsp;}<br>
&nbsp;<br>
+#ifdef HAVE_XKB<br>
+static XIM xim = (XIM) NULL;<br>
+static XIC xic = (XIC) NULL;<br>
+#endif<br>
+/*******************************************************************<br>
+ *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KeyboardWindow (X11DRV.@)<br>
+ * Called from desktop.c and window.c after Window creating<br>
+ * This routine allows usage of XmbLookupString by ToUnicode.<br>
+ * Only the first opened window will be used. It means that<br>
+ * all windows will share the same locale.<br>
+ *<br>
+ */<br>
+void X11DRV_KeyboardWindow (Display *display, Window w)<br>
+{<br>
+#ifdef HAVE_XKB<br>
+&nbsp;&nbsp;&nbsp; char *p;<br>
+<br>
+&nbsp;&nbsp;&nbsp; if (xic) return;&nbsp;&nbsp; /* Only the first window will be used */<br>
+<br>
+&nbsp;&nbsp;&nbsp; if ((p = XSetLocaleModifiers("")) != NULL &amp;&amp; *p)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xim = XOpenIM(display, NULL, NULL, NULL);<br>
+&nbsp;&nbsp;&nbsp; if (!xim &amp;&amp; (p = XSetLocaleModifiers("@im=none")) != NULL &amp;&amp;
*p)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xim = XOpenIM(display, NULL, NULL, NULL);<br>
+&nbsp;&nbsp;&nbsp; if (!xim) ERR_(key)( "Failed to open input method.\n");<br>
+&nbsp;&nbsp;&nbsp; else {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xic = XCreateIC(xim,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XNInputStyle, XIMPreeditNothing | XIMStatusNothing,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XNClientWindow, w,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XNFocusWindow, w,<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!xic) {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERR_(key)( "Failed to create input context.\n");<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XCloseIM(xim);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xim=NULL;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp; }<br>
+#endif<br>
+}<br>
<br>
&nbsp;/***********************************************************************<br>
&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X11DRV_MappingNotify<br>
@@ -1741,6 +1779,7 @@<br>
&nbsp; * FIXME : should do the above (return 2 for non matching deadchar+char
combinations)<br>
&nbsp; *<br>
&nbsp; */<br>
+<br>
&nbsp;INT X11DRV_ToUnicode(UINT virtKey, UINT scanCode, LPBYTE lpKeyState,<br>
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; LPWSTR bufW, int bufW_size, UINT flags)<br>
&nbsp;{<br>
@@ -1756,6 +1795,9 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE("Key UP, doing nothing\n" );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp; memset (&amp;e,0,sizeof(e));<br>
+<br>
+&nbsp;&nbsp;&nbsp; e.type = KeyPress;<br>
&nbsp;&nbsp;&nbsp;&nbsp; e.display = display;<br>
&nbsp;&nbsp;&nbsp;&nbsp; e.keycode = 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp; e.state = 0;<br>
@@ -1814,7 +1856,15 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp; else TRACE("Found keycode %d (0x%2X)\n",e.keycode,e.keycode);<br>
&nbsp;<br>
-&nbsp;&nbsp;&nbsp; ret = XLookupString(&amp;e, (LPVOID)lpChar, 2, &amp;keysym, NULL);<br>
+#ifdef HAVE_XKB<br>
+&nbsp;&nbsp;&nbsp; if (xic) {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = XmbLookupString(xic,&amp;e, (LPVOID)lpChar, sizeof(lpChar),
&amp;keysym, NULL);<br>
+&nbsp;&nbsp;&nbsp; } else {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = XLookupString(&amp;e, (LPVOID)lpChar, sizeof(lpChar), &amp;keysym,
NULL);<br>
+&nbsp;&nbsp;&nbsp; }<br>
+#else<br>
+&nbsp;&nbsp;&nbsp; ret = XLookupString(&amp;e, (LPVOID)lpChar, sizeof(lpChar), &amp;keysym,
NULL);<br>
+#endif<br>
&nbsp;&nbsp;&nbsp;&nbsp; wine_tsx11_unlock();<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (ret == 0)<br>
--- window.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 11:24:51 -0000&nbsp;&nbsp;&nbsp; 1.1<br>
+++ window.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 14:30:53 -0000<br>
@@ -43,6 +43,7 @@<br>
&nbsp;WINE_DEFAULT_DEBUG_CHANNEL(x11drv);<br>
&nbsp;<br>
&nbsp;extern Pixmap X11DRV_BITMAP_Pixmap( HBITMAP );<br>
+extern X11DRV_KeyboardWindow (Display *display, Window w);<br>
<br>
&nbsp;#define HAS_DLGFRAME(style,exStyle) \<br>
&nbsp;&nbsp;&nbsp;&nbsp; (((exStyle) &amp; WS_EX_DLGMODALFRAME) || \<br>
@@ -199,6 +200,7 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWEventMask | CWBitGravity | CWBackingStore
| CWColormap, &amp;attr );<br>
&nbsp;&nbsp;&nbsp;&nbsp; XSaveContext( display, data-&gt;icon_window, winContext, (char *)win-&gt;hwndSelf
);<br>
&nbsp;&nbsp;&nbsp;&nbsp; wine_tsx11_unlock();<br>
+&nbsp;&nbsp;&nbsp; if (data-&gt;client_window) X11DRV_KeyboardWindow (display, data-&gt;whole_window);<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; TRACE( "created %lx\n", data-&gt;icon_window );<br>
&nbsp;&nbsp;&nbsp;&nbsp; SetPropA( win-&gt;hwndSelf, icon_window_atom, (HANDLE)data-&gt;icon_window
);<br>
@@ -686,6 +688,7 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wine_tsx11_unlock();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>
&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp; X11DRV_KeyboardWindow (display, data-&gt;whole_window);<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; /* non-maximized child must be at bottom of Z order */<br>
&nbsp;&nbsp;&nbsp;&nbsp; if ((win-&gt;dwStyle &amp; (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)<br>
@@ -732,6 +735,7 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWEventMask | CWBitGravity | CWBackingStore,
&amp;attr );<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (data-&gt;client_window &amp;&amp; is_client_window_mapped( win ))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMapWindow( display, data-&gt;client_window );<br>
+&nbsp;&nbsp;&nbsp; if (data-&gt;client_window) X11DRV_KeyboardWindow (display, data-&gt;whole_window);<br>
&nbsp;&nbsp;&nbsp;&nbsp; wine_tsx11_unlock();<br>
&nbsp;&nbsp;&nbsp;&nbsp; return data-&gt;client_window;<br>
&nbsp;}<br>
--- desktop.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 11:24:51 -0000&nbsp;&nbsp;&nbsp; 1.1<br>
+++ desktop.c&nbsp;&nbsp;&nbsp; 8 Jan 2003 14:30:53 -0000<br>
@@ -30,6 +30,7 @@<br>
&nbsp;<br>
&nbsp;WINE_DEFAULT_DEBUG_CHANNEL(x11drv);<br>
&nbsp;<br>
+extern X11DRV_KeyboardWindow (Display *display, Window w);<br>
&nbsp;<br>
&nbsp;/* desktop window procedure */<br>
&nbsp;static LRESULT WINAPI desktop_winproc( HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam )<br>
@@ -141,6 +142,8 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp; win = XCreateWindow( display, DefaultRootWindow(display),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x, y, width, height, 0, screen_depth, InputOutput,
visual,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWBackPixel | CWEventMask | CWCursor | CWColormap,
&amp;win_attr );<br>
+<br>
+&nbsp;&nbsp;&nbsp; if (win) X11DRV_KeyboardWindow (display, win);<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp; /* Set window manager properties */<br>
&nbsp;&nbsp;&nbsp;&nbsp; size_hints&nbsp; = XAllocSizeHints();<br>
<br>
</body>
</html>