Create an X input context for each top-level window.

diff --git a/dlls/x11drv/window.c b/dlls/x11drv/window.c
index 74cf323..78907ed 100644
--- a/dlls/x11drv/window.c
+++ b/dlls/x11drv/window.c
@@ -688,6 +688,15 @@
         return 0;
     }
 
+    if (is_top_level)
+    {
+        XIM xim = x11drv_thread_data()->xim;
+        if (xim) data->xic = XCreateIC( xim,
+                                        XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
+                                        XNClientWindow, data->whole_window,
+                                        0 );
+    }
+
     /* non-maximized child must be at bottom of Z order */
     if ((win->dwStyle & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD)
     {
@@ -829,6 +838,11 @@
         XDeleteContext( display, data->whole_window, winContext );
         XDeleteContext( display, data->client_window, winContext );
         XDestroyWindow( display, data->whole_window );  /* this destroys client too */
+        if (data->xic)
+        {
+            XUnsetICFocus( data->xic );
+            XDestroyIC( data->xic );
+        }
         destroy_icon_window( display, wndPtr );
         wine_tsx11_unlock();
     }
@@ -871,6 +885,7 @@
     data->whole_window  = 0;
     data->client_window = 0;
     data->icon_window   = 0;
+    data->xic           = 0;
     data->hWMIconBitmap = 0;
     data->hWMIconMask   = 0;
 
@@ -1080,6 +1095,26 @@
 }
 
 
+/***********************************************************************
+ *		X11DRV_get_ic
+ *
+ * Return the X input context associated with a window
+ */
+XIC X11DRV_get_ic( HWND hwnd )
+{
+    XIC ret = 0;
+    WND *win = WIN_GetPtr( hwnd );
+
+    if (win && win != WND_OTHER_PROCESS)
+    {
+        struct x11drv_win_data *data = win->pDriverData;
+        ret = data->xic;
+        WIN_ReleasePtr( win );
+    }
+    return ret;
+}
+
+
 /*****************************************************************
  *		SetParent   (X11DRV.@)
  */