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