[prev in list] [next in list] [prev in thread] [next in thread]
List: wine-devel
Subject: Re: (resend) imm32: there is only 1 default Hwnd per thread
From: Aric Stewart <aric () codeweavers ! com>
Date: 2012-09-26 13:03:43
Message-ID: 5062FD2F.2000206 () codeweavers ! com
[Download RAW message or body]
On 9/26/12 7:27 AM, Alexandre Julliard wrote:
> Aric Stewart <aric@codeweavers.com> writes:
>
> > This corrects issues with applications that create and manage multiple IMCs
> > try 2:
> > avoid premature destruction of the window
> > ---
> > dlls/imm32/imm.c | 22 ++++++++++++----------
> > dlls/imm32/tests/imm32.c | 28 ++++++++++++++++++++++++++++
> > 2 files changed, 40 insertions(+), 10 deletions(-)
> >
> >
> >
> > diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
> > index 7394101..a18aa26 100644
> > --- a/dlls/imm32/imm.c
> > +++ b/dlls/imm32/imm.c
> > @@ -678,10 +678,6 @@ static BOOL IMM_DestroyContext(HIMC hIMC)
> > data->immKbd->pImeSelect(hIMC, FALSE);
> > SendMessageW(data->IMC.hWnd, WM_IME_SELECT, FALSE, (LPARAM)GetKeyboardLayout(0));
> >
> > - if (IMM_GetThreadData()->hwndDefault == data->imeWnd)
> > - IMM_GetThreadData()->hwndDefault = NULL;
> > - DestroyWindow(data->imeWnd);
> > -
> > ImmDestroyIMCC(data->IMC.hCompStr);
> > ImmDestroyIMCC(data->IMC.hCandInfo);
> > ImmDestroyIMCC(data->IMC.hGuideLine);
> > @@ -2323,12 +2319,18 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
> >
> > if (data->imeWnd == NULL)
> > {
> > - /* create the ime window */
> > - data->imeWnd = CreateWindowExW( WS_EX_TOOLWINDOW,
> > - data->immKbd->imeClassName, NULL, WS_POPUP, 0, 0, 1, 1, 0,
> > - 0, data->immKbd->hIME, 0);
> > - SetWindowLongPtrW(data->imeWnd, IMMGWL_IMC, (LONG_PTR)data);
> > - IMM_GetThreadData()->hwndDefault = data->imeWnd;
> > + HWND def = IMM_GetThreadData()->hwndDefault;
> > + if (def == NULL)
> > + {
> > + /* create the ime window */
> > + data->imeWnd = CreateWindowExW( WS_EX_TOOLWINDOW,
> > + data->immKbd->imeClassName, NULL, WS_POPUP, 0, 0, 1, 1, \
> > 0, + 0, data->immKbd->hIME, 0);
> > + SetWindowLongPtrW(data->imeWnd, IMMGWL_IMC, (LONG_PTR)data);
> > + IMM_GetThreadData()->hwndDefault = data->imeWnd;
> > + }
> > + else
> > + data->imeWnd = def;
>
> So why is there a window in the IMC at all, if it's not used for
> anything?
>
So looking and reading my documentation I can see i had a bit of a miss-understanding \
about the default IME window all the way back to when i initial did the code for \
loading IME as separate dlls. This is a leftover from that.
There should not be a window in the IMC. I will remove that.
-aric
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic