зеркало из https://github.com/mozilla/pjs.git
Bug 339723 Ctrl++ doesn't work with JIS keyboard (second patch, this fixes Bug 341308 Tilde (~) key broken when using German keyboard layout, Bug 342197 Can't type '}' with a french keyboard) r=ere, sr=roc
This commit is contained in:
Родитель
bf7f65b370
Коммит
e64d53f989
|
@ -3324,18 +3324,21 @@ PRBool nsWindow::DispatchKeyEvent(PRUint32 aEventType, WORD aCharCode, UINT aVir
|
|||
BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
||||
{
|
||||
gKbdLayout.OnKeyDown (aVirtualKeyCode);
|
||||
|
||||
UINT virtualKeyCode = sIMEIsComposing ? aVirtualKeyCode : MapFromNativeToDOM(aVirtualKeyCode);
|
||||
|
||||
// Use only DOMKeyCode for XP processing.
|
||||
// Use aVirtualKeyCode for gKbdLayout and native processing.
|
||||
UINT DOMKeyCode = sIMEIsComposing ?
|
||||
aVirtualKeyCode : MapFromNativeToDOM(aVirtualKeyCode);
|
||||
|
||||
#ifdef DEBUG
|
||||
//printf("In OnKeyDown virt: %d scan: %d\n", virtualKeyCode, aScanCode);
|
||||
//printf("In OnKeyDown virt: %d scan: %d\n", DOMKeyCode, aScanCode);
|
||||
#endif
|
||||
|
||||
BOOL noDefault = DispatchKeyEvent(NS_KEY_DOWN, 0, virtualKeyCode, aKeyData);
|
||||
BOOL noDefault = DispatchKeyEvent(NS_KEY_DOWN, 0, DOMKeyCode, aKeyData);
|
||||
|
||||
// If we won't be getting a WM_CHAR, WM_SYSCHAR or WM_DEADCHAR, synthesize a keypress
|
||||
// for almost all keys
|
||||
switch (virtualKeyCode) {
|
||||
switch (DOMKeyCode) {
|
||||
case NS_VK_SHIFT:
|
||||
case NS_VK_CONTROL:
|
||||
case NS_VK_ALT:
|
||||
|
@ -3345,25 +3348,21 @@ BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
|||
}
|
||||
|
||||
PRUint32 extraFlags = (noDefault ? NS_EVENT_FLAG_NO_DEFAULT : 0);
|
||||
|
||||
MSG msg;
|
||||
BOOL gotMsg = ::PeekMessageW(&msg, mWnd, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE | PM_NOYIELD);
|
||||
PRBool anyCharMessagesRemoved = PR_FALSE;
|
||||
// Enter and backspace are always handled here to avoid for example the
|
||||
// confusion between ctrl-enter and ctrl-J.
|
||||
// Ctrl+[Add, Subtract] are always handled here to make text zoom shortcuts work
|
||||
// on different keyboard layouts.
|
||||
if (virtualKeyCode == NS_VK_RETURN || virtualKeyCode == NS_VK_BACK ||
|
||||
(mIsControlDown && !mIsAltDown && !mIsShiftDown &&
|
||||
(virtualKeyCode == NS_VK_ADD || virtualKeyCode == NS_VK_SUBTRACT)) ||
|
||||
((mIsControlDown || mIsAltDown) && KeyboardLayout::IsPrintableCharKey (aVirtualKeyCode)))
|
||||
if (DOMKeyCode == NS_VK_RETURN || DOMKeyCode == NS_VK_BACK ||
|
||||
((mIsControlDown || mIsAltDown) &&
|
||||
KeyboardLayout::IsPrintableCharKey(aVirtualKeyCode)))
|
||||
{
|
||||
// Remove a possible WM_CHAR or WM_SYSCHAR messages from the message queue.
|
||||
// They can be more than one because of:
|
||||
// * Dead-keys not pairing with base character
|
||||
// * Some keyboard layouts may map up to 4 characters to the single key
|
||||
|
||||
PRBool anyCharMessagesRemoved = PR_FALSE;
|
||||
|
||||
|
||||
while (gotMsg && (msg.message == WM_CHAR || msg.message == WM_SYSCHAR))
|
||||
{
|
||||
::GetMessageW(&msg, mWnd, WM_KEYFIRST, WM_KEYLAST);
|
||||
|
@ -3372,7 +3371,7 @@ BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
|||
gotMsg = ::PeekMessageW (&msg, mWnd, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE | PM_NOYIELD);
|
||||
}
|
||||
|
||||
if (!anyCharMessagesRemoved && virtualKeyCode == NS_VK_BACK) {
|
||||
if (!anyCharMessagesRemoved && DOMKeyCode == NS_VK_BACK) {
|
||||
MSG imeStartCompositionMsg, imeCompositionMsg;
|
||||
if (::PeekMessageW(&imeStartCompositionMsg, mWnd, WM_IME_STARTCOMPOSITION, WM_IME_STARTCOMPOSITION, PM_NOREMOVE | PM_NOYIELD)
|
||||
&& ::PeekMessageW(&imeCompositionMsg, mWnd, WM_IME_COMPOSITION, WM_IME_COMPOSITION, PM_NOREMOVE | PM_NOYIELD)
|
||||
|
@ -3435,23 +3434,25 @@ BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
|||
PRUint32 numOfUniChars = 0;
|
||||
PRUint32 numOfShiftStates = 0;
|
||||
|
||||
switch (virtualKeyCode) {
|
||||
switch (aVirtualKeyCode) {
|
||||
// keys to be sent as characters
|
||||
case NS_VK_ADD: uniChars [0] = '+'; numOfUniChars = 1; break;
|
||||
case NS_VK_SUBTRACT: uniChars [0] = '-'; numOfUniChars = 1; break;
|
||||
case NS_VK_DIVIDE: uniChars [0] = '/'; numOfUniChars = 1; break;
|
||||
case NS_VK_MULTIPLY: uniChars [0] = '*'; numOfUniChars = 1; break;
|
||||
case NS_VK_NUMPAD0:
|
||||
case NS_VK_NUMPAD1:
|
||||
case NS_VK_NUMPAD2:
|
||||
case NS_VK_NUMPAD3:
|
||||
case NS_VK_NUMPAD4:
|
||||
case NS_VK_NUMPAD5:
|
||||
case NS_VK_NUMPAD6:
|
||||
case NS_VK_NUMPAD7:
|
||||
case NS_VK_NUMPAD8:
|
||||
case NS_VK_NUMPAD9: uniChars [0] = virtualKeyCode - NS_VK_NUMPAD0 + '0'; numOfUniChars = 1; break;
|
||||
|
||||
case VK_ADD: uniChars [0] = '+'; numOfUniChars = 1; break;
|
||||
case VK_SUBTRACT: uniChars [0] = '-'; numOfUniChars = 1; break;
|
||||
case VK_DIVIDE: uniChars [0] = '/'; numOfUniChars = 1; break;
|
||||
case VK_MULTIPLY: uniChars [0] = '*'; numOfUniChars = 1; break;
|
||||
case VK_NUMPAD0:
|
||||
case VK_NUMPAD1:
|
||||
case VK_NUMPAD2:
|
||||
case VK_NUMPAD3:
|
||||
case VK_NUMPAD4:
|
||||
case VK_NUMPAD5:
|
||||
case VK_NUMPAD6:
|
||||
case VK_NUMPAD7:
|
||||
case VK_NUMPAD8:
|
||||
case VK_NUMPAD9:
|
||||
uniChars [0] = aVirtualKeyCode - VK_NUMPAD0 + '0';
|
||||
numOfUniChars = 1;
|
||||
break;
|
||||
default:
|
||||
if (KeyboardLayout::IsPrintableCharKey (aVirtualKeyCode))
|
||||
numOfUniChars = numOfShiftStates = gKbdLayout.GetUniChars (uniChars, shiftStates, NS_ARRAY_LENGTH (uniChars));
|
||||
|
@ -3463,20 +3464,35 @@ BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
|||
// numbers 0..9, ignoring the real characters returned by active keyboard layout.
|
||||
// This is required to make sure that all shortcut keys (e.g. Ctrl+c, Ctrl+1, Alt+f)
|
||||
// work the same way no matter what keyboard layout you are using.
|
||||
// Currently it is impossible to use non-latin characters for keyboard shortcuts.
|
||||
|
||||
if ((NS_VK_0 <= virtualKeyCode && virtualKeyCode <= NS_VK_9) ||
|
||||
(NS_VK_A <= virtualKeyCode && virtualKeyCode <= NS_VK_Z))
|
||||
if ((NS_VK_0 <= DOMKeyCode && DOMKeyCode <= NS_VK_9) ||
|
||||
(NS_VK_A <= DOMKeyCode && DOMKeyCode <= NS_VK_Z))
|
||||
{
|
||||
uniChars [0] = virtualKeyCode;
|
||||
uniChars [0] = DOMKeyCode;
|
||||
numOfUniChars = 1;
|
||||
numOfShiftStates = 0;
|
||||
|
||||
|
||||
// For letters take the Shift state into account
|
||||
if (!mIsShiftDown &&
|
||||
NS_VK_A <= virtualKeyCode && virtualKeyCode <= NS_VK_Z)
|
||||
NS_VK_A <= DOMKeyCode && DOMKeyCode <= NS_VK_Z)
|
||||
uniChars [0] += 0x20;
|
||||
}
|
||||
else if (!anyCharMessagesRemoved && DOMKeyCode != aVirtualKeyCode) {
|
||||
switch (DOMKeyCode) {
|
||||
case NS_VK_ADD:
|
||||
uniChars [0] = '+'; numOfUniChars = 1; break;
|
||||
case NS_VK_SUBTRACT:
|
||||
uniChars [0] = '-'; numOfUniChars = 1; break;
|
||||
case NS_VK_SEMICOLON:
|
||||
// XXXmnakano I don't know whether this is correct.
|
||||
uniChars [0] = ';';
|
||||
uniChars [1] = ':';
|
||||
numOfUniChars = 2;
|
||||
break;
|
||||
default:
|
||||
NS_ERROR("implement me!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3498,7 +3514,7 @@ BOOL nsWindow::OnKeyDown(UINT aVirtualKeyCode, UINT aScanCode, LPARAM aKeyData)
|
|||
DispatchKeyEvent(NS_KEY_PRESS, uniChars [cnt], 0, aKeyData, extraFlags);
|
||||
}
|
||||
} else
|
||||
DispatchKeyEvent(NS_KEY_PRESS, 0, virtualKeyCode, aKeyData, extraFlags);
|
||||
DispatchKeyEvent(NS_KEY_PRESS, 0, DOMKeyCode, aKeyData, extraFlags);
|
||||
|
||||
return noDefault;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче