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 }
|