< prev index next >

src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp

Print this page




  45 #include "awt_Palette.h"
  46 #include "awt_PopupMenu.h"
  47 #include "awt_Toolkit.h"
  48 #include "awt_DesktopProperties.h"
  49 #include "awt_FileDialog.h"
  50 #include "CmdIDList.h"
  51 #include "awt_new.h"
  52 #include "debug_trace.h"
  53 #include "debug_mem.h"
  54 
  55 #include "ComCtl32Util.h"
  56 #include "DllUtil.h"
  57 
  58 #include "D3DPipelineManager.h"
  59 
  60 #include <awt_DnDDT.h>
  61 #include <awt_DnDDS.h>
  62 
  63 #include <java_awt_Toolkit.h>
  64 #include <java_awt_event_InputMethodEvent.h>

  65 
  66 extern void initScreens(JNIEnv *env);
  67 extern "C" void awt_dnd_initialize();
  68 extern "C" void awt_dnd_uninitialize();
  69 extern "C" void awt_clipboard_uninitialize(JNIEnv *env);
  70 extern "C" BOOL g_bUserHasChangedInputLang;
  71 
  72 extern CriticalSection windowMoveLock;
  73 extern BOOL windowMoveLockHeld;
  74 
  75 // Needed by JAWT: see awt_DrawingSurface.cpp.
  76 extern jclass jawtVImgClass;
  77 extern jclass jawtVSMgrClass;
  78 extern jclass jawtComponentClass;
  79 extern jfieldID jawtPDataID;
  80 extern jfieldID jawtSDataID;
  81 extern jfieldID jawtSMgrID;
  82 


  83 extern void DWMResetCompositionEnabled();
  84 
  85 /************************************************************************
  86  * Utilities
  87  */
  88 
  89 /* Initialize the Java VM instance variable when the library is
  90    first loaded */
  91 JavaVM *jvm = NULL;
  92 
  93 JNIEXPORT jint JNICALL
  94 JNI_OnLoad(JavaVM *vm, void *reserved)
  95 {
  96     TRY;
  97 
  98     jvm = vm;
  99     return JNI_VERSION_1_2;
 100 
 101     CATCH_BAD_ALLOC_RET(0);
 102 }


 252         break;
 253     case DLL_PROCESS_DETACH:
 254 #ifdef DEBUG
 255         DTrace_DisableMutex();
 256         DMem_DisableMutex();
 257 #endif DEBUG
 258         break;
 259     }
 260     return TRUE;
 261 }
 262 
 263 /************************************************************************
 264  * AwtToolkit fields
 265  */
 266 
 267 AwtToolkit AwtToolkit::theInstance;
 268 
 269 /* ids for WToolkit fields accessed from native code */
 270 jmethodID AwtToolkit::windowsSettingChangeMID;
 271 jmethodID AwtToolkit::displayChangeMID;



 272 /* ids for Toolkit methods */
 273 jmethodID AwtToolkit::getDefaultToolkitMID;
 274 jmethodID AwtToolkit::getFontMetricsMID;
 275 jmethodID AwtToolkit::insetsMID;
 276 
 277 /************************************************************************
 278  * AwtToolkit methods
 279  */
 280 
 281 AwtToolkit::AwtToolkit() {
 282     m_localPump = FALSE;
 283     m_mainThreadId = 0;
 284     m_toolkitHWnd = NULL;
 285     m_inputMethodHWnd = NULL;
 286     m_verbose = FALSE;
 287     m_isActive = TRUE;
 288     m_isDisposed = FALSE;
 289 
 290     m_vmSignalled = FALSE;
 291 


1029           initScreens(env);
1030 
1031           // Notify Java side - call WToolkit.displayChanged()
1032           jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
1033           DASSERT(clazz != NULL);
1034           if (!clazz) throw std::bad_alloc();
1035           env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
1036 
1037           GetInstance().m_displayChanged = TRUE;
1038 
1039           ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL);
1040           break;
1041       }
1042       case WM_AWT_SETCURSOR: {
1043           ::SetCursor((HCURSOR)wParam);
1044           return TRUE;
1045       }
1046       /* Session management */
1047       case WM_QUERYENDSESSION: {
1048           /* Shut down cleanly */



1049           if (JVM_RaiseSignal(SIGTERM)) {
1050               AwtToolkit::GetInstance().m_vmSignalled = TRUE;
1051           }
1052           return TRUE;
1053       }
1054       case WM_ENDSESSION: {
1055           // Keep pumping messages until the shutdown sequence halts the VM,
1056           // or we exit the MessageLoop because of a WM_QUIT message
1057           AwtToolkit& tk = AwtToolkit::GetInstance();
1058 
1059           // if WM_QUERYENDSESSION hasn't successfully raised SIGTERM
1060           // we ignore the ENDSESSION message
1061           if (!tk.m_vmSignalled) {
1062               return 0;
1063           }
1064           tk.MessageLoop(AwtToolkit::PrimaryIdleFunc,
1065                          AwtToolkit::CommonPeekMessageFunc);
1066 
1067           // Dispose here instead of in eventLoop so that we don't have
1068           // to return from the WM_ENDSESSION handler.
1069           tk.Dispose();
1070 
1071           // Never return. The VM will halt the process.
1072           hang_if_shutdown();
1073 
1074           // Should never get here.
1075           DASSERT(FALSE);
1076           break;
1077       }






























































1078       case WM_SYNC_WAIT:
1079           SetEvent(AwtToolkit::GetInstance().m_waitEvent);
1080           break;
1081     }
1082 
1083     return DefWindowProc(hWnd, message, wParam, lParam);
1084 
1085     CATCH_BAD_ALLOC_RET(0);
1086 }
1087 
1088 LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code,
1089                                               WPARAM wParam, LPARAM lParam)
1090 {
1091     TRY;
1092 
1093     if (code >= 0 && wParam == PM_REMOVE && lParam != 0) {
1094        if (AwtToolkit::GetInstance().PreProcessMsg(*(MSG*)lParam) !=
1095                mrPassAlong) {
1096            /* PreProcessMsg() wants us to eat it */
1097            ((MSG*)lParam)->message = WM_NULL;


2115     DASSERT(componentClassLocal != 0);
2116     CHECK_NULL(componentClassLocal);
2117 
2118     jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager",
2119                                  "Lsun/awt/image/VolatileSurfaceManager;");
2120     DASSERT(jawtSMgrID != 0);
2121     CHECK_NULL(jawtSMgrID);
2122 
2123     jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent",
2124                                   "Lsun/java2d/SurfaceData;");
2125     DASSERT(jawtSDataID != 0);
2126     CHECK_NULL(jawtSDataID);
2127 
2128     jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J");
2129     DASSERT(jawtPDataID != 0);
2130     CHECK_NULL(jawtPDataID);
2131     // Save these classes in global references for later use
2132     jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal);
2133     CHECK_NULL(jawtVImgClass);
2134     jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal);














2135 
2136     CATCH_BAD_ALLOC;
2137 }
2138 
2139 
2140 /*
2141  * Class:     sun_awt_windows_Toolkit
2142  * Method:    disableCustomPalette
2143  * Signature: ()V
2144  */
2145 JNIEXPORT void JNICALL
2146 Java_sun_awt_windows_WToolkit_disableCustomPalette(JNIEnv *env, jclass cls) {
2147     AwtPalette::DisableCustomPalette();
2148 }
2149 
2150 /*
2151  * Class:     sun_awt_windows_WToolkit
2152  * Method:    embeddedInit
2153  * Signature: ()Z
2154  */




  45 #include "awt_Palette.h"
  46 #include "awt_PopupMenu.h"
  47 #include "awt_Toolkit.h"
  48 #include "awt_DesktopProperties.h"
  49 #include "awt_FileDialog.h"
  50 #include "CmdIDList.h"
  51 #include "awt_new.h"
  52 #include "debug_trace.h"
  53 #include "debug_mem.h"
  54 
  55 #include "ComCtl32Util.h"
  56 #include "DllUtil.h"
  57 
  58 #include "D3DPipelineManager.h"
  59 
  60 #include <awt_DnDDT.h>
  61 #include <awt_DnDDS.h>
  62 
  63 #include <java_awt_Toolkit.h>
  64 #include <java_awt_event_InputMethodEvent.h>
  65 #include <java_awt_AppEvent_UserSessionEvent.h>
  66 
  67 extern void initScreens(JNIEnv *env);
  68 extern "C" void awt_dnd_initialize();
  69 extern "C" void awt_dnd_uninitialize();
  70 extern "C" void awt_clipboard_uninitialize(JNIEnv *env);
  71 extern "C" BOOL g_bUserHasChangedInputLang;
  72 
  73 extern CriticalSection windowMoveLock;
  74 extern BOOL windowMoveLockHeld;
  75 
  76 // Needed by JAWT: see awt_DrawingSurface.cpp.
  77 extern jclass jawtVImgClass;
  78 extern jclass jawtVSMgrClass;
  79 extern jclass jawtComponentClass;
  80 extern jfieldID jawtPDataID;
  81 extern jfieldID jawtSDataID;
  82 extern jfieldID jawtSMgrID;
  83 
  84 extern BOOL isSuddenTerminationEnabled;
  85 
  86 extern void DWMResetCompositionEnabled();
  87 
  88 /************************************************************************
  89  * Utilities
  90  */
  91 
  92 /* Initialize the Java VM instance variable when the library is
  93    first loaded */
  94 JavaVM *jvm = NULL;
  95 
  96 JNIEXPORT jint JNICALL
  97 JNI_OnLoad(JavaVM *vm, void *reserved)
  98 {
  99     TRY;
 100 
 101     jvm = vm;
 102     return JNI_VERSION_1_2;
 103 
 104     CATCH_BAD_ALLOC_RET(0);
 105 }


 255         break;
 256     case DLL_PROCESS_DETACH:
 257 #ifdef DEBUG
 258         DTrace_DisableMutex();
 259         DMem_DisableMutex();
 260 #endif DEBUG
 261         break;
 262     }
 263     return TRUE;
 264 }
 265 
 266 /************************************************************************
 267  * AwtToolkit fields
 268  */
 269 
 270 AwtToolkit AwtToolkit::theInstance;
 271 
 272 /* ids for WToolkit fields accessed from native code */
 273 jmethodID AwtToolkit::windowsSettingChangeMID;
 274 jmethodID AwtToolkit::displayChangeMID;
 275 
 276 jmethodID AwtToolkit::userSessionMID;
 277 jmethodID AwtToolkit::systemSleepMID;
 278 /* ids for Toolkit methods */
 279 jmethodID AwtToolkit::getDefaultToolkitMID;
 280 jmethodID AwtToolkit::getFontMetricsMID;
 281 jmethodID AwtToolkit::insetsMID;
 282 
 283 /************************************************************************
 284  * AwtToolkit methods
 285  */
 286 
 287 AwtToolkit::AwtToolkit() {
 288     m_localPump = FALSE;
 289     m_mainThreadId = 0;
 290     m_toolkitHWnd = NULL;
 291     m_inputMethodHWnd = NULL;
 292     m_verbose = FALSE;
 293     m_isActive = TRUE;
 294     m_isDisposed = FALSE;
 295 
 296     m_vmSignalled = FALSE;
 297 


1035           initScreens(env);
1036 
1037           // Notify Java side - call WToolkit.displayChanged()
1038           jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
1039           DASSERT(clazz != NULL);
1040           if (!clazz) throw std::bad_alloc();
1041           env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
1042 
1043           GetInstance().m_displayChanged = TRUE;
1044 
1045           ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL);
1046           break;
1047       }
1048       case WM_AWT_SETCURSOR: {
1049           ::SetCursor((HCURSOR)wParam);
1050           return TRUE;
1051       }
1052       /* Session management */
1053       case WM_QUERYENDSESSION: {
1054           /* Shut down cleanly */
1055           if (!isSuddenTerminationEnabled) {
1056               return FALSE;
1057           }
1058           if (JVM_RaiseSignal(SIGTERM)) {
1059               AwtToolkit::GetInstance().m_vmSignalled = TRUE;
1060           }
1061           return TRUE;
1062       }
1063       case WM_ENDSESSION: {
1064           // Keep pumping messages until the shutdown sequence halts the VM,
1065           // or we exit the MessageLoop because of a WM_QUIT message
1066           AwtToolkit& tk = AwtToolkit::GetInstance();
1067 
1068           // if WM_QUERYENDSESSION hasn't successfully raised SIGTERM
1069           // we ignore the ENDSESSION message
1070           if (!tk.m_vmSignalled) {
1071               return 0;
1072           }
1073           tk.MessageLoop(AwtToolkit::PrimaryIdleFunc,
1074                          AwtToolkit::CommonPeekMessageFunc);
1075 
1076           // Dispose here instead of in eventLoop so that we don't have
1077           // to return from the WM_ENDSESSION handler.
1078           tk.Dispose();
1079 
1080           // Never return. The VM will halt the process.
1081           hang_if_shutdown();
1082 
1083           // Should never get here.
1084           DASSERT(FALSE);
1085           break;
1086       }
1087 #ifndef WM_WTSSESSION_CHANGE
1088 #define WM_WTSSESSION_CHANGE        0x02B1
1089 #define WTS_CONSOLE_CONNECT 0x1
1090 #define WTS_CONSOLE_DISCONNECT 0x2
1091 #define WTS_REMOTE_CONNECT 0x3
1092 #define WTS_REMOTE_DISCONNECT 0x4
1093 #define WTS_SESSION_LOGON 0x5
1094 #define WTS_SESSION_LOGOFF 0x6
1095 #define WTS_SESSION_LOCK 0x7
1096 #define WTS_SESSION_UNLOCK 0x8
1097 #define WTS_SESSION_REMOTE_CONTROL 0x9
1098 #endif // WM_WTSSESSION_CHANGE
1099       case WM_WTSSESSION_CHANGE: {
1100           jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer");
1101           DASSERT(clzz != NULL);
1102           if (!clzz) throw std::bad_alloc();
1103 
1104           if (wParam == WTS_CONSOLE_CONNECT
1105                 || wParam == WTS_CONSOLE_DISCONNECT
1106                 || wParam == WTS_REMOTE_CONNECT
1107                 || wParam == WTS_REMOTE_DISCONNECT
1108                 || wParam == WTS_SESSION_UNLOCK
1109                 || wParam == WTS_SESSION_LOCK) {
1110              
1111               BOOL activate = wParam == WTS_CONSOLE_CONNECT
1112                                 || wParam == WTS_REMOTE_CONNECT
1113                                 || wParam == WTS_SESSION_UNLOCK;
1114               int reason = java_awt_AppEvent_UserSessionEvent_REASON_UNSPECIFIED;
1115               switch (wParam) {
1116                   case WTS_CONSOLE_CONNECT:
1117                   case WTS_CONSOLE_DISCONNECT:
1118                       reason = java_awt_AppEvent_UserSessionEvent_REASON_CONSOLE;
1119                       break;
1120                   case WTS_REMOTE_CONNECT:
1121                   case WTS_REMOTE_DISCONNECT:
1122                       reason = java_awt_AppEvent_UserSessionEvent_REASON_REMOTE;
1123                       break;
1124                   case WTS_SESSION_UNLOCK:
1125                   case WTS_SESSION_LOCK:
1126                       reason = java_awt_AppEvent_UserSessionEvent_REASON_LOCK;
1127               }
1128 
1129               env->CallStaticVoidMethod(clzz, AwtToolkit::userSessionMID,
1130                                               activate
1131                                               ? JNI_TRUE
1132                                               : JNI_FALSE, reason);
1133           }
1134           break;
1135       }
1136       case WM_POWERBROADCAST: {
1137           jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer");
1138           DASSERT(clzz != NULL);
1139           if (!clzz) throw std::bad_alloc();
1140           
1141           if (wParam == PBT_APMSUSPEND || wParam == PBT_APMRESUMEAUTOMATIC) {
1142               env->CallStaticVoidMethod(clzz, AwtToolkit::systemSleepMID,
1143                                             wParam == PBT_APMRESUMEAUTOMATIC
1144                                                 ? JNI_TRUE 
1145                                                 : JNI_FALSE);
1146           } 
1147           break;
1148       }
1149       case WM_SYNC_WAIT:
1150           SetEvent(AwtToolkit::GetInstance().m_waitEvent);
1151           break;
1152     }
1153 
1154     return DefWindowProc(hWnd, message, wParam, lParam);
1155 
1156     CATCH_BAD_ALLOC_RET(0);
1157 }
1158 
1159 LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code,
1160                                               WPARAM wParam, LPARAM lParam)
1161 {
1162     TRY;
1163 
1164     if (code >= 0 && wParam == PM_REMOVE && lParam != 0) {
1165        if (AwtToolkit::GetInstance().PreProcessMsg(*(MSG*)lParam) !=
1166                mrPassAlong) {
1167            /* PreProcessMsg() wants us to eat it */
1168            ((MSG*)lParam)->message = WM_NULL;


2186     DASSERT(componentClassLocal != 0);
2187     CHECK_NULL(componentClassLocal);
2188 
2189     jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager",
2190                                  "Lsun/awt/image/VolatileSurfaceManager;");
2191     DASSERT(jawtSMgrID != 0);
2192     CHECK_NULL(jawtSMgrID);
2193 
2194     jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent",
2195                                   "Lsun/java2d/SurfaceData;");
2196     DASSERT(jawtSDataID != 0);
2197     CHECK_NULL(jawtSDataID);
2198 
2199     jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J");
2200     DASSERT(jawtPDataID != 0);
2201     CHECK_NULL(jawtPDataID);
2202     // Save these classes in global references for later use
2203     jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal);
2204     CHECK_NULL(jawtVImgClass);
2205     jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal);
2206 
2207     jclass dPeerClassLocal = env->FindClass("sun/awt/windows/WDesktopPeer");
2208     DASSERT(dPeerClassLocal != 0);
2209     CHECK_NULL(dPeerClassLocal);
2210 
2211     AwtToolkit::userSessionMID =
2212     env->GetStaticMethodID(dPeerClassLocal, "userSessionCallback", "(ZI)V");
2213     DASSERT(AwtToolkit::userSessionMID != 0);
2214     CHECK_NULL(AwtToolkit::userSessionMID);
2215     
2216     AwtToolkit::systemSleepMID =
2217     env->GetStaticMethodID(dPeerClassLocal, "systemSleepCallback", "(Z)V");
2218     DASSERT(AwtToolkit::systemSleepMID != 0);
2219     CHECK_NULL(AwtToolkit::systemSleepMID);
2220 
2221     CATCH_BAD_ALLOC;
2222 }
2223 
2224 
2225 /*
2226  * Class:     sun_awt_windows_Toolkit
2227  * Method:    disableCustomPalette
2228  * Signature: ()V
2229  */
2230 JNIEXPORT void JNICALL
2231 Java_sun_awt_windows_WToolkit_disableCustomPalette(JNIEnv *env, jclass cls) {
2232     AwtPalette::DisableCustomPalette();
2233 }
2234 
2235 /*
2236  * Class:     sun_awt_windows_WToolkit
2237  * Method:    embeddedInit
2238  * Signature: ()Z
2239  */


< prev index next >