< prev index next >
src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp
Print this page
*** 78,87 ****
--- 78,89 ----
extern jclass jawtComponentClass;
extern jfieldID jawtPDataID;
extern jfieldID jawtSDataID;
extern jfieldID jawtSMgrID;
+ extern BOOL isSuddenTerminationEnabled;
+
extern void DWMResetCompositionEnabled();
/************************************************************************
* Utilities
*/
*** 267,276 ****
--- 269,281 ----
AwtToolkit AwtToolkit::theInstance;
/* 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;
jmethodID AwtToolkit::insetsMID;
*** 1044,1053 ****
--- 1049,1061 ----
return TRUE;
}
/* Session management */
case WM_QUERYENDSESSION: {
/* Shut down cleanly */
+ if (!isSuddenTerminationEnabled) {
+ return FALSE;
+ }
if (JVM_RaiseSignal(SIGTERM)) {
AwtToolkit::GetInstance().m_vmSignalled = TRUE;
}
return TRUE;
}
*** 1073,1082 ****
--- 1081,1146 ----
// Should never get here.
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;
}
*** 2131,2140 ****
--- 2195,2218 ----
// Save these classes in global references for later use
jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal);
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;
}
/*
< prev index next >