< 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 >