--- old/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2016-01-17 23:43:12.942955300 +0300 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2016-01-17 23:43:12.870899700 +0300 @@ -80,6 +80,8 @@ extern jfieldID jawtSDataID; extern jfieldID jawtSMgrID; +extern BOOL isSuddenTerminationEnabled; + extern void DWMResetCompositionEnabled(); /************************************************************************ @@ -269,6 +271,9 @@ /* ids for WToolkit fields accessed from native code */ jmethodID AwtToolkit::windowsSettingChangeMID; jmethodID AwtToolkit::displayChangeMID; + +jmethodID AwtToolkit::userSessionMID; +jmethodID AwtToolkit::systemSleepMID; /* ids for Toolkit methods */ jmethodID AwtToolkit::getDefaultToolkitMID; jmethodID AwtToolkit::getFontMetricsMID; @@ -1046,6 +1051,9 @@ /* Session management */ case WM_QUERYENDSESSION: { /* Shut down cleanly */ + if (!isSuddenTerminationEnabled) { + return FALSE; + } if (JVM_RaiseSignal(SIGTERM)) { AwtToolkit::GetInstance().m_vmSignalled = TRUE; } @@ -1075,6 +1083,62 @@ DASSERT(FALSE); break; } +#ifndef WM_WTSSESSION_CHANGE +#define WM_WTSSESSION_CHANGE 0x02B1 +#define WTS_CONSOLE_CONNECT 0x1 +#define WTS_CONSOLE_DISCONNECT 0x2 +#define WTS_REMOTE_CONNECT 0x3 +#define WTS_REMOTE_DISCONNECT 0x4 +#define WTS_SESSION_LOGON 0x5 +#define WTS_SESSION_LOGOFF 0x6 +#define WTS_SESSION_LOCK 0x7 +#define WTS_SESSION_UNLOCK 0x8 +#define WTS_SESSION_REMOTE_CONTROL 0x9 +#endif // WM_WTSSESSION_CHANGE + case WM_WTSSESSION_CHANGE: { + jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer"); + DASSERT(clzz != NULL); + if (!clzz) throw std::bad_alloc(); + + if (wParam == WTS_CONSOLE_CONNECT + || wParam == WTS_CONSOLE_DISCONNECT + || wParam == WTS_REMOTE_CONNECT + || wParam == WTS_REMOTE_DISCONNECT + || wParam == WTS_SESSION_UNLOCK + || wParam == WTS_SESSION_LOCK) { + + static BOOL isActiveStateKnown = FALSE; + static BOOL isActive = FALSE; + + BOOL activate = wParam == WTS_CONSOLE_CONNECT + || wParam == WTS_REMOTE_CONNECT + || wParam == WTS_SESSION_UNLOCK; + + if (isActive != activate || !isActiveStateKnown) { + env->CallStaticVoidMethod(clzz, AwtToolkit::userSessionMID, + activate + ? JNI_TRUE + : JNI_FALSE); + } + + isActive = activate; + isActiveStateKnown = TRUE; + } + break; + } + case WM_POWERBROADCAST: { + jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer"); + DASSERT(clzz != NULL); + if (!clzz) throw std::bad_alloc(); + + if (wParam == PBT_APMSUSPEND || wParam == PBT_APMRESUMEAUTOMATIC) { + env->CallStaticVoidMethod(clzz, AwtToolkit::systemSleepMID, + wParam == PBT_APMRESUMEAUTOMATIC + ? JNI_TRUE + : JNI_FALSE); + } + break; + } case WM_SYNC_WAIT: SetEvent(AwtToolkit::GetInstance().m_waitEvent); break; @@ -2133,6 +2197,20 @@ CHECK_NULL(jawtVImgClass); jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal); + jclass dPeerClassLocal = env->FindClass("sun/awt/windows/WDesktopPeer"); + DASSERT(dPeerClassLocal != 0); + CHECK_NULL(dPeerClassLocal); + + AwtToolkit::userSessionMID = + env->GetStaticMethodID(dPeerClassLocal, "userSessionCallback", "(Z)V"); + DASSERT(AwtToolkit::userSessionMID != 0); + CHECK_NULL(AwtToolkit::userSessionMID); + + AwtToolkit::systemSleepMID = + env->GetStaticMethodID(dPeerClassLocal, "systemSleepCallback", "(Z)V"); + DASSERT(AwtToolkit::systemSleepMID != 0); + CHECK_NULL(AwtToolkit::systemSleepMID); + CATCH_BAD_ALLOC; }