src/windows/native/sun/windows/awt_Window.cpp

Print this page




 119 // struct for _SetOpacity() method
 120 struct OpacityStruct {
 121     jobject window;
 122     jint iOpacity;
 123 };
 124 // struct for _SetOpaque() method
 125 struct OpaqueStruct {
 126     jobject window;
 127     jboolean isOpaque;
 128 };
 129 // struct for _UpdateWindow() method
 130 struct UpdateWindowStruct {
 131     jobject window;
 132     jintArray data;
 133     HBITMAP hBitmap;
 134     jint width, height;
 135 };
 136 // Struct for _RequestWindowFocus() method
 137 struct RequestWindowFocusStruct {
 138     jobject component;
 139     jboolean isMouseEventCause;
 140 };
 141 // struct for _RepositionSecurityWarning() method
 142 struct RepositionSecurityWarningStruct {
 143     jobject window;
 144 };
 145 
 146 struct SetFullScreenExclusiveModeStateStruct {
 147     jobject window;
 148     jboolean isFSEMState;
 149 };
 150 
 151 
 152 /************************************************************************
 153  * AwtWindow fields
 154  */
 155 
 156 jfieldID AwtWindow::warningStringID;
 157 jfieldID AwtWindow::locationByPlatformID;
 158 jfieldID AwtWindow::autoRequestFocusID;
 159 jfieldID AwtWindow::securityWarningWidthID;


1540     }
1541     env->DeleteLocalRef(target); target = NULL;
1542 
1543     if (id == java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS ||
1544         id == java_awt_event_WindowEvent_WINDOW_LOST_FOCUS)
1545     {
1546         jobject sequencedEvent = env->NewObject(sequencedEventCls,
1547                                                 sequencedEventConst,
1548                                                 event);
1549         DASSERT(!safe_ExceptionOccurred(env));
1550         DASSERT(sequencedEvent != NULL);
1551         env->DeleteLocalRef(event);
1552         event = sequencedEvent;
1553     }
1554 
1555     SendEvent(event);
1556 
1557     env->DeleteLocalRef(event);
1558 }
1559 
1560 BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest)
1561 {
1562     // Fix for 6458497.
1563     // Retreat if current foreground window is out of both our and embedder process.
1564     // The exception is when activation is requested due to a mouse event.
1565     if (!isMouseEventCause) {
1566         HWND fgWindow = ::GetForegroundWindow();
1567         if (NULL != fgWindow) {
1568             DWORD fgProcessID;
1569             ::GetWindowThreadProcessId(fgWindow, &fgProcessID);
1570             if (fgProcessID != ::GetCurrentProcessId()
1571                 && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID))
1572             {
1573                 return FALSE;
1574             }
1575         }
1576     }
1577 
1578     HWND proxyContainerHWnd = GetProxyToplevelContainer();
1579     HWND proxyHWnd = GetProxyFocusOwner();
1580 
1581     if (proxyContainerHWnd == NULL || proxyHWnd == NULL) {
1582         return FALSE;
1583     }
1584 
1585     // Activate the proxy toplevel container
1586     if (::GetActiveWindow() != proxyContainerHWnd) {
1587         sm_suppressFocusAndActivation = TRUE;
1588         ::BringWindowToTop(proxyContainerHWnd);
1589         ::SetForegroundWindow(proxyContainerHWnd);
1590         sm_suppressFocusAndActivation = FALSE;
1591 
1592         if (::GetActiveWindow() != proxyContainerHWnd) {
1593             return FALSE; // activation has been rejected
1594         }
1595     }
1596 
1597     // Focus the proxy itself


2096     return ret;
2097 }
2098 
2099 void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) {
2100     FLASHWINFO fi;
2101     fi.cbSize = sizeof(fi);
2102     fi.hwnd = hWnd;
2103     fi.dwFlags = flags;
2104     fi.uCount = count;
2105     fi.dwTimeout = timeout;
2106     ::FlashWindowEx(&fi);
2107 }
2108 
2109 jboolean
2110 AwtWindow::_RequestWindowFocus(void *param)
2111 {
2112     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
2113 
2114     RequestWindowFocusStruct *rfs = (RequestWindowFocusStruct *)param;
2115     jobject self = rfs->component;
2116     jboolean isMouseEventCause = rfs->isMouseEventCause;
2117 
2118     jboolean result = JNI_FALSE;
2119     AwtWindow *window = NULL;
2120 
2121     PDATA pData;
2122     JNI_CHECK_NULL_GOTO(self, "peer", ret);
2123     pData = JNI_GET_PDATA(self);
2124     if (pData == NULL) {
2125         // do nothing just return false
2126         goto ret;
2127     }
2128 
2129     window = (AwtWindow *)pData;
2130     if (::IsWindow(window->GetHWnd())) {
2131         result = (jboolean)window->SendMessage(WM_AWT_WINDOW_SETACTIVE, (WPARAM)isMouseEventCause, 0);
2132     }
2133 ret:
2134     env->DeleteGlobalRef(self);
2135 
2136     delete rfs;
2137 
2138     return result;
2139 }
2140 
2141 void AwtWindow::_ToFront(void *param)
2142 {
2143     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
2144 
2145     jobject self = (jobject)param;
2146 
2147     AwtWindow *w = NULL;
2148 
2149     PDATA pData;
2150     JNI_CHECK_PEER_GOTO(self, ret);
2151     w = (AwtWindow *)pData;


3608 
3609     UpdateWindowStruct *uws = new UpdateWindowStruct;
3610     uws->window = env->NewGlobalRef(peer);
3611     uws->data = NULL;
3612     uws->hBitmap = hBitmap;
3613     uws->width = width;
3614     uws->height = height;
3615 
3616     AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws);
3617     // global refs and mds are deleted in _UpdateWindow
3618 
3619     CATCH_BAD_ALLOC;
3620 }
3621 
3622 /*
3623  * Class:     sun_awt_windows_WComponentPeer
3624  * Method:    requestFocus
3625  * Signature: (Z)Z
3626  */
3627 JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WWindowPeer_requestWindowFocus
3628     (JNIEnv *env, jobject self, jboolean isMouseEventCause)
3629 {
3630     TRY;
3631 
3632     jobject selfGlobalRef = env->NewGlobalRef(self);
3633 
3634     RequestWindowFocusStruct *rfs = new RequestWindowFocusStruct;
3635     rfs->component = selfGlobalRef;
3636     rfs->isMouseEventCause = isMouseEventCause;
3637 
3638     return (jboolean)AwtToolkit::GetInstance().SyncCall(
3639         (void*(*)(void*))AwtWindow::_RequestWindowFocus, rfs);
3640     // global refs and rfs are deleted in _RequestWindowFocus
3641 
3642     CATCH_BAD_ALLOC_RET(JNI_FALSE);
3643 }
3644 
3645 /*
3646  * Class:     sun_awt_windows_WWindowPeer
3647  * Method:    repositionSecurityWarning
3648  * Signature: ()V
3649  */
3650 JNIEXPORT void JNICALL
3651 Java_sun_awt_windows_WWindowPeer_repositionSecurityWarning(JNIEnv *env,
3652         jobject self)
3653 {
3654     TRY;
3655 
3656     RepositionSecurityWarningStruct *rsws =


 119 // struct for _SetOpacity() method
 120 struct OpacityStruct {
 121     jobject window;
 122     jint iOpacity;
 123 };
 124 // struct for _SetOpaque() method
 125 struct OpaqueStruct {
 126     jobject window;
 127     jboolean isOpaque;
 128 };
 129 // struct for _UpdateWindow() method
 130 struct UpdateWindowStruct {
 131     jobject window;
 132     jintArray data;
 133     HBITMAP hBitmap;
 134     jint width, height;
 135 };
 136 // Struct for _RequestWindowFocus() method
 137 struct RequestWindowFocusStruct {
 138     jobject component;

 139 };
 140 // struct for _RepositionSecurityWarning() method
 141 struct RepositionSecurityWarningStruct {
 142     jobject window;
 143 };
 144 
 145 struct SetFullScreenExclusiveModeStateStruct {
 146     jobject window;
 147     jboolean isFSEMState;
 148 };
 149 
 150 
 151 /************************************************************************
 152  * AwtWindow fields
 153  */
 154 
 155 jfieldID AwtWindow::warningStringID;
 156 jfieldID AwtWindow::locationByPlatformID;
 157 jfieldID AwtWindow::autoRequestFocusID;
 158 jfieldID AwtWindow::securityWarningWidthID;


1539     }
1540     env->DeleteLocalRef(target); target = NULL;
1541 
1542     if (id == java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS ||
1543         id == java_awt_event_WindowEvent_WINDOW_LOST_FOCUS)
1544     {
1545         jobject sequencedEvent = env->NewObject(sequencedEventCls,
1546                                                 sequencedEventConst,
1547                                                 event);
1548         DASSERT(!safe_ExceptionOccurred(env));
1549         DASSERT(sequencedEvent != NULL);
1550         env->DeleteLocalRef(event);
1551         event = sequencedEvent;
1552     }
1553 
1554     SendEvent(event);
1555 
1556     env->DeleteLocalRef(event);
1557 }
1558 
1559 BOOL AwtWindow::AwtSetActiveWindow(UINT hittest)
1560 {
















1561     HWND proxyContainerHWnd = GetProxyToplevelContainer();
1562     HWND proxyHWnd = GetProxyFocusOwner();
1563 
1564     if (proxyContainerHWnd == NULL || proxyHWnd == NULL) {
1565         return FALSE;
1566     }
1567 
1568     // Activate the proxy toplevel container
1569     if (::GetActiveWindow() != proxyContainerHWnd) {
1570         sm_suppressFocusAndActivation = TRUE;
1571         ::BringWindowToTop(proxyContainerHWnd);
1572         ::SetForegroundWindow(proxyContainerHWnd);
1573         sm_suppressFocusAndActivation = FALSE;
1574 
1575         if (::GetActiveWindow() != proxyContainerHWnd) {
1576             return FALSE; // activation has been rejected
1577         }
1578     }
1579 
1580     // Focus the proxy itself


2079     return ret;
2080 }
2081 
2082 void AwtWindow::FlashWindowEx(HWND hWnd, UINT count, DWORD timeout, DWORD flags) {
2083     FLASHWINFO fi;
2084     fi.cbSize = sizeof(fi);
2085     fi.hwnd = hWnd;
2086     fi.dwFlags = flags;
2087     fi.uCount = count;
2088     fi.dwTimeout = timeout;
2089     ::FlashWindowEx(&fi);
2090 }
2091 
2092 jboolean
2093 AwtWindow::_RequestWindowFocus(void *param)
2094 {
2095     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
2096 
2097     RequestWindowFocusStruct *rfs = (RequestWindowFocusStruct *)param;
2098     jobject self = rfs->component;

2099 
2100     jboolean result = JNI_FALSE;
2101     AwtWindow *window = NULL;
2102 
2103     PDATA pData;
2104     JNI_CHECK_NULL_GOTO(self, "peer", ret);
2105     pData = JNI_GET_PDATA(self);
2106     if (pData == NULL) {
2107         // do nothing just return false
2108         goto ret;
2109     }
2110 
2111     window = (AwtWindow *)pData;
2112     if (::IsWindow(window->GetHWnd())) {
2113         result = (jboolean)window->SendMessage(WM_AWT_WINDOW_SETACTIVE, 0);
2114     }
2115 ret:
2116     env->DeleteGlobalRef(self);
2117 
2118     delete rfs;
2119 
2120     return result;
2121 }
2122 
2123 void AwtWindow::_ToFront(void *param)
2124 {
2125     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
2126 
2127     jobject self = (jobject)param;
2128 
2129     AwtWindow *w = NULL;
2130 
2131     PDATA pData;
2132     JNI_CHECK_PEER_GOTO(self, ret);
2133     w = (AwtWindow *)pData;


3590 
3591     UpdateWindowStruct *uws = new UpdateWindowStruct;
3592     uws->window = env->NewGlobalRef(peer);
3593     uws->data = NULL;
3594     uws->hBitmap = hBitmap;
3595     uws->width = width;
3596     uws->height = height;
3597 
3598     AwtToolkit::GetInstance().InvokeFunction(AwtWindow::_UpdateWindow, uws);
3599     // global refs and mds are deleted in _UpdateWindow
3600 
3601     CATCH_BAD_ALLOC;
3602 }
3603 
3604 /*
3605  * Class:     sun_awt_windows_WComponentPeer
3606  * Method:    requestFocus
3607  * Signature: (Z)Z
3608  */
3609 JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WWindowPeer_requestWindowFocus
3610     (JNIEnv *env, jobject self)
3611 {
3612     TRY;
3613 
3614     jobject selfGlobalRef = env->NewGlobalRef(self);
3615 
3616     RequestWindowFocusStruct *rfs = new RequestWindowFocusStruct;
3617     rfs->component = selfGlobalRef;

3618 
3619     return (jboolean)AwtToolkit::GetInstance().SyncCall(
3620         (void*(*)(void*))AwtWindow::_RequestWindowFocus, rfs);
3621     // global refs and rfs are deleted in _RequestWindowFocus
3622 
3623     CATCH_BAD_ALLOC_RET(JNI_FALSE);
3624 }
3625 
3626 /*
3627  * Class:     sun_awt_windows_WWindowPeer
3628  * Method:    repositionSecurityWarning
3629  * Signature: ()V
3630  */
3631 JNIEXPORT void JNICALL
3632 Java_sun_awt_windows_WWindowPeer_repositionSecurityWarning(JNIEnv *env,
3633         jobject self)
3634 {
3635     TRY;
3636 
3637     RepositionSecurityWarningStruct *rsws =