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

Print this page




1460     jobject target = GetTarget(env);
1461     jobject event = env->NewObject(classEvent, eventInitMID,
1462                                    target, eventId);
1463     DASSERT(!safe_ExceptionOccurred(env));
1464     DASSERT(event != NULL);
1465     SendEvent(event);
1466 
1467     env->DeleteLocalRef(target);
1468     env->DeleteLocalRef(event);
1469 }
1470 
1471 void AwtWindow::SendWindowEvent(jint id, HWND opposite,
1472                                 jint oldState, jint newState)
1473 {
1474     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
1475 
1476     static jclass wClassEvent;
1477     if (wClassEvent == NULL) {
1478         if (env->PushLocalFrame(1) < 0)
1479             return;
1480         wClassEvent = env->FindClass("java/awt/event/WindowEvent");
1481         if (wClassEvent != NULL) {
1482             wClassEvent = (jclass)env->NewGlobalRef(wClassEvent);
1483         }
1484         env->PopLocalFrame(0);
1485         if (wClassEvent == NULL) {
1486             return;
1487         }
1488     }
1489 
1490     static jmethodID wEventInitMID;
1491     if (wEventInitMID == NULL) {
1492         wEventInitMID =
1493             env->GetMethodID(wClassEvent, "<init>",
1494                              "(Ljava/awt/Window;ILjava/awt/Window;II)V");
1495         DASSERT(wEventInitMID);
1496         if (wEventInitMID == NULL) {
1497             return;
1498         }
1499     }
1500 
1501     static jclass sequencedEventCls;
1502     if (sequencedEventCls == NULL) {
1503         jclass sequencedEventClsLocal
1504             = env->FindClass("java/awt/SequencedEvent");
1505         DASSERT(sequencedEventClsLocal);
1506         if (sequencedEventClsLocal == NULL) {
1507             /* exception already thrown */
1508             return;
1509         }
1510         sequencedEventCls =
1511             (jclass)env->NewGlobalRef(sequencedEventClsLocal);
1512         env->DeleteLocalRef(sequencedEventClsLocal);
1513     }
1514 
1515     static jmethodID sequencedEventConst;
1516     if (sequencedEventConst == NULL) {
1517         sequencedEventConst =
1518             env->GetMethodID(sequencedEventCls, "<init>",
1519                              "(Ljava/awt/AWTEvent;)V");
1520     }
1521 
1522     if (env->EnsureLocalCapacity(3) < 0) {
1523         return;
1524     }
1525 
1526     jobject target = GetTarget(env);
1527     jobject jOpposite = NULL;
1528     if (opposite != NULL) {
1529         AwtComponent *awtOpposite = AwtComponent::GetComponent(opposite);
1530         if (awtOpposite != NULL) {
1531             jOpposite = awtOpposite->GetTarget(env);
1532         }
1533     }
1534     jobject event = env->NewObject(wClassEvent, wEventInitMID, target, id,
1535                                    jOpposite, oldState, newState);
1536     DASSERT(!safe_ExceptionOccurred(env));
1537     DASSERT(event != NULL);
1538     if (jOpposite != NULL) {
1539         env->DeleteLocalRef(jOpposite); jOpposite = NULL;
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 




1460     jobject target = GetTarget(env);
1461     jobject event = env->NewObject(classEvent, eventInitMID,
1462                                    target, eventId);
1463     DASSERT(!safe_ExceptionOccurred(env));
1464     DASSERT(event != NULL);
1465     SendEvent(event);
1466 
1467     env->DeleteLocalRef(target);
1468     env->DeleteLocalRef(event);
1469 }
1470 
1471 void AwtWindow::SendWindowEvent(jint id, HWND opposite,
1472                                 jint oldState, jint newState)
1473 {
1474     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
1475 
1476     static jclass wClassEvent;
1477     if (wClassEvent == NULL) {
1478         if (env->PushLocalFrame(1) < 0)
1479             return;
1480         wClassEvent = env->FindClass("sun/awt/TimedWindowEvent");
1481         if (wClassEvent != NULL) {
1482             wClassEvent = (jclass)env->NewGlobalRef(wClassEvent);
1483         }
1484         env->PopLocalFrame(0);
1485         if (wClassEvent == NULL) {
1486             return;
1487         }
1488     }
1489 
1490     static jmethodID wEventInitMID;
1491     if (wEventInitMID == NULL) {
1492         wEventInitMID =
1493             env->GetMethodID(wClassEvent, "<init>",
1494                              "(Ljava/awt/Window;ILjava/awt/Window;IIJ)V");
1495         DASSERT(wEventInitMID);
1496         if (wEventInitMID == NULL) {
1497             return;
1498         }
1499     }
1500 
1501     static jclass sequencedEventCls;
1502     if (sequencedEventCls == NULL) {
1503         jclass sequencedEventClsLocal
1504             = env->FindClass("java/awt/SequencedEvent");
1505         DASSERT(sequencedEventClsLocal);
1506         if (sequencedEventClsLocal == NULL) {
1507             /* exception already thrown */
1508             return;
1509         }
1510         sequencedEventCls =
1511             (jclass)env->NewGlobalRef(sequencedEventClsLocal);
1512         env->DeleteLocalRef(sequencedEventClsLocal);
1513     }
1514 
1515     static jmethodID sequencedEventConst;
1516     if (sequencedEventConst == NULL) {
1517         sequencedEventConst =
1518             env->GetMethodID(sequencedEventCls, "<init>",
1519                              "(Ljava/awt/AWTEvent;)V");
1520     }
1521 
1522     if (env->EnsureLocalCapacity(3) < 0) {
1523         return;
1524     }
1525 
1526     jobject target = GetTarget(env);
1527     jobject jOpposite = NULL;
1528     if (opposite != NULL) {
1529         AwtComponent *awtOpposite = AwtComponent::GetComponent(opposite);
1530         if (awtOpposite != NULL) {
1531             jOpposite = awtOpposite->GetTarget(env);
1532         }
1533     }
1534     jobject event = env->NewObject(wClassEvent, wEventInitMID, target, id,
1535                                    jOpposite, oldState, newState, TimeHelper::getMessageTimeUTC());
1536     DASSERT(!safe_ExceptionOccurred(env));
1537     DASSERT(event != NULL);
1538     if (jOpposite != NULL) {
1539         env->DeleteLocalRef(jOpposite); jOpposite = NULL;
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     // We used to reject non mouse window activation if our app wasn't active. 
1563     // This code since has been removed as the fix for 7185280 













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