< prev index next >

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

Print this page




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


< prev index next >