зеркало из https://github.com/mozilla/gecko-dev.git
#140983 [regression]SC IME doesn't work properly and JA IME works wrong
If windows code page is 936 (simplified chinese), check IME's support of unicode using GetProperty. p=yokoyama, r=shanjian, sr=kin check in for roy by shanjian
This commit is contained in:
Родитель
a91955185f
Коммит
43dfeac81f
|
@ -55,6 +55,7 @@ static PRUintn gToolkitTLSIndex = 0;
|
||||||
|
|
||||||
HINSTANCE nsToolkit::mDllInstance = 0;
|
HINSTANCE nsToolkit::mDllInstance = 0;
|
||||||
PRBool nsToolkit::mUseImeApiW = PR_FALSE;
|
PRBool nsToolkit::mUseImeApiW = PR_FALSE;
|
||||||
|
PRBool nsToolkit::mW2KXP_CP936 = PR_FALSE;
|
||||||
|
|
||||||
#ifdef MOZ_AIMM
|
#ifdef MOZ_AIMM
|
||||||
IActiveIMMApp* nsToolkit::gAIMMApp = NULL;
|
IActiveIMMApp* nsToolkit::gAIMMApp = NULL;
|
||||||
|
@ -248,8 +249,10 @@ nsToolkit::Startup(HMODULE hModule)
|
||||||
// XXX Hack for stopping the crash (125573)
|
// XXX Hack for stopping the crash (125573)
|
||||||
if (osversion.dwMajorVersion == 5 && (osversion.dwMinorVersion == 0 || osversion.dwMinorVersion == 1)) {
|
if (osversion.dwMajorVersion == 5 && (osversion.dwMinorVersion == 0 || osversion.dwMinorVersion == 1)) {
|
||||||
// "Microsoft Windows 2000 " or "Microsoft Windows XP "
|
// "Microsoft Windows 2000 " or "Microsoft Windows XP "
|
||||||
if (936 == ::GetACP()) // Chinese (PRC, Singapore)
|
if (936 == ::GetACP()) { // Chinese (PRC, Singapore)
|
||||||
nsToolkit::mUseImeApiW = PR_FALSE;
|
nsToolkit::mUseImeApiW = PR_FALSE;
|
||||||
|
nsToolkit::mW2KXP_CP936 = PR_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,7 @@ public:
|
||||||
static HINSTANCE mDllInstance;
|
static HINSTANCE mDllInstance;
|
||||||
// OS flag
|
// OS flag
|
||||||
static PRBool mUseImeApiW;
|
static PRBool mUseImeApiW;
|
||||||
|
static PRBool mW2KXP_CP936;
|
||||||
|
|
||||||
static void Startup(HINSTANCE hModule);
|
static void Startup(HINSTANCE hModule);
|
||||||
static void Shutdown();
|
static void Shutdown();
|
||||||
|
|
|
@ -350,6 +350,16 @@ static PRBool is_vk_down(int vk)
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NS_IMM_GETPROPERTY(hKL, dwIndex, dwProp) \
|
||||||
|
{ \
|
||||||
|
if (nsToolkit::gAIMMApp) \
|
||||||
|
nsToolkit::gAIMMApp->GetProperty(hKL, dwIndex, &(dwProp)); \
|
||||||
|
else { \
|
||||||
|
nsIMM& theIMM = nsIMM::LoadModule(); \
|
||||||
|
dwProp = (DWORD)theIMM.GetProperty(hKL, dwIndex); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !MOZ_AIMM */
|
#else /* !MOZ_AIMM */
|
||||||
|
|
||||||
#define NS_IMM_GETCOMPOSITIONSTRING(hIMC, dwIndex, pBuf, dwBufLen, compStrLen) \
|
#define NS_IMM_GETCOMPOSITIONSTRING(hIMC, dwIndex, pBuf, dwBufLen, compStrLen) \
|
||||||
|
@ -400,6 +410,12 @@ static PRBool is_vk_down(int vk)
|
||||||
theIMM.SetConversionStatus(hIMC, (lpfdwConversion), (lpfdwSentence)); \
|
theIMM.SetConversionStatus(hIMC, (lpfdwConversion), (lpfdwSentence)); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NS_IMM_GETPROPERTY(hKL, dwIndex, dwProp) \
|
||||||
|
{ \
|
||||||
|
nsIMM& theIMM = nsIMM::LoadModule(); \
|
||||||
|
dwProp = (DWORD)theIMM.GetProperty(hKL, dwIndex); \
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* MOZ_AIMM */
|
#endif /* MOZ_AIMM */
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -630,6 +646,12 @@ nsWindow::nsWindow() : nsBaseWidget()
|
||||||
gbInitGlobalValue = TRUE;
|
gbInitGlobalValue = TRUE;
|
||||||
gKeyboardLayout = GetKeyboardLayout(0);
|
gKeyboardLayout = GetKeyboardLayout(0);
|
||||||
LangIDToCP((WORD)(0x0FFFFL & (DWORD)gKeyboardLayout), gCurrentKeyboardCP);
|
LangIDToCP((WORD)(0x0FFFFL & (DWORD)gKeyboardLayout), gCurrentKeyboardCP);
|
||||||
|
|
||||||
|
if (nsToolkit::mW2KXP_CP936) {
|
||||||
|
DWORD imeProp = 0;
|
||||||
|
NS_IMM_GETPROPERTY(gKeyboardLayout, IGP_PROPERTY, imeProp);
|
||||||
|
nsToolkit::mUseImeApiW = (imeProp & IME_PROP_UNICODE) ? PR_TRUE : PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reconvert message for Windows 95 / NT 4.0
|
// Reconvert message for Windows 95 / NT 4.0
|
||||||
|
@ -5427,6 +5449,11 @@ BOOL nsWindow::OnInputLangChange(HKL aHKL, LRESULT *oRetValue)
|
||||||
gKeyboardLayout = aHKL;
|
gKeyboardLayout = aHKL;
|
||||||
*oRetValue = LangIDToCP((WORD)((DWORD)gKeyboardLayout & 0x0FFFF),
|
*oRetValue = LangIDToCP((WORD)((DWORD)gKeyboardLayout & 0x0FFFF),
|
||||||
gCurrentKeyboardCP);
|
gCurrentKeyboardCP);
|
||||||
|
if (nsToolkit::mW2KXP_CP936) {
|
||||||
|
DWORD imeProp = 0;
|
||||||
|
NS_IMM_GETPROPERTY(gKeyboardLayout, IGP_PROPERTY, imeProp);
|
||||||
|
nsToolkit::mUseImeApiW = (imeProp & IME_PROP_UNICODE) ? PR_TRUE : PR_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ResetInputState();
|
ResetInputState();
|
||||||
|
|
|
@ -84,6 +84,7 @@ class nsIMM
|
||||||
typedef LONG (CALLBACK *NotifyIMEPtr) (HIMC,DWORD,DWORD,DWORD);
|
typedef LONG (CALLBACK *NotifyIMEPtr) (HIMC,DWORD,DWORD,DWORD);
|
||||||
typedef LONG (CALLBACK *SetCandWindowPtr) (HIMC,LPCANDIDATEFORM);
|
typedef LONG (CALLBACK *SetCandWindowPtr) (HIMC,LPCANDIDATEFORM);
|
||||||
typedef LONG (CALLBACK *GetCompWindowPtr) (HIMC,LPCOMPOSITIONFORM);
|
typedef LONG (CALLBACK *GetCompWindowPtr) (HIMC,LPCOMPOSITIONFORM);
|
||||||
|
typedef LONG (CALLBACK *GetPropertyPtr) (HKL, DWORD);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -122,6 +123,9 @@ public:
|
||||||
|
|
||||||
mGetCompositionWindow=(mInstance) ? (GetCompWindowPtr)GetProcAddress(mInstance,"ImmGetCompositionWindow") : 0;
|
mGetCompositionWindow=(mInstance) ? (GetCompWindowPtr)GetProcAddress(mInstance,"ImmGetCompositionWindow") : 0;
|
||||||
NS_ASSERTION(mGetCompositionWindow!=NULL,"nsIMM.ImmGetCompositionWindow failed.");
|
NS_ASSERTION(mGetCompositionWindow!=NULL,"nsIMM.ImmGetCompositionWindow failed.");
|
||||||
|
|
||||||
|
mGetProperty=(mInstance) ? (GetPropertyPtr)GetProcAddress(mInstance,"ImmGetProperty") : 0;
|
||||||
|
NS_ASSERTION(mGetProperty!=NULL,"nsIMM.ImmGetProperty failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
~nsIMM() {
|
~nsIMM() {
|
||||||
|
@ -137,6 +141,7 @@ public:
|
||||||
mNotifyIME=0;
|
mNotifyIME=0;
|
||||||
mSetCandiateWindow=0;
|
mSetCandiateWindow=0;
|
||||||
mGetCompositionWindow=0;
|
mGetCompositionWindow=0;
|
||||||
|
mGetProperty=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LONG GetCompositionStringA(HIMC h,DWORD d1,LPVOID v,DWORD d2) {
|
LONG GetCompositionStringA(HIMC h,DWORD d1,LPVOID v,DWORD d2) {
|
||||||
|
@ -175,6 +180,10 @@ public:
|
||||||
return (mGetCompositionWindow) ? mGetCompositionWindow(h,l) : 0L;
|
return (mGetCompositionWindow) ? mGetCompositionWindow(h,l) : 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LONG GetProperty(HKL hKL, DWORD dwIndex) {
|
||||||
|
return (mGetProperty) ? mGetProperty(hKL, dwIndex) : 0L;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
HINSTANCE mInstance;
|
HINSTANCE mInstance;
|
||||||
|
@ -187,6 +196,7 @@ private:
|
||||||
NotifyIMEPtr mNotifyIME;
|
NotifyIMEPtr mNotifyIME;
|
||||||
SetCandWindowPtr mSetCandiateWindow;
|
SetCandWindowPtr mSetCandiateWindow;
|
||||||
GetCompWindowPtr mGetCompositionWindow;
|
GetCompWindowPtr mGetCompositionWindow;
|
||||||
|
GetPropertyPtr mGetProperty;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Загрузка…
Ссылка в новой задаче