< prev index next >
src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp
Print this page
@@ -60,10 +60,11 @@
#include <awt_DnDDT.h>
#include <awt_DnDDS.h>
#include <java_awt_Toolkit.h>
#include <java_awt_event_InputMethodEvent.h>
+#include <java_awt_AppEvent_UserSessionEvent.h>
extern void initScreens(JNIEnv *env);
extern "C" void awt_dnd_initialize();
extern "C" void awt_dnd_uninitialize();
extern "C" void awt_clipboard_uninitialize(JNIEnv *env);
@@ -78,10 +79,12 @@
extern jclass jawtComponentClass;
extern jfieldID jawtPDataID;
extern jfieldID jawtSDataID;
extern jfieldID jawtSMgrID;
+extern BOOL isSuddenTerminationEnabled;
+
extern void DWMResetCompositionEnabled();
/************************************************************************
* Utilities
*/
@@ -267,10 +270,13 @@
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,10 +1050,13 @@
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,10 +1082,72 @@
// 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) {
+
+ BOOL activate = wParam == WTS_CONSOLE_CONNECT
+ || wParam == WTS_REMOTE_CONNECT
+ || wParam == WTS_SESSION_UNLOCK;
+ int reason = java_awt_AppEvent_UserSessionEvent_REASON_UNSPECIFIED;
+ switch (wParam) {
+ case WTS_CONSOLE_CONNECT:
+ case WTS_CONSOLE_DISCONNECT:
+ reason = java_awt_AppEvent_UserSessionEvent_REASON_CONSOLE;
+ break;
+ case WTS_REMOTE_CONNECT:
+ case WTS_REMOTE_DISCONNECT:
+ reason = java_awt_AppEvent_UserSessionEvent_REASON_REMOTE;
+ break;
+ case WTS_SESSION_UNLOCK:
+ case WTS_SESSION_LOCK:
+ reason = java_awt_AppEvent_UserSessionEvent_REASON_LOCK;
+ }
+
+ env->CallStaticVoidMethod(clzz, AwtToolkit::userSessionMID,
+ activate
+ ? JNI_TRUE
+ : JNI_FALSE, reason);
+ }
+ 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,10 +2202,24 @@
// 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", "(ZI)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 >