diff --git a/panda/src/windisplay/winGraphicsWindow.cxx b/panda/src/windisplay/winGraphicsWindow.cxx index ec44280568..aea06f9441 100644 --- a/panda/src/windisplay/winGraphicsWindow.cxx +++ b/panda/src/windisplay/winGraphicsWindow.cxx @@ -1071,10 +1071,10 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { #endif if (ImmSetCompositionWindow(hIMC, &comf)) - windisplay_cat.debug() << "comf success\n"; + windisplay_cat.debug() << "set composition form: success\n"; for (int i=0; i<3; ++i) { if (ImmSetCandidateWindow(hIMC, &canf)) - windisplay_cat.debug() << "canf success\n"; + windisplay_cat.debug() << "set candidate form: success\n"; canf.dwIndex++; } } @@ -1125,8 +1125,7 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { break; case WM_IME_COMPOSITION: - if (lparam & GCS_RESULTSTR) { - + if (ime_aware) { // If the ime window is not marked as active at this point, we // must be in the process of closing it down (in close_ime), and // we don't want to send the current composition string in that @@ -1139,6 +1138,11 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { static const int max_ime_result = 128; static char ime_result[max_ime_result]; + DWORD result_size = 0; + const int max_t = 256; + wchar_t can_t[max_t]; + size_t cursor_pos, delta_start; + if (_ime_composition_w) { // Since ImmGetCompositionStringA() doesn't seem to work // for Win2000 (it always returns question mark @@ -1146,95 +1150,87 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // on this OS. This is actually the easier of the two // functions to use. - DWORD result_size = - ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, - ime_result, max_ime_result); + if (lparam & GCS_RESULTSTR) { + windisplay_cat.debug() << "GCS_RESULTSTR\n"; + result_size = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, + ime_result, max_ime_result); - // Add this string into the text buffer of the application. + // Add this string into the text buffer of the application. - // ImmGetCompositionStringW() returns a string, but it's - // filled in with wstring data: every two characters defines a - // 16-bit unicode char. The docs aren't clear on the - // endianness of this. I guess it's safe to assume all Win32 - // machines are little-endian. - for (DWORD i = 0; i < result_size; i += 2) { - int result = - ((int)(unsigned char)ime_result[i + 1] << 8) | - (unsigned char)ime_result[i]; - _input_devices[0].keystroke(result); + // ImmGetCompositionStringW() returns a string, but it's + // filled in with wstring data: every two characters defines a + // 16-bit unicode char. The docs aren't clear on the + // endianness of this. I guess it's safe to assume all Win32 + // machines are little-endian. + for (DWORD i = 0; i < result_size; i += 2) { + int result = + ((int)(unsigned char)ime_result[i + 1] << 8) | + (unsigned char)ime_result[i]; + _input_devices[0].keystroke(result); + } + } + if (lparam & GCS_COMPSTR) { + windisplay_cat.debug() << "GCS_COMPSTR\n"; + /* + result_size = ImmGetCompositionStringW(hIMC, GCS_COMPREADSTR, can_t, max_t); + windisplay_cat.debug() << "got readstr of size " << result_size << endl; + */ + + result_size = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, can_t, max_t); + cursor_pos = result_size&0xffff; + windisplay_cat.debug() << "got cursorpos at " << cursor_pos << endl; + + result_size = ImmGetCompositionStringW(hIMC, GCS_DELTASTART, can_t, max_t); + delta_start = result_size&0xffff; + windisplay_cat.debug() << "got deltastart at " << delta_start << endl; + + /* + result_size = ImmGetCompositionStringW(hIMC, GCS_COMPATTR, can_t, max_t); + windisplay_cat.debug() << "got compatr of size " << result_size << endl; + + result_size = ImmGetCompositionStringW(hIMC, GCS_COMPREADSTR, can_t, max_t); + windisplay_cat.debug() << "got compreadstr of size " << result_size << endl; + + result_size = ImmGetCompositionStringW(hIMC, GCS_COMPCLAUSE, can_t, max_t); + windisplay_cat.debug() << "got compclause of size " << result_size << endl; + */ + + result_size = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, can_t, max_t); + windisplay_cat.debug() << "got compstr of size " << result_size << endl; + + can_t[result_size/sizeof(wchar_t)] = '\0'; + + _input_devices[0].candidate(can_t, min(cursor_pos, delta_start), max(cursor_pos, delta_start), cursor_pos); } } else { - // On the other hand, ImmGetCompositionStringW() doesn't - // work on Win95 or Win98; for these OS's we must use - // ImmGetCompositionStringA(). - DWORD result_size = - ImmGetCompositionStringA(hIMC, GCS_RESULTSTR, - ime_result, max_ime_result); + if (lparam & GCS_RESULTSTR) { + // On the other hand, ImmGetCompositionStringW() doesn't + // work on Win95 or Win98; for these OS's we must use + // ImmGetCompositionStringA(). + result_size = ImmGetCompositionStringA(hIMC, GCS_RESULTSTR, + ime_result, max_ime_result); - // ImmGetCompositionStringA() returns an encoded ANSI - // string, which we now have to map to wide-character - // Unicode. - static const int max_wide_result = 128; - static wchar_t wide_result[max_wide_result]; + // ImmGetCompositionStringA() returns an encoded ANSI + // string, which we now have to map to wide-character + // Unicode. + static const int max_wide_result = 128; + static wchar_t wide_result[max_wide_result]; - int wide_size = - MultiByteToWideChar(CP_ACP, 0, - ime_result, result_size, - wide_result, max_wide_result); - if (wide_size == 0) { - show_error_message(); - } - for (int i = 0; i < wide_size; i++) { - _input_devices[0].keystroke(wide_result[i]); + int wide_size = + MultiByteToWideChar(CP_ACP, 0, + ime_result, result_size, + wide_result, max_wide_result); + if (wide_size == 0) { + show_error_message(); + } + for (int i = 0; i < wide_size; i++) { + _input_devices[0].keystroke(wide_result[i]); + } } } ImmReleaseContext(hwnd, hIMC); } - return 0; - } - //else if (0) { - else if (lparam & GCS_COMPSTR && ime_aware) { - HIMC hIMC = ImmGetContext(hwnd); - nassertr(hIMC != 0, 0); - - const int max_t = 256; - wchar_t can_t[max_t]; - DWORD result_size = 0; - size_t cursor_pos, delta_start; - - /* - result_size = ImmGetCompositionStringW(hIMC, GCS_COMPREADSTR, can_t, max_t); - windisplay_cat.debug() << "got readstr of size " << result_size << endl; - */ - - result_size = ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, can_t, max_t); - cursor_pos = result_size&0xffff; - windisplay_cat.debug() << "got cursorpos at " << cursor_pos << endl; - - result_size = ImmGetCompositionStringW(hIMC, GCS_DELTASTART, can_t, max_t); - delta_start = result_size&0xffff; - windisplay_cat.debug() << "got deltastart at " << delta_start << endl; - - /* - result_size = ImmGetCompositionStringW(hIMC, GCS_COMPATTR, can_t, max_t); - windisplay_cat.debug() << "got compatr of size " << result_size << endl; - - result_size = ImmGetCompositionStringW(hIMC, GCS_COMPREADSTR, can_t, max_t); - windisplay_cat.debug() << "got compreadstr of size " << result_size << endl; - - result_size = ImmGetCompositionStringW(hIMC, GCS_COMPCLAUSE, can_t, max_t); - windisplay_cat.debug() << "got compclause of size " << result_size << endl; - */ - - result_size = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, can_t, max_t); - windisplay_cat.debug() << "got compstr of size " << result_size << endl; - - can_t[result_size/sizeof(wchar_t)] = '\0'; - - _input_devices[0].candidate(can_t, min(cursor_pos, delta_start), max(cursor_pos, delta_start), cursor_pos); - - ImmReleaseContext(hwnd, hIMC); } break;