< prev index next >
src/java.desktop/windows/native/libawt/windows/awt_Window.cpp
Print this page
@@ -1569,20 +1569,51 @@
env->GetMethodID(sequencedEventCls, "<init>",
"(Ljava/awt/AWTEvent;)V");
CHECK_NULL(sequencedEventConst);
}
+ static jclass windowCls = NULL;
+ if (windowCls == NULL) {
+ jclass windowClsLocal = env->FindClass("java/awt/Window");
+ CHECK_NULL(windowClsLocal);
+ windowCls = (jclass)env->NewGlobalRef(windowClsLocal);
+ env->DeleteLocalRef(windowClsLocal);
+ CHECK_NULL(windowCls);
+ }
+
if (env->EnsureLocalCapacity(3) < 0) {
return;
}
jobject target = GetTarget(env);
jobject jOpposite = NULL;
if (opposite != NULL) {
AwtComponent *awtOpposite = AwtComponent::GetComponent(opposite);
if (awtOpposite != NULL) {
jOpposite = awtOpposite->GetTarget(env);
+ if ((jOpposite != NULL) &&
+ !env->IsInstanceOf(jOpposite, windowCls)) {
+ env->DeleteLocalRef(jOpposite);
+ jOpposite = NULL;
+
+ HWND parent = AwtComponent::GetTopLevelParentForWindow(opposite);
+ if ((parent != NULL) && (parent != opposite)) {
+ if (parent == GetHWnd()) {
+ jOpposite = env->NewLocalRef(target);
+ } else {
+ AwtComponent* awtParent = AwtComponent::GetComponent(parent);
+ if (awtParent != NULL) {
+ jOpposite = awtParent->GetTarget(env);
+ if ((jOpposite != NULL) &&
+ !env->IsInstanceOf(jOpposite, windowCls)) {
+ env->DeleteLocalRef(jOpposite);
+ jOpposite = NULL;
+ }
+ }
+ }
+ }
+ }
}
}
jobject event = env->NewObject(wClassEvent, wEventInitMID, target, id,
jOpposite, oldState, newState, ::JVM_CurrentTimeMillis(NULL, 0));
DASSERT(!safe_ExceptionOccurred(env));
< prev index next >