Module: wine Branch: master Commit: edd24b613ff8605cd5b0c7baae04434a28c29068 URL: http://source.winehq.org/git/wine.git/?a=commit;h=edd24b613ff8605cd5b0c7baae...
Author: Muneyuki Noguchi nogu.dev@gmail.com Date: Sat Oct 18 23:03:48 2008 +0900
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(+), 0 deletions(-)
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index e5a40aa..90ec95a 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 fc9996a..1569481 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 5e413f0..7c3c9d1 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); }