< prev index next >

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

Print this page




 326     m_hGetMessageHook = 0;
 327     m_hMouseLLHook = 0;
 328     m_lastWindowUnderMouse = NULL;
 329     m_timer = 0;
 330 
 331     m_cmdIDs = new AwtCmdIDList();
 332     m_pModalDialog = NULL;
 333     m_peer = NULL;
 334     m_dllHandle = NULL;
 335 
 336     m_displayChanged = FALSE;
 337     m_embedderProcessID = 0;
 338 
 339     // XXX: keyboard mapping should really be moved out of AwtComponent
 340     AwtComponent::InitDynamicKeyMapTable();
 341 
 342     // initialize kb state array
 343     ::GetKeyboardState(m_lastKeyboardState);
 344 
 345     m_waitEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);

 346     isInDoDragDropLoop = FALSE;
 347     eventNumber = 0;
 348 }
 349 
 350 AwtToolkit::~AwtToolkit() {
 351 /*
 352  *  The code has been moved to AwtToolkit::Dispose() method.
 353  */
 354 }
 355 
 356 HWND AwtToolkit::CreateToolkitWnd(LPCTSTR name)
 357 {
 358     HWND hwnd = CreateWindow(
 359         szAwtToolkitClassName,
 360         (LPCTSTR)name,                    /* window name */
 361         WS_DISABLED,                      /* window style */
 362         -1, -1,                           /* position of window */
 363         0, 0,                             /* width and height */
 364         NULL, NULL,                       /* hWndParent and hWndMenu */
 365         GetModuleHandle(),


 760         ::TranslateMessage(&msg);
 761         ::DispatchMessage(&msg);
 762     }
 763 
 764     AwtFont::Cleanup();
 765 
 766     HWND toolkitHWndToDestroy = tk.m_toolkitHWnd;
 767     tk.m_toolkitHWnd = 0;
 768     VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL);
 769 
 770     tk.UnregisterClass();
 771 
 772     ::UnhookWindowsHookEx(tk.m_hGetMessageHook);
 773     UninstallMouseLowLevelHook();
 774 
 775     tk.m_mainThreadId = 0;
 776 
 777     delete tk.m_cmdIDs;
 778 
 779     ::CloseHandle(m_waitEvent);

 780 
 781     tk.m_isDisposed = TRUE;
 782 
 783     return TRUE;
 784 }
 785 
 786 void AwtToolkit::SetDynamicLayout(BOOL dynamic) {
 787     m_isDynamicLayoutSet = dynamic;
 788 }
 789 
 790 BOOL AwtToolkit::IsDynamicLayoutSet() {
 791     return m_isDynamicLayoutSet;
 792 }
 793 
 794 BOOL AwtToolkit::IsDynamicLayoutSupported() {
 795     // SPI_GETDRAGFULLWINDOWS is only supported on Win95 if
 796     // Windows Plus! is installed.  Otherwise, box frame resize.
 797     BOOL fullWindowDragEnabled = FALSE;
 798     int result = 0;
 799     result = ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0,


1070           return 0;
1071       }
1072       case WM_DRAWCLIPBOARD: {
1073           AwtClipboard::WmDrawClipboard((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2), wParam, lParam);
1074           return 0;
1075       }
1076       case WM_AWT_LIST_SETMULTISELECT: {
1077           jobject peerObject = (jobject)wParam;
1078           AwtList* list = (AwtList *)JNI_GET_PDATA(peerObject);
1079           DASSERT( !IsBadReadPtr(list, sizeof(AwtObject)));
1080           list->SetMultiSelect(static_cast<BOOL>(lParam));
1081           return 0;
1082       }
1083 
1084       // Special awt message to call Imm APIs.
1085       // ImmXXXX() API must be used in the main thread.
1086       // In other thread these APIs does not work correctly even if
1087       // it returs with no error. (This restriction is not documented)
1088       // So we must use thse messages to call these APIs in main thread.
1089       case WM_AWT_CREATECONTEXT: {
1090         return reinterpret_cast<LRESULT>(

1091             reinterpret_cast<void*>(ImmCreateContext()));


1092       }
1093       case WM_AWT_DESTROYCONTEXT: {
1094           ImmDestroyContext((HIMC)wParam);



1095           return 0;
1096       }
1097       case WM_AWT_ASSOCIATECONTEXT: {
1098           EnableNativeIMEStruct *data = (EnableNativeIMEStruct*)wParam;
1099 
1100           jobject peer = data->peer;
1101           jobject self = data->self;
1102           jint context = data->context;
1103           jboolean useNativeCompWindow = data->useNativeCompWindow;
1104 
1105           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1106           if (comp != NULL)
1107           {
1108               comp->SetInputMethod(self, useNativeCompWindow);
1109               comp->ImmAssociateContext((HIMC)((intptr_t)context));
1110           }
1111 
1112           if (peer != NULL) {
1113               env->DeleteGlobalRef(peer);
1114           }
1115           if (self != NULL) {
1116               env->DeleteGlobalRef(self);
1117           }
1118 
1119           delete data;



1120           return 0;
1121       }
1122       case WM_AWT_GET_DEFAULT_IME_HANDLER: {
1123           LRESULT ret = (LRESULT)FALSE;
1124           jobject peer = (jobject)wParam;

1125 
1126           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1127           if (comp != NULL) {
1128               HWND defaultIMEHandler = ImmGetDefaultIMEWnd(comp->GetHWnd());
1129               if (defaultIMEHandler != NULL) {
1130                   AwtToolkit::GetInstance().SetInputMethodWindow(defaultIMEHandler);
1131                   ret = (LRESULT)TRUE;
1132               }
1133           }
1134 
1135           if (peer != NULL) {
1136               env->DeleteGlobalRef(peer);
1137           }


1138           return ret;
1139       }
1140       case WM_AWT_HANDLE_NATIVE_IME_EVENT: {
1141           jobject peer = (jobject)wParam;
1142           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1143           MSG* msg = (MSG*)lParam;
1144 
1145           long modifiers = comp->GetJavaModifiers();
1146           if ((comp != NULL) && (msg->message==WM_CHAR || msg->message==WM_SYSCHAR)) {
1147               WCHAR unicodeChar = (WCHAR)msg->wParam;
1148               comp->SendKeyEvent(java_awt_event_KeyEvent_KEY_TYPED,
1149                                  0, //to be fixed nowMillis(),
1150                                  java_awt_event_KeyEvent_CHAR_UNDEFINED,
1151                                  unicodeChar,
1152                                  modifiers,
1153                                  java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
1154                                  msg);
1155           } else if (comp != NULL) {
1156               MSG* pCopiedMsg = new MSG;
1157               *pCopiedMsg = *msg;
1158               comp->SendMessage(WM_AWT_HANDLE_EVENT, (WPARAM) FALSE,
1159                                 (LPARAM) pCopiedMsg);
1160           }
1161 
1162           if (peer != NULL) {
1163               env->DeleteGlobalRef(peer);
1164           }
1165           return 0;
1166       }
1167       case WM_AWT_ENDCOMPOSITION: {
1168           /*right now we just cancel the composition string
1169           may need to commit it in the furture
1170           Changed to commit it according to the flag 10/29/98*/
1171           ImmNotifyIME((HIMC)wParam, NI_COMPOSITIONSTR,
1172                        (lParam ? CPS_COMPLETE : CPS_CANCEL), 0);



1173           return 0;
1174       }
1175       case WM_AWT_SETCONVERSIONSTATUS: {
1176           DWORD cmode;
1177           DWORD smode;
1178           ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);
1179           ImmSetConversionStatus((HIMC)wParam, (DWORD)LOWORD(lParam), smode);



1180           return 0;
1181       }
1182       case WM_AWT_GETCONVERSIONSTATUS: {
1183           DWORD cmode;
1184           DWORD smode;
1185           ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);



1186           return cmode;
1187       }
1188       case WM_AWT_ACTIVATEKEYBOARDLAYOUT: {
1189           if (wParam && g_bUserHasChangedInputLang) {
1190               // Input language has been changed since the last WInputMethod.getNativeLocale()
1191               // call.  So let's honor the user's selection.
1192               // Note: we need to check this flag inside the toolkit thread to synchronize access
1193               // to the flag.
1194               return FALSE;
1195           }
1196 
1197           if (lParam == (LPARAM)::GetKeyboardLayout(0)) {
1198               // already active
1199               return FALSE;
1200           }
1201 
1202           // Since ActivateKeyboardLayout does not post WM_INPUTLANGCHANGEREQUEST,
1203           // we explicitly need to do the same thing here.
1204           static BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
1205           AwtToolkit::GetKeyboardState(keyboardState);
1206           WORD ignored;
1207           ::ToAscii(VK_SPACE, ::MapVirtualKey(VK_SPACE, 0),
1208                     keyboardState, &ignored, 0);
1209 
1210           return (LRESULT)activateKeyboardLayout((HKL)lParam);
1211       }
1212       case WM_AWT_OPENCANDIDATEWINDOW: {
1213           jobject peerObject = (jobject)wParam;
1214           AwtComponent* p = (AwtComponent*)JNI_GET_PDATA(peerObject);
1215           DASSERT( !IsBadReadPtr(p, sizeof(AwtObject)));
1216           // fix for 4805862: use GET_X_LPARAM and GET_Y_LPARAM macros
1217           // instead of LOWORD and HIWORD
1218           p->OpenCandidateWindow(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
1219           env->DeleteGlobalRef(peerObject);



1220           return 0;
1221       }
1222 
1223       /*
1224        * send this message via ::SendMessage() and the MPT will acquire the
1225        * HANDLE synchronized with the sender's thread. The HANDLE must be
1226        * signalled or deadlock may occur between the MPT and the caller.
1227        */
1228 
1229       case WM_AWT_WAIT_FOR_SINGLE_OBJECT: {
1230         return ::WaitForSingleObject((HANDLE)lParam, INFINITE);
1231       }
1232       case WM_AWT_INVOKE_METHOD: {
1233         return (LRESULT)(*(void*(*)(void*))wParam)((void *)lParam);
1234       }
1235       case WM_AWT_INVOKE_VOID_METHOD: {
1236         return (LRESULT)(*(void*(*)(void))wParam)();
1237       }
1238 
1239       case WM_AWT_SETOPENSTATUS: {
1240           ImmSetOpenStatus((HIMC)wParam, (BOOL)lParam);



1241           return 0;
1242       }
1243       case WM_AWT_GETOPENSTATUS: {
1244           return (DWORD)ImmGetOpenStatus((HIMC)wParam);



1245       }
1246       case WM_DISPLAYCHANGE: {
1247           // Reinitialize screens
1248           initScreens(env);
1249 
1250           // Notify Java side - call WToolkit.displayChanged()
1251           jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
1252           DASSERT(clazz != NULL);
1253           if (!clazz) throw std::bad_alloc();
1254           env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
1255 
1256           GetInstance().m_displayChanged = TRUE;
1257 
1258           ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL);
1259           break;
1260       }
1261       case WM_AWT_SETCURSOR: {
1262           ::SetCursor((HCURSOR)wParam);
1263           return TRUE;
1264       }


3149     if (m_pRegisterTouchWindow == NULL) {
3150         return FALSE;
3151     }
3152     return m_pRegisterTouchWindow(hWnd, ulFlags);
3153 }
3154 
3155 BOOL AwtToolkit::TIGetTouchInputInfo(HTOUCHINPUT hTouchInput,
3156     UINT cInputs, PTOUCHINPUT pInputs, int cbSize) {
3157     if (m_pGetTouchInputInfo == NULL) {
3158         return FALSE;
3159     }
3160     return m_pGetTouchInputInfo(hTouchInput, cInputs, pInputs, cbSize);
3161 }
3162 
3163 BOOL AwtToolkit::TICloseTouchInputHandle(HTOUCHINPUT hTouchInput) {
3164     if (m_pCloseTouchInputHandle == NULL) {
3165         return FALSE;
3166     }
3167     return m_pCloseTouchInputHandle(hTouchInput);
3168 }






















 326     m_hGetMessageHook = 0;
 327     m_hMouseLLHook = 0;
 328     m_lastWindowUnderMouse = NULL;
 329     m_timer = 0;
 330 
 331     m_cmdIDs = new AwtCmdIDList();
 332     m_pModalDialog = NULL;
 333     m_peer = NULL;
 334     m_dllHandle = NULL;
 335 
 336     m_displayChanged = FALSE;
 337     m_embedderProcessID = 0;
 338 
 339     // XXX: keyboard mapping should really be moved out of AwtComponent
 340     AwtComponent::InitDynamicKeyMapTable();
 341 
 342     // initialize kb state array
 343     ::GetKeyboardState(m_lastKeyboardState);
 344 
 345     m_waitEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
 346     m_inputMethodWaitEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
 347     isInDoDragDropLoop = FALSE;
 348     eventNumber = 0;
 349 }
 350 
 351 AwtToolkit::~AwtToolkit() {
 352 /*
 353  *  The code has been moved to AwtToolkit::Dispose() method.
 354  */
 355 }
 356 
 357 HWND AwtToolkit::CreateToolkitWnd(LPCTSTR name)
 358 {
 359     HWND hwnd = CreateWindow(
 360         szAwtToolkitClassName,
 361         (LPCTSTR)name,                    /* window name */
 362         WS_DISABLED,                      /* window style */
 363         -1, -1,                           /* position of window */
 364         0, 0,                             /* width and height */
 365         NULL, NULL,                       /* hWndParent and hWndMenu */
 366         GetModuleHandle(),


 761         ::TranslateMessage(&msg);
 762         ::DispatchMessage(&msg);
 763     }
 764 
 765     AwtFont::Cleanup();
 766 
 767     HWND toolkitHWndToDestroy = tk.m_toolkitHWnd;
 768     tk.m_toolkitHWnd = 0;
 769     VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL);
 770 
 771     tk.UnregisterClass();
 772 
 773     ::UnhookWindowsHookEx(tk.m_hGetMessageHook);
 774     UninstallMouseLowLevelHook();
 775 
 776     tk.m_mainThreadId = 0;
 777 
 778     delete tk.m_cmdIDs;
 779 
 780     ::CloseHandle(m_waitEvent);
 781     ::CloseHandle(m_inputMethodWaitEvent);
 782 
 783     tk.m_isDisposed = TRUE;
 784 
 785     return TRUE;
 786 }
 787 
 788 void AwtToolkit::SetDynamicLayout(BOOL dynamic) {
 789     m_isDynamicLayoutSet = dynamic;
 790 }
 791 
 792 BOOL AwtToolkit::IsDynamicLayoutSet() {
 793     return m_isDynamicLayoutSet;
 794 }
 795 
 796 BOOL AwtToolkit::IsDynamicLayoutSupported() {
 797     // SPI_GETDRAGFULLWINDOWS is only supported on Win95 if
 798     // Windows Plus! is installed.  Otherwise, box frame resize.
 799     BOOL fullWindowDragEnabled = FALSE;
 800     int result = 0;
 801     result = ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0,


1072           return 0;
1073       }
1074       case WM_DRAWCLIPBOARD: {
1075           AwtClipboard::WmDrawClipboard((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2), wParam, lParam);
1076           return 0;
1077       }
1078       case WM_AWT_LIST_SETMULTISELECT: {
1079           jobject peerObject = (jobject)wParam;
1080           AwtList* list = (AwtList *)JNI_GET_PDATA(peerObject);
1081           DASSERT( !IsBadReadPtr(list, sizeof(AwtObject)));
1082           list->SetMultiSelect(static_cast<BOOL>(lParam));
1083           return 0;
1084       }
1085 
1086       // Special awt message to call Imm APIs.
1087       // ImmXXXX() API must be used in the main thread.
1088       // In other thread these APIs does not work correctly even if
1089       // it returs with no error. (This restriction is not documented)
1090       // So we must use thse messages to call these APIs in main thread.
1091       case WM_AWT_CREATECONTEXT: {
1092           AwtToolkit& tk = AwtToolkit::GetInstance();
1093           tk.m_inputMethodData = reinterpret_cast<LRESULT>(
1094             reinterpret_cast<void*>(ImmCreateContext()));
1095           ::SetEvent(tk.m_inputMethodWaitEvent);
1096           return tk.m_inputMethodData;
1097       }
1098       case WM_AWT_DESTROYCONTEXT: {
1099           ImmDestroyContext((HIMC)wParam);
1100           AwtToolkit& tk = AwtToolkit::GetInstance();
1101           tk.m_inputMethodData = 0;
1102           ::SetEvent(tk.m_inputMethodWaitEvent);
1103           return 0;
1104       }
1105       case WM_AWT_ASSOCIATECONTEXT: {
1106           EnableNativeIMEStruct *data = (EnableNativeIMEStruct*)wParam;
1107 
1108           jobject peer = data->peer;
1109           jobject self = data->self;
1110           jint context = data->context;
1111           jboolean useNativeCompWindow = data->useNativeCompWindow;
1112 
1113           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1114           if (comp != NULL)
1115           {
1116               comp->SetInputMethod(self, useNativeCompWindow);
1117               comp->ImmAssociateContext((HIMC)((intptr_t)context));
1118           }
1119 
1120           if (peer != NULL) {
1121               env->DeleteGlobalRef(peer);
1122           }
1123           if (self != NULL) {
1124               env->DeleteGlobalRef(self);
1125           }
1126 
1127           delete data;
1128           AwtToolkit& tk = AwtToolkit::GetInstance();
1129           tk.m_inputMethodData = 0;
1130           ::SetEvent(tk.m_inputMethodWaitEvent);
1131           return 0;
1132       }
1133       case WM_AWT_GET_DEFAULT_IME_HANDLER: {
1134           LRESULT ret = (LRESULT)FALSE;
1135           jobject peer = (jobject)wParam;
1136           AwtToolkit& tk = AwtToolkit::GetInstance();
1137 
1138           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1139           if (comp != NULL) {
1140               HWND defaultIMEHandler = ImmGetDefaultIMEWnd(comp->GetHWnd());
1141               if (defaultIMEHandler != NULL) {
1142                   tk.SetInputMethodWindow(defaultIMEHandler);
1143                   ret = (LRESULT)TRUE;
1144               }
1145           }
1146 
1147           if (peer != NULL) {
1148               env->DeleteGlobalRef(peer);
1149           }
1150           tk.m_inputMethodData = ret;
1151           ::SetEvent(tk.m_inputMethodWaitEvent);
1152           return ret;
1153       }
1154       case WM_AWT_HANDLE_NATIVE_IME_EVENT: {
1155           jobject peer = (jobject)wParam;
1156           AwtComponent* comp = (AwtComponent*)JNI_GET_PDATA(peer);
1157           MSG* msg = (MSG*)lParam;
1158 
1159           long modifiers = comp->GetJavaModifiers();
1160           if ((comp != NULL) && (msg->message==WM_CHAR || msg->message==WM_SYSCHAR)) {
1161               WCHAR unicodeChar = (WCHAR)msg->wParam;
1162               comp->SendKeyEvent(java_awt_event_KeyEvent_KEY_TYPED,
1163                                  0, //to be fixed nowMillis(),
1164                                  java_awt_event_KeyEvent_CHAR_UNDEFINED,
1165                                  unicodeChar,
1166                                  modifiers,
1167                                  java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, (jlong)0,
1168                                  msg);
1169           } else if (comp != NULL) {
1170               MSG* pCopiedMsg = new MSG;
1171               *pCopiedMsg = *msg;
1172               comp->SendMessage(WM_AWT_HANDLE_EVENT, (WPARAM) FALSE,
1173                                 (LPARAM) pCopiedMsg);
1174           }
1175 
1176           if (peer != NULL) {
1177               env->DeleteGlobalRef(peer);
1178           }
1179           return 0;
1180       }
1181       case WM_AWT_ENDCOMPOSITION: {
1182           /*right now we just cancel the composition string
1183           may need to commit it in the furture
1184           Changed to commit it according to the flag 10/29/98*/
1185           ImmNotifyIME((HIMC)wParam, NI_COMPOSITIONSTR,
1186                        (lParam ? CPS_COMPLETE : CPS_CANCEL), 0);
1187           AwtToolkit& tk = AwtToolkit::GetInstance();
1188           tk.m_inputMethodData = 0;
1189           ::SetEvent(tk.m_inputMethodWaitEvent);
1190           return 0;
1191       }
1192       case WM_AWT_SETCONVERSIONSTATUS: {
1193           DWORD cmode;
1194           DWORD smode;
1195           ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);
1196           ImmSetConversionStatus((HIMC)wParam, (DWORD)LOWORD(lParam), smode);
1197           AwtToolkit& tk = AwtToolkit::GetInstance();
1198           tk.m_inputMethodData = 0;
1199           ::SetEvent(tk.m_inputMethodWaitEvent);
1200           return 0;
1201       }
1202       case WM_AWT_GETCONVERSIONSTATUS: {
1203           DWORD cmode;
1204           DWORD smode;
1205           ImmGetConversionStatus((HIMC)wParam, (LPDWORD)&cmode, (LPDWORD)&smode);
1206           AwtToolkit& tk = AwtToolkit::GetInstance();
1207           tk.m_inputMethodData = cmode;
1208           ::SetEvent(tk.m_inputMethodWaitEvent);
1209           return cmode;
1210       }
1211       case WM_AWT_ACTIVATEKEYBOARDLAYOUT: {
1212           if (wParam && g_bUserHasChangedInputLang) {
1213               // Input language has been changed since the last WInputMethod.getNativeLocale()
1214               // call.  So let's honor the user's selection.
1215               // Note: we need to check this flag inside the toolkit thread to synchronize access
1216               // to the flag.
1217               return FALSE;
1218           }
1219 
1220           if (lParam == (LPARAM)::GetKeyboardLayout(0)) {
1221               // already active
1222               return FALSE;
1223           }
1224 
1225           // Since ActivateKeyboardLayout does not post WM_INPUTLANGCHANGEREQUEST,
1226           // we explicitly need to do the same thing here.
1227           static BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
1228           AwtToolkit::GetKeyboardState(keyboardState);
1229           WORD ignored;
1230           ::ToAscii(VK_SPACE, ::MapVirtualKey(VK_SPACE, 0),
1231                     keyboardState, &ignored, 0);
1232 
1233           return (LRESULT)activateKeyboardLayout((HKL)lParam);
1234       }
1235       case WM_AWT_OPENCANDIDATEWINDOW: {
1236           jobject peerObject = (jobject)wParam;
1237           AwtComponent* p = (AwtComponent*)JNI_GET_PDATA(peerObject);
1238           DASSERT( !IsBadReadPtr(p, sizeof(AwtObject)));
1239           // fix for 4805862: use GET_X_LPARAM and GET_Y_LPARAM macros
1240           // instead of LOWORD and HIWORD
1241           p->OpenCandidateWindow(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
1242           env->DeleteGlobalRef(peerObject);
1243           AwtToolkit& tk = AwtToolkit::GetInstance();
1244           tk.m_inputMethodData = 0;
1245           ::SetEvent(tk.m_inputMethodWaitEvent);
1246           return 0;
1247       }
1248 
1249       /*
1250        * send this message via ::SendMessage() and the MPT will acquire the
1251        * HANDLE synchronized with the sender's thread. The HANDLE must be
1252        * signalled or deadlock may occur between the MPT and the caller.
1253        */
1254 
1255       case WM_AWT_WAIT_FOR_SINGLE_OBJECT: {
1256         return ::WaitForSingleObject((HANDLE)lParam, INFINITE);
1257       }
1258       case WM_AWT_INVOKE_METHOD: {
1259         return (LRESULT)(*(void*(*)(void*))wParam)((void *)lParam);
1260       }
1261       case WM_AWT_INVOKE_VOID_METHOD: {
1262         return (LRESULT)(*(void*(*)(void))wParam)();
1263       }
1264 
1265       case WM_AWT_SETOPENSTATUS: {
1266           ImmSetOpenStatus((HIMC)wParam, (BOOL)lParam);
1267           AwtToolkit& tk = AwtToolkit::GetInstance();
1268           tk.m_inputMethodData = 0;
1269           ::SetEvent(tk.m_inputMethodWaitEvent);
1270           return 0;
1271       }
1272       case WM_AWT_GETOPENSTATUS: {
1273           AwtToolkit& tk = AwtToolkit::GetInstance();
1274           tk.m_inputMethodData = (DWORD)ImmGetOpenStatus((HIMC)wParam);
1275           ::SetEvent(tk.m_inputMethodWaitEvent);
1276           return tk.m_inputMethodData;
1277       }
1278       case WM_DISPLAYCHANGE: {
1279           // Reinitialize screens
1280           initScreens(env);
1281 
1282           // Notify Java side - call WToolkit.displayChanged()
1283           jclass clazz = env->FindClass("sun/awt/windows/WToolkit");
1284           DASSERT(clazz != NULL);
1285           if (!clazz) throw std::bad_alloc();
1286           env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID);
1287 
1288           GetInstance().m_displayChanged = TRUE;
1289 
1290           ::PostMessage(HWND_BROADCAST, WM_PALETTEISCHANGING, NULL, NULL);
1291           break;
1292       }
1293       case WM_AWT_SETCURSOR: {
1294           ::SetCursor((HCURSOR)wParam);
1295           return TRUE;
1296       }


3181     if (m_pRegisterTouchWindow == NULL) {
3182         return FALSE;
3183     }
3184     return m_pRegisterTouchWindow(hWnd, ulFlags);
3185 }
3186 
3187 BOOL AwtToolkit::TIGetTouchInputInfo(HTOUCHINPUT hTouchInput,
3188     UINT cInputs, PTOUCHINPUT pInputs, int cbSize) {
3189     if (m_pGetTouchInputInfo == NULL) {
3190         return FALSE;
3191     }
3192     return m_pGetTouchInputInfo(hTouchInput, cInputs, pInputs, cbSize);
3193 }
3194 
3195 BOOL AwtToolkit::TICloseTouchInputHandle(HTOUCHINPUT hTouchInput) {
3196     if (m_pCloseTouchInputHandle == NULL) {
3197         return FALSE;
3198     }
3199     return m_pCloseTouchInputHandle(hTouchInput);
3200 }
3201 
3202 /*
3203  * The fuction intended for access to an IME API. It posts IME message to the queue and
3204  * waits untill the message processing is completed.
3205  *
3206  * On Windows 10 the IME may process the messages send via SenMessage() from other threads
3207  * when the IME is called by TranslateMessage(). This may cause an reentrancy issue when
3208  * the windows procedure processing the sent message call an IME function and leaves
3209  * the IME functionality in an unexpected state.
3210  * This function avoids reentrancy issue and must be used for sending of all IME messages
3211  * instead of SendMessage().
3212  */
3213 LRESULT AwtToolkit::InvokeInputMethodFunction(UINT msg, WPARAM wParam, LPARAM lParam) {
3214     CriticalSection::Lock lock(m_inputMethodLock);
3215     if (PostMessage(msg, wParam, lParam)) {
3216         ::WaitForSingleObject(m_inputMethodWaitEvent, INFINITE);
3217         return m_inputMethodData;
3218     }
3219     return 0;
3220 }
< prev index next >