From edd24b613ff8605cd5b0c7baae04434a28c29068 Mon Sep 17 00:00:00 2001 From: Muneyuki Noguchi Date: Sat, 18 Oct 2008 23:03:48 +0900 Subject: [PATCH] winex11: Prevent XCreateIC from returning NULL when input style isn't "root". --- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 1 + dlls/winex11.drv/xim.c | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index e5a40aafbf5..90ec95ad3bb 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -515,6 +515,7 @@ struct x11drv_thread_data Window grab_window; /* window that currently grabs the mouse */ HWND last_focus; /* last window that had focus */ XIM xim; /* input method */ + XFontSet font_set; /* international text drawing font set */ Window selection_wnd; /* window used for selection interactions */ }; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index fc9996af5c7..15694816876 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -562,6 +562,7 @@ static void thread_detach(void) X11DRV_ResetSelectionOwner(); wine_tsx11_lock(); if (data->xim) XCloseIM( data->xim ); + if (data->font_set) XFreeFontSet( data->display, data->font_set ); XCloseDisplay( data->display ); wine_tsx11_unlock(); HeapFree( GetProcessHeap(), 0, data ); diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c index 5e413f0c2d0..7c3c9d17a7c 100644 --- a/dlls/winex11.drv/xim.c +++ b/dlls/winex11.drv/xim.c @@ -477,6 +477,26 @@ static BOOL open_xim( Display *display ) thread_data->xim = xim; + if ((ximStyle & (XIMPreeditNothing | XIMPreeditNone)) == 0 || + (ximStyle & (XIMStatusNothing | XIMStatusNone)) == 0) + { + char **list; + int count; + thread_data->font_set = XCreateFontSet(display, "fixed", + &list, &count, NULL); + TRACE("ximFontSet = %p\n", thread_data->font_set); + TRACE("list = %p, count = %d\n", list, count); + if (list != NULL) + { + int i; + for (i = 0; i < count; ++i) + TRACE("list[%d] = %s\n", i, list[i]); + XFreeStringList(list); + } + } + else + thread_data->font_set = NULL; + wine_tsx11_unlock(); IME_UpdateAssociation(NULL); wine_tsx11_lock(); @@ -518,6 +538,7 @@ XIC X11DRV_CreateIC(XIM xim, struct x11drv_win_data *data) XICCallback P_StartCB, P_DoneCB, P_DrawCB, P_CaretCB; LANGID langid = PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())); Window win = data->whole_window; + XFontSet fontSet = x11drv_thread_data()->font_set; TRACE("xim = %p\n", xim); @@ -552,6 +573,7 @@ XIC X11DRV_CreateIC(XIM xim, struct x11drv_win_data *data) if ((ximStyle & (XIMPreeditNothing | XIMPreeditNone)) == 0) { preedit = XVaCreateNestedList(0, + XNFontSet, fontSet, XNSpotLocation, &spot, XNPreeditStartCallback, &P_StartCB, XNPreeditDoneCallback, &P_DoneCB, @@ -575,6 +597,7 @@ XIC X11DRV_CreateIC(XIM xim, struct x11drv_win_data *data) if ((ximStyle & (XIMStatusNothing | XIMStatusNone)) == 0) { status = XVaCreateNestedList(0, + XNFontSet, fontSet, NULL); TRACE("status = %p\n", status); }