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 */ | 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 BOOL isSuddenTerminationEnabled; 84 85 extern void DWMResetCompositionEnabled(); 86 87 /************************************************************************ 88 * Utilities 89 */ 90 91 /* Initialize the Java VM instance variable when the library is 92 first loaded */ 93 JavaVM *jvm = NULL; 94 95 JNIEXPORT jint JNICALL 96 JNI_OnLoad(JavaVM *vm, void *reserved) 97 { 98 TRY; 99 100 jvm = vm; 101 return JNI_VERSION_1_2; 102 103 CATCH_BAD_ALLOC_RET(0); 104 } 254 break; 255 case DLL_PROCESS_DETACH: 256 #ifdef DEBUG 257 DTrace_DisableMutex(); 258 DMem_DisableMutex(); 259 #endif DEBUG 260 break; 261 } 262 return TRUE; 263 } 264 265 /************************************************************************ 266 * AwtToolkit fields 267 */ 268 269 AwtToolkit AwtToolkit::theInstance; 270 271 /* ids for WToolkit fields accessed from native code */ 272 jmethodID AwtToolkit::windowsSettingChangeMID; 273 jmethodID AwtToolkit::displayChangeMID; 274 275 jmethodID AwtToolkit::userSessionMID; 276 jmethodID AwtToolkit::systemSleepMID; 277 /* ids for Toolkit methods */ 278 jmethodID AwtToolkit::getDefaultToolkitMID; 279 jmethodID AwtToolkit::getFontMetricsMID; 280 jmethodID AwtToolkit::insetsMID; 281 282 /************************************************************************ 283 * AwtToolkit methods 284 */ 285 286 AwtToolkit::AwtToolkit() { 287 m_localPump = FALSE; 288 m_mainThreadId = 0; 289 m_toolkitHWnd = NULL; 290 m_inputMethodHWnd = NULL; 291 m_verbose = FALSE; 292 m_isActive = TRUE; 293 m_isDisposed = FALSE; 294 295 m_vmSignalled = FALSE; 296 1034 initScreens(env); 1035 1036 // Notify Java side - call WToolkit.displayChanged() 1037 jclass clazz = env->FindClass("sun/awt/windows/WToolkit"); 1038 DASSERT(clazz != NULL); 1039 if (!clazz) throw std::bad_alloc(); 1040 env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID); 1041 1042 GetInstance().m_displayChanged = TRUE; 1043 1044 ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL); 1045 break; 1046 } 1047 case WM_AWT_SETCURSOR: { 1048 ::SetCursor((HCURSOR)wParam); 1049 return TRUE; 1050 } 1051 /* Session management */ 1052 case WM_QUERYENDSESSION: { 1053 /* Shut down cleanly */ 1054 if (!isSuddenTerminationEnabled) { 1055 return FALSE; 1056 } 1057 if (JVM_RaiseSignal(SIGTERM)) { 1058 AwtToolkit::GetInstance().m_vmSignalled = TRUE; 1059 } 1060 return TRUE; 1061 } 1062 case WM_ENDSESSION: { 1063 // Keep pumping messages until the shutdown sequence halts the VM, 1064 // or we exit the MessageLoop because of a WM_QUIT message 1065 AwtToolkit& tk = AwtToolkit::GetInstance(); 1066 1067 // if WM_QUERYENDSESSION hasn't successfully raised SIGTERM 1068 // we ignore the ENDSESSION message 1069 if (!tk.m_vmSignalled) { 1070 return 0; 1071 } 1072 tk.MessageLoop(AwtToolkit::PrimaryIdleFunc, 1073 AwtToolkit::CommonPeekMessageFunc); 1074 1075 // Dispose here instead of in eventLoop so that we don't have 1076 // to return from the WM_ENDSESSION handler. 1077 tk.Dispose(); 1078 1079 // Never return. The VM will halt the process. 1080 hang_if_shutdown(); 1081 1082 // Should never get here. 1083 DASSERT(FALSE); 1084 break; 1085 } 1086 #ifndef WM_WTSSESSION_CHANGE 1087 #define WM_WTSSESSION_CHANGE 0x02B1 1088 #define WTS_CONSOLE_CONNECT 0x1 1089 #define WTS_CONSOLE_DISCONNECT 0x2 1090 #define WTS_REMOTE_CONNECT 0x3 1091 #define WTS_REMOTE_DISCONNECT 0x4 1092 #define WTS_SESSION_LOGON 0x5 1093 #define WTS_SESSION_LOGOFF 0x6 1094 #define WTS_SESSION_LOCK 0x7 1095 #define WTS_SESSION_UNLOCK 0x8 1096 #define WTS_SESSION_REMOTE_CONTROL 0x9 1097 #endif // WM_WTSSESSION_CHANGE 1098 case WM_WTSSESSION_CHANGE: { 1099 jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer"); 1100 DASSERT(clzz != NULL); 1101 if (!clzz) throw std::bad_alloc(); 1102 1103 if (wParam == WTS_CONSOLE_CONNECT 1104 || wParam == WTS_CONSOLE_DISCONNECT 1105 || wParam == WTS_REMOTE_CONNECT 1106 || wParam == WTS_REMOTE_DISCONNECT 1107 || wParam == WTS_SESSION_UNLOCK 1108 || wParam == WTS_SESSION_LOCK) { 1109 1110 static BOOL isActiveStateKnown = FALSE; 1111 static BOOL isActive = FALSE; 1112 1113 BOOL activate = wParam == WTS_CONSOLE_CONNECT 1114 || wParam == WTS_REMOTE_CONNECT 1115 || wParam == WTS_SESSION_UNLOCK; 1116 1117 if (isActive != activate || !isActiveStateKnown) { 1118 env->CallStaticVoidMethod(clzz, AwtToolkit::userSessionMID, 1119 activate 1120 ? JNI_TRUE 1121 : JNI_FALSE); 1122 } 1123 1124 isActive = activate; 1125 isActiveStateKnown = TRUE; 1126 } 1127 break; 1128 } 1129 case WM_POWERBROADCAST: { 1130 jclass clzz = env->FindClass("sun/awt/windows/WDesktopPeer"); 1131 DASSERT(clzz != NULL); 1132 if (!clzz) throw std::bad_alloc(); 1133 1134 if (wParam == PBT_APMSUSPEND || wParam == PBT_APMRESUMEAUTOMATIC) { 1135 env->CallStaticVoidMethod(clzz, AwtToolkit::systemSleepMID, 1136 wParam == PBT_APMRESUMEAUTOMATIC 1137 ? JNI_TRUE 1138 : JNI_FALSE); 1139 } 1140 break; 1141 } 1142 case WM_SYNC_WAIT: 1143 SetEvent(AwtToolkit::GetInstance().m_waitEvent); 1144 break; 1145 } 1146 1147 return DefWindowProc(hWnd, message, wParam, lParam); 1148 1149 CATCH_BAD_ALLOC_RET(0); 1150 } 1151 1152 LRESULT CALLBACK AwtToolkit::GetMessageFilter(int code, 1153 WPARAM wParam, LPARAM lParam) 1154 { 1155 TRY; 1156 1157 if (code >= 0 && wParam == PM_REMOVE && lParam != 0) { 1158 if (AwtToolkit::GetInstance().PreProcessMsg(*(MSG*)lParam) != 1159 mrPassAlong) { 1160 /* PreProcessMsg() wants us to eat it */ 1161 ((MSG*)lParam)->message = WM_NULL; 2179 DASSERT(componentClassLocal != 0); 2180 CHECK_NULL(componentClassLocal); 2181 2182 jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager", 2183 "Lsun/awt/image/VolatileSurfaceManager;"); 2184 DASSERT(jawtSMgrID != 0); 2185 CHECK_NULL(jawtSMgrID); 2186 2187 jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent", 2188 "Lsun/java2d/SurfaceData;"); 2189 DASSERT(jawtSDataID != 0); 2190 CHECK_NULL(jawtSDataID); 2191 2192 jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J"); 2193 DASSERT(jawtPDataID != 0); 2194 CHECK_NULL(jawtPDataID); 2195 // Save these classes in global references for later use 2196 jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal); 2197 CHECK_NULL(jawtVImgClass); 2198 jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal); 2199 2200 jclass dPeerClassLocal = env->FindClass("sun/awt/windows/WDesktopPeer"); 2201 DASSERT(dPeerClassLocal != 0); 2202 CHECK_NULL(dPeerClassLocal); 2203 2204 AwtToolkit::userSessionMID = 2205 env->GetStaticMethodID(dPeerClassLocal, "userSessionCallback", "(Z)V"); 2206 DASSERT(AwtToolkit::userSessionMID != 0); 2207 CHECK_NULL(AwtToolkit::userSessionMID); 2208 2209 AwtToolkit::systemSleepMID = 2210 env->GetStaticMethodID(dPeerClassLocal, "systemSleepCallback", "(Z)V"); 2211 DASSERT(AwtToolkit::systemSleepMID != 0); 2212 CHECK_NULL(AwtToolkit::systemSleepMID); 2213 2214 CATCH_BAD_ALLOC; 2215 } 2216 2217 2218 /* 2219 * Class: sun_awt_windows_Toolkit 2220 * Method: disableCustomPalette 2221 * Signature: ()V 2222 */ 2223 JNIEXPORT void JNICALL 2224 Java_sun_awt_windows_WToolkit_disableCustomPalette(JNIEnv *env, jclass cls) { 2225 AwtPalette::DisableCustomPalette(); 2226 } 2227 2228 /* 2229 * Class: sun_awt_windows_WToolkit 2230 * Method: embeddedInit 2231 * Signature: ()Z 2232 */ |