288 jmethodID AwtToolkit::insetsMID; 289 290 /************************************************************************ 291 * AwtToolkit methods 292 */ 293 294 AwtToolkit::AwtToolkit() { 295 m_localPump = FALSE; 296 m_mainThreadId = 0; 297 m_toolkitHWnd = NULL; 298 m_inputMethodHWnd = NULL; 299 m_verbose = FALSE; 300 m_isActive = TRUE; 301 m_isDisposed = FALSE; 302 303 m_vmSignalled = FALSE; 304 305 m_isDynamicLayoutSet = FALSE; 306 m_areExtraMouseButtonsEnabled = TRUE; 307 308 m_verifyComponents = FALSE; 309 m_breakOnError = FALSE; 310 311 m_breakMessageLoop = FALSE; 312 m_messageLoopResult = 0; 313 314 m_lastMouseOver = NULL; 315 m_mouseDown = FALSE; 316 317 m_hGetMessageHook = 0; 318 m_hMouseLLHook = 0; 319 m_lastWindowUnderMouse = NULL; 320 m_timer = 0; 321 322 m_cmdIDs = new AwtCmdIDList(); 323 m_pModalDialog = NULL; 324 m_peer = NULL; 325 m_dllHandle = NULL; 326 327 m_displayChanged = FALSE; 500 tk.m_localPump = localPump; 501 tk.m_mainThreadId = ::GetCurrentThreadId(); 502 503 /* 504 * Create the one-and-only toolkit window. This window isn't 505 * displayed, but is used to route messages to this thread. 506 */ 507 tk.m_toolkitHWnd = tk.CreateToolkitWnd(TEXT("theAwtToolkitWindow")); 508 DASSERT(tk.m_toolkitHWnd != NULL); 509 510 /* 511 * Setup a GetMessage filter to watch all messages coming out of our 512 * queue from PreProcessMsg(). 513 */ 514 tk.m_hGetMessageHook = ::SetWindowsHookEx(WH_GETMESSAGE, 515 (HOOKPROC)GetMessageFilter, 516 0, tk.m_mainThreadId); 517 518 awt_dnd_initialize(); 519 520 return TRUE; 521 } 522 523 BOOL AwtToolkit::Dispose() { 524 DTRACE_PRINTLN("In AwtToolkit::Dispose()"); 525 526 AwtToolkit& tk = AwtToolkit::GetInstance(); 527 528 if (!tk.m_isActive || tk.m_mainThreadId != ::GetCurrentThreadId()) { 529 return FALSE; 530 } 531 532 tk.m_isActive = FALSE; 533 534 // dispose Direct3D-related resources. This should be done 535 // before AwtObjectList::Cleanup() as the d3d will attempt to 536 // shutdown when the last of its windows is disposed of 537 D3DInitializer::GetInstance().Clean(); 538 539 AwtObjectList::Cleanup(); 540 541 awt_dnd_uninitialize(); 542 awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); 543 544 if (tk.m_inputMethodHWnd != NULL) { 545 ::SendMessage(tk.m_inputMethodHWnd, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0); 546 } 547 tk.m_inputMethodHWnd = NULL; 548 549 // wait for any messages to be processed, in particular, 550 // all WM_AWT_DELETEOBJECT messages that delete components; no 551 // new messages will appear as all the windows except toolkit 552 // window are unsubclassed and destroyed 553 MSG msg; 554 while (::GetMessage(&msg, NULL, 0, 0)) { 555 ::TranslateMessage(&msg); 556 ::DispatchMessage(&msg); 557 } 558 559 AwtFont::Cleanup(); 560 561 HWND toolkitHWndToDestroy = tk.m_toolkitHWnd; 562 tk.m_toolkitHWnd = 0; 563 VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL); 2806 * Signature: (Z)V 2807 */ 2808 extern "C" JNIEXPORT void JNICALL Java_sun_awt_windows_WToolkit_setExtraMouseButtonsEnabledNative 2809 (JNIEnv *env, jclass self, jboolean enable){ 2810 TRY; 2811 AwtToolkit::GetInstance().setExtraMouseButtonsEnabled(enable); 2812 CATCH_BAD_ALLOC; 2813 } 2814 2815 void AwtToolkit::setExtraMouseButtonsEnabled(BOOL enable) { 2816 m_areExtraMouseButtonsEnabled = enable; 2817 } 2818 2819 JNIEXPORT jint JNICALL Java_sun_awt_windows_WToolkit_getNumberOfButtonsImpl 2820 (JNIEnv *, jobject self) { 2821 return AwtToolkit::GetNumberOfButtons(); 2822 } 2823 2824 UINT AwtToolkit::GetNumberOfButtons() { 2825 return MOUSE_BUTTONS_WINDOWS_SUPPORTED; 2826 } | 288 jmethodID AwtToolkit::insetsMID; 289 290 /************************************************************************ 291 * AwtToolkit methods 292 */ 293 294 AwtToolkit::AwtToolkit() { 295 m_localPump = FALSE; 296 m_mainThreadId = 0; 297 m_toolkitHWnd = NULL; 298 m_inputMethodHWnd = NULL; 299 m_verbose = FALSE; 300 m_isActive = TRUE; 301 m_isDisposed = FALSE; 302 303 m_vmSignalled = FALSE; 304 305 m_isDynamicLayoutSet = FALSE; 306 m_areExtraMouseButtonsEnabled = TRUE; 307 308 m_isWin8OrLater = FALSE; 309 m_pGetPointerInfoHandle = NULL; 310 311 m_verifyComponents = FALSE; 312 m_breakOnError = FALSE; 313 314 m_breakMessageLoop = FALSE; 315 m_messageLoopResult = 0; 316 317 m_lastMouseOver = NULL; 318 m_mouseDown = FALSE; 319 320 m_hGetMessageHook = 0; 321 m_hMouseLLHook = 0; 322 m_lastWindowUnderMouse = NULL; 323 m_timer = 0; 324 325 m_cmdIDs = new AwtCmdIDList(); 326 m_pModalDialog = NULL; 327 m_peer = NULL; 328 m_dllHandle = NULL; 329 330 m_displayChanged = FALSE; 503 tk.m_localPump = localPump; 504 tk.m_mainThreadId = ::GetCurrentThreadId(); 505 506 /* 507 * Create the one-and-only toolkit window. This window isn't 508 * displayed, but is used to route messages to this thread. 509 */ 510 tk.m_toolkitHWnd = tk.CreateToolkitWnd(TEXT("theAwtToolkitWindow")); 511 DASSERT(tk.m_toolkitHWnd != NULL); 512 513 /* 514 * Setup a GetMessage filter to watch all messages coming out of our 515 * queue from PreProcessMsg(). 516 */ 517 tk.m_hGetMessageHook = ::SetWindowsHookEx(WH_GETMESSAGE, 518 (HOOKPROC)GetMessageFilter, 519 0, tk.m_mainThreadId); 520 521 awt_dnd_initialize(); 522 523 /* 524 * Initialization of the touch related variables. 525 */ 526 tk.m_isWin8OrLater = IS_WIN8; 527 528 if (tk.m_isWin8OrLater) { 529 HMODULE hUser32Dll = ::LoadLibrary(_T("user32.dll")); 530 if (hUser32Dll != NULL) { 531 tk.m_pGetPointerInfoHandle = (GetPointerInfoHandleFunc) 532 ::GetProcAddress(hUser32Dll, "GetPointerInfo"); 533 } 534 } 535 536 return TRUE; 537 } 538 539 BOOL AwtToolkit::Dispose() { 540 DTRACE_PRINTLN("In AwtToolkit::Dispose()"); 541 542 AwtToolkit& tk = AwtToolkit::GetInstance(); 543 544 if (!tk.m_isActive || tk.m_mainThreadId != ::GetCurrentThreadId()) { 545 return FALSE; 546 } 547 548 tk.m_isActive = FALSE; 549 550 // dispose Direct3D-related resources. This should be done 551 // before AwtObjectList::Cleanup() as the d3d will attempt to 552 // shutdown when the last of its windows is disposed of 553 D3DInitializer::GetInstance().Clean(); 554 555 AwtObjectList::Cleanup(); 556 557 awt_dnd_uninitialize(); 558 awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); 559 560 m_pGetPointerInfoHandle = NULL; 561 562 if (tk.m_inputMethodHWnd != NULL) { 563 ::SendMessage(tk.m_inputMethodHWnd, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0); 564 } 565 tk.m_inputMethodHWnd = NULL; 566 567 // wait for any messages to be processed, in particular, 568 // all WM_AWT_DELETEOBJECT messages that delete components; no 569 // new messages will appear as all the windows except toolkit 570 // window are unsubclassed and destroyed 571 MSG msg; 572 while (::GetMessage(&msg, NULL, 0, 0)) { 573 ::TranslateMessage(&msg); 574 ::DispatchMessage(&msg); 575 } 576 577 AwtFont::Cleanup(); 578 579 HWND toolkitHWndToDestroy = tk.m_toolkitHWnd; 580 tk.m_toolkitHWnd = 0; 581 VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL); 2824 * Signature: (Z)V 2825 */ 2826 extern "C" JNIEXPORT void JNICALL Java_sun_awt_windows_WToolkit_setExtraMouseButtonsEnabledNative 2827 (JNIEnv *env, jclass self, jboolean enable){ 2828 TRY; 2829 AwtToolkit::GetInstance().setExtraMouseButtonsEnabled(enable); 2830 CATCH_BAD_ALLOC; 2831 } 2832 2833 void AwtToolkit::setExtraMouseButtonsEnabled(BOOL enable) { 2834 m_areExtraMouseButtonsEnabled = enable; 2835 } 2836 2837 JNIEXPORT jint JNICALL Java_sun_awt_windows_WToolkit_getNumberOfButtonsImpl 2838 (JNIEnv *, jobject self) { 2839 return AwtToolkit::GetNumberOfButtons(); 2840 } 2841 2842 UINT AwtToolkit::GetNumberOfButtons() { 2843 return MOUSE_BUTTONS_WINDOWS_SUPPORTED; 2844 } 2845 2846 BOOL AwtToolkit::TIGetPointerInfo(UINT32 pointerID, POINTER_INFO *pointerInfo) 2847 { 2848 if (m_pGetPointerInfoHandle == NULL) { 2849 return FALSE; 2850 } 2851 2852 return m_pGetPointerInfoHandle(pointerID, pointerInfo); 2853 } |