--- old/src/windows/native/sun/windows/awt_Window.cpp 2013-02-08 15:22:05.415749800 +0400 +++ new/src/windows/native/sun/windows/awt_Window.cpp 2013-02-08 15:22:04.686708100 +0400 @@ -148,6 +148,11 @@ jboolean isFSEMState; }; +// struct for _Ungrab() method +struct UngrabStruct { + jobject window; + jboolean doPost; +}; /************************************************************************ * AwtWindow fields @@ -320,11 +325,14 @@ void AwtWindow::_Ungrab(void * param) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject self = (jobject)param; + UngrabStruct* us = (UngrabStruct*)param; + jobject self = us->window; + jboolean doPost = us->doPost; if (env->EnsureLocalCapacity(1) < 0) { env->DeleteGlobalRef(self); + delete us; return; } @@ -333,10 +341,11 @@ PDATA pData; JNI_CHECK_PEER_GOTO(self, ret); p = (AwtWindow *)pData; - p->Ungrab(FALSE); + p->Ungrab(doPost); ret: env->DeleteGlobalRef(self); + delete us; } MsgRouting AwtWindow::WmNcMouseDown(WPARAM hitTest, int x, int y, int button) { @@ -3507,12 +3516,16 @@ } JNIEXPORT void JNICALL -Java_sun_awt_windows_WWindowPeer_nativeUngrab(JNIEnv *env, jobject self) +Java_sun_awt_windows_WWindowPeer_nativeUngrab(JNIEnv *env, jobject self, jboolean doPost) { TRY; - AwtToolkit::GetInstance().SyncCall(AwtWindow::_Ungrab, env->NewGlobalRef(self)); - // global ref is deleted in _Ungrab() + UngrabStruct *us = new UngrabStruct; + us->window = env->NewGlobalRef(self); + us->doPost = doPost; + + AwtToolkit::GetInstance().SyncCall(AwtWindow::_Ungrab, us); + // global ref and us are deleted in _Ungrab() CATCH_BAD_ALLOC; }