--- old/src/windows/native/sun/windows/awt_Frame.cpp 2013-09-04 12:42:36.199983000 +0400 +++ new/src/windows/native/sun/windows/awt_Frame.cpp 2013-09-04 12:42:36.043982700 +0400 @@ -82,6 +82,10 @@ HHOOK mouseHook; HHOOK modalHook; }; +// Struct for _SetLwFrameUnderMouse method +struct SetLwFrameUnderMouseStruct { + jobject frame; +}; /************************************************************************ * AwtFrame fields */ @@ -96,6 +100,8 @@ Hashtable AwtFrame::sm_BlockedThreads("AWTBlockedThreads"); +AwtFrame* AwtFrame::sm_lwFrameUnderMouse = NULL; + /************************************************************************ * AwtFrame methods */ @@ -1576,6 +1582,32 @@ delete nmbs; } +void AwtFrame::_SetLwFrameUnderMouse(void *param) +{ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + SetLwFrameUnderMouseStruct *sfums = (SetLwFrameUnderMouseStruct *)param; + jobject self = sfums->frame; + + if (self == NULL) { + AwtFrame::sm_lwFrameUnderMouse = NULL; + } else { + AwtFrame *frame = NULL; + + PDATA pData; + JNI_CHECK_PEER_GOTO(self, ret); + frame = (AwtFrame *)pData; + if (::IsWindow(frame->GetHWnd())) + { + AwtFrame::sm_lwFrameUnderMouse = frame; + } + } +ret: + env->DeleteGlobalRef(self); + + delete sfums; +} + /************************************************************************ * WFramePeer native methods */ @@ -1926,5 +1958,19 @@ CATCH_BAD_ALLOC; } + +JNIEXPORT void JNICALL +Java_sun_awt_windows_WLightweightFramePeer_setLWFrameUnderMouse(JNIEnv *env, jclass selfClass, jobject peer) +{ + TRY; + + SetLwFrameUnderMouseStruct *sfums = new SetLwFrameUnderMouseStruct; + sfums->frame = env->NewGlobalRef(peer); + + AwtToolkit::GetInstance().InvokeFunction(AwtFrame::_SetLwFrameUnderMouse, sfums); + // global ref and sfums are deleted in _SetLwFrameUnderMouse() + + CATCH_BAD_ALLOC; +} } /* extern "C" */