winex11: Separate the XIM process-wide setup from the IME creation.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 10 Apr 2008 10:29:01 +0000 (12:29 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 10 Apr 2008 10:29:01 +0000 (12:29 +0200)
dlls/winex11.drv/x11drv.h
dlls/winex11.drv/x11drv_main.c
dlls/winex11.drv/xim.c

index 20dd91c375a2979069c46f725e8b7386c77bbc10..d6b2b204c3ab285e3a0cefb496658d85c567fb17 100644 (file)
@@ -274,8 +274,9 @@ extern Drawable get_glxdrawable(X11DRV_PDEVICE *physDev);
 extern BOOL destroy_glxpixmap(Display *display, XID glxpixmap);
 
 /* XIM support */
+extern BOOL X11DRV_InitXIM( const char *input_style );
 extern XIC X11DRV_CreateIC(XIM xim, Display *display, Window win);
-extern XIM X11DRV_SetupXIM(Display *display, const char *input_style);
+extern XIM X11DRV_SetupXIM(Display *display);
 extern void X11DRV_XIMLookupChars( const char *str, DWORD count );
 extern void X11DRV_ForceXIMReset(HWND hwnd);
 
index b8f0b458baee0c2109c39bc0ecbcff8c81758630..1c221bc90c6e7da0cd3b1f4fba5bea8dbf0ae3f5 100644 (file)
@@ -538,6 +538,7 @@ static BOOL process_attach(void)
 
     X11DRV_InitKeyboard( gdi_display );
     X11DRV_InitClipboard();
+    if (use_xim) use_xim = X11DRV_InitXIM( input_style );
 
     return TRUE;
 }
@@ -649,12 +650,12 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
     if (TRACE_ON(synchronous)) XSynchronize( data->display, True );
     wine_tsx11_unlock();
 
-    if (use_xim && !(data->xim = X11DRV_SetupXIM( data->display, input_style )))
-        WARN("Input Method is not available\n");
-
     set_queue_display_fd( data->display );
     TlsSetValue( thread_data_tls_index, data );
+
+    if (use_xim) data->xim = X11DRV_SetupXIM( data->display );
     X11DRV_SetCursor( NULL );
+
     return data;
 }
 
index 4505ecd4825cc5e0c5214b5f98feb042466eb8c1..f389db718e6f30b2abaa3c60b4e3bcfd3362ee1d 100644 (file)
@@ -37,9 +37,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
 
 BOOL ximInComposeMode=FALSE;
 
-static XIMStyle ximStyle = 0;
-static XIMStyle ximStyleRoot = 0;
-
 /* moved here from imm32 for dll separation */
 static DWORD dwCompStringLength = 0;
 static LPBYTE CompositionString = NULL;
@@ -56,6 +53,10 @@ static DWORD dwPreeditPos = 0;
 /* inorder to enable deadkey support */
 #define STYLE_NONE (XIMPreeditNothing | XIMStatusNothing)
 
+static XIMStyle ximStyle = 0;
+static XIMStyle ximStyleRoot = 0;
+static XIMStyle ximStyleRequest = STYLE_CALLBACK;
+
 static BOOL X11DRV_ImmSetInternalString(DWORD dwIndex, DWORD dwOffset,
                                         DWORD selLength, LPWSTR lpComp, DWORD dwCompLen)
 {
@@ -327,16 +328,13 @@ void X11DRV_ForceXIMReset(HWND hwnd)
 }
 
 /***********************************************************************
-*           X11DRV Ime creation
-*/
-XIM X11DRV_SetupXIM(Display *display, const char *input_style)
+ *           X11DRV_InitXIM
+ *
+ * Process-wide XIM initialization.
+ */
+BOOL X11DRV_InitXIM( const char *input_style )
 {
-    XIMStyle ximStyleRequest, ximStyleCallback, ximStyleNone;
-    XIMStyles *ximStyles = NULL;
-    INT i;
-    XIM xim;
-
-    ximStyleRequest = STYLE_CALLBACK;
+    BOOL ret;
 
     if (!strcasecmp(input_style, "offthespot"))
         ximStyleRequest = STYLE_OFFTHESPOT;
@@ -346,17 +344,31 @@ XIM X11DRV_SetupXIM(Display *display, const char *input_style)
         ximStyleRequest = STYLE_ROOT;
 
     wine_tsx11_lock();
-
-    if(!XSupportsLocale())
+    if (!(ret = XSupportsLocale()))
     {
         WARN("X does not support locale.\n");
-        goto err;
     }
-    if(XSetLocaleModifiers("") == NULL)
+    else if (XSetLocaleModifiers("") == NULL)
     {
         WARN("Could not set locale modifiers.\n");
-        goto err;
+        ret = FALSE;
     }
+    wine_tsx11_unlock();
+    return ret;
+}
+
+
+/***********************************************************************
+*           X11DRV Ime creation
+*/
+XIM X11DRV_SetupXIM( Display *display )
+{
+    XIMStyle ximStyleCallback, ximStyleNone;
+    XIMStyles *ximStyles = NULL;
+    INT i;
+    XIM xim;
+
+    wine_tsx11_lock();
 
     xim = XOpenIM(display, NULL, NULL, NULL);
     if (xim == NULL)