Hi!

Please review the fix for this CR:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7024749

Webrev:
http://cr.openjdk.java.net/~bagiras/8/7024749.1

The idea of this fix based on IMM interaction theory (from MSDN) and actual implementation in AWT.

AWT creates its own IME context. It is shared between all AWT windows.
This context is associated with window each time it receives WM_ACTIVATE message (which surplus but not critical). WM_IME_SETCONTEXT and WM_IME_NOTIFY (with INM_OPENSTATUSWINDOW) messages apply to all AWT windows and usually are sent to the top-level window.
So there is no need to send them to the focus proxy.
That's why I removed CallProxyDefWindowProc() from their handlers in AwtComponent::WindowProc(). I also removed switch cases for those messages from AwtFrame::ProxyWindowProc() because they didn't make any sense there. Thus, only IME messages between WM_IME_STARTCOMPOSITION and WM_IME_ENDCOMPOSITION are sent to the proxy focus owner - that's a typing period.

I changed all places where IME context was used according to MSDN notes:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318639(v=vs.85).aspx
"The application retrieves the handle by using the ImmGetContext function. It can use the retrieved handle in subsequent calls to the IMM functions to retrieve and set IME values, such as the composition window style, the composition style, and the status window position. Once the application has finished using the context, it must release the context using the ImmReleaseContext function."

All changes were tested by the regression tests in 'test/java/awt/Focus' and all JCK tests. I also tested them on hierarchy of owned windows with different enabled/disabled states.
No bad influence was found. From that point of view it is safe.

Thanks,
Oleg

Reply via email to