src/windows/native/sun/windows/awt_Frame.cpp

Print this page

        

@@ -80,10 +80,14 @@
 struct BlockedThreadStruct {
     int framesCount;
     HHOOK mouseHook;
     HHOOK modalHook;
 };
+// Struct for _SetLwFrameUnderMouse method
+struct SetLwFrameUnderMouseStruct {
+    jobject frame;
+};
 /************************************************************************
  * AwtFrame fields
  */
 
 jfieldID AwtFrame::handleID;

@@ -94,10 +98,12 @@
 
 jmethodID AwtFrame::activateEmbeddingTopLevelMID;
 
 Hashtable AwtFrame::sm_BlockedThreads("AWTBlockedThreads");
 
+AwtFrame* AwtFrame::sm_lwFrameUnderMouse = NULL;
+
 /************************************************************************
  * AwtFrame methods
  */
 
 AwtFrame::AwtFrame() {

@@ -1574,10 +1580,36 @@
     env->DeleteGlobalRef(blockerPeer);
 
     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
  */
 
 extern "C" {

@@ -1925,6 +1957,20 @@
     // global ref and sas are deleted in _SynthesizeWmActivate()
 
     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" */