зеркало из https://github.com/mozilla/pjs.git
Fixed key event support
This commit is contained in:
Родитель
6d4d3b4eb9
Коммит
0547d59b77
|
@ -1354,53 +1354,6 @@ BOOL nsWindow::CallMethod(MethodInfo *info)
|
||||||
return bRet;
|
return bRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// OnKey
|
|
||||||
//
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
PRBool nsWindow::OnKey(PRUint32 aEventType, PRBool aCalcCharCode, TCHAR aCharCode, UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
||||||
{
|
|
||||||
if (nChar == NS_VK_CAPS_LOCK ||
|
|
||||||
nChar == NS_VK_ALT ||
|
|
||||||
nChar == NS_VK_SHIFT ||
|
|
||||||
nChar == NS_VK_CONTROL) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsKeyEvent event;
|
|
||||||
nsPoint point;
|
|
||||||
|
|
||||||
point.x = 0;
|
|
||||||
point.y = 0;
|
|
||||||
|
|
||||||
InitEvent(event, aEventType, &point);
|
|
||||||
|
|
||||||
if (aCalcCharCode) {
|
|
||||||
// Now let windows do the conversion to the ascii code
|
|
||||||
WORD asciiChar = 0;
|
|
||||||
BYTE kbstate[256];
|
|
||||||
::GetKeyboardState(kbstate);
|
|
||||||
ToAscii(nChar, nFlags & 0xff, kbstate, &asciiChar, 0);
|
|
||||||
event.charCode = (char)asciiChar;
|
|
||||||
} else {
|
|
||||||
event.charCode = aCharCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.keyCode = nChar;
|
|
||||||
//printf("charCode %d keyCode %d\n", event.charCode, event.keyCode);
|
|
||||||
|
|
||||||
event.isShift = mIsShiftDown;
|
|
||||||
event.isControl = mIsControlDown;
|
|
||||||
event.isAlt = mIsAltDown;
|
|
||||||
event.eventStructType = NS_KEY_EVENT;
|
|
||||||
|
|
||||||
PRBool result = DispatchWindowEvent(&event);
|
|
||||||
NS_RELEASE(event.widget);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
void nsWindow::SetUpForPaint(HDC aHDC)
|
void nsWindow::SetUpForPaint(HDC aHDC)
|
||||||
{
|
{
|
||||||
|
@ -1821,6 +1774,309 @@ NS_METHOD nsWindow::EnableFileDrop(PRBool aEnable)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// OnKey
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
PRBool nsWindow::DispatchKeyEvent(PRUint32 aEventType, WORD aCharCode, UINT aVirtualCharCode)
|
||||||
|
{
|
||||||
|
nsKeyEvent event;
|
||||||
|
nsPoint point;
|
||||||
|
|
||||||
|
point.x = 0;
|
||||||
|
point.y = 0;
|
||||||
|
|
||||||
|
InitEvent(event, aEventType, &point); // this add ref's event.widget
|
||||||
|
|
||||||
|
event.charCode = aCharCode;
|
||||||
|
event.keyCode = aVirtualCharCode;
|
||||||
|
|
||||||
|
//printf("Type: %s charCode %d keyCode %d ", (aEventType == NS_KEY_UP?"Up":"Down"), event.charCode, event.keyCode);
|
||||||
|
//printf("Shift: %s Control %s Alt: %s \n", (mIsShiftDown?"D":"U"), (mIsControlDown?"D":"U"), (mIsAltDown?"D":"U"));
|
||||||
|
|
||||||
|
event.isShift = mIsShiftDown;
|
||||||
|
event.isControl = mIsControlDown;
|
||||||
|
event.isAlt = mIsAltDown;
|
||||||
|
event.eventStructType = NS_KEY_EVENT;
|
||||||
|
|
||||||
|
PRBool result = DispatchWindowEvent(&event);
|
||||||
|
NS_RELEASE(event.widget);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------
|
||||||
|
static BOOL IsKeypadKey(UINT vCode, long isExtended)
|
||||||
|
{
|
||||||
|
switch (vCode) {
|
||||||
|
case VK_HOME:
|
||||||
|
case VK_END:
|
||||||
|
case VK_PRIOR:
|
||||||
|
case VK_NEXT:
|
||||||
|
case VK_UP:
|
||||||
|
case VK_DOWN:
|
||||||
|
case VK_LEFT:
|
||||||
|
case VK_RIGHT:
|
||||||
|
case VK_CLEAR:
|
||||||
|
case VK_INSERT:
|
||||||
|
// extended are not keypad keys
|
||||||
|
if (isExtended)
|
||||||
|
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:
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// return
|
||||||
|
// EXTENDED_KEY for extended keys supported by java
|
||||||
|
// SPECIAL_KEY for extended keys
|
||||||
|
// DONT_PROCESS_KEY for extended keys of no interest (never exposed to java)
|
||||||
|
// STANDARD_KEY for standard keys
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
#define STANDARD_KEY 1
|
||||||
|
#define EXTENDED_KEY 2
|
||||||
|
#define SPECIAL_KEY 3
|
||||||
|
#define DONT_PROCESS_KEY 4
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
ULONG nsWindow::IsSpecialChar(UINT aVirtualKeyCode, WORD *aAsciiKey)
|
||||||
|
{
|
||||||
|
ULONG keyType = EXTENDED_KEY;
|
||||||
|
|
||||||
|
*aAsciiKey = 0;
|
||||||
|
|
||||||
|
// Process non-standard Control Keys
|
||||||
|
if (mIsControlDown && !mIsShiftDown && !mIsAltDown &&
|
||||||
|
((aVirtualKeyCode >= 0x30 && aVirtualKeyCode <= 0x39) || // 0-9
|
||||||
|
(aVirtualKeyCode >= 0xBA && aVirtualKeyCode <= 0xC0) || // ;=,-./` (semi-colon,equals,comma,dash,period,slash,back tick)
|
||||||
|
(aVirtualKeyCode == 0xDE))) { // ' (tick)
|
||||||
|
*aAsciiKey = aVirtualKeyCode;
|
||||||
|
return SPECIAL_KEY;
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("*********************** 0x%x\n", aVirtualKeyCode);
|
||||||
|
switch (aVirtualKeyCode) {
|
||||||
|
case VK_TAB:
|
||||||
|
case VK_HOME:
|
||||||
|
case VK_END:
|
||||||
|
case VK_PRIOR:
|
||||||
|
case VK_NEXT:
|
||||||
|
case VK_UP:
|
||||||
|
case VK_DOWN:
|
||||||
|
case VK_LEFT:
|
||||||
|
case VK_RIGHT:
|
||||||
|
case VK_F1:
|
||||||
|
case VK_F2:
|
||||||
|
case VK_F3:
|
||||||
|
case VK_F4:
|
||||||
|
case VK_F5:
|
||||||
|
case VK_F6:
|
||||||
|
case VK_F7:
|
||||||
|
case VK_F8:
|
||||||
|
case VK_F9:
|
||||||
|
case VK_F10:
|
||||||
|
case VK_F11:
|
||||||
|
case VK_F12:
|
||||||
|
*aAsciiKey = aVirtualKeyCode;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VK_DELETE:
|
||||||
|
*aAsciiKey = '\177';
|
||||||
|
keyType = SPECIAL_KEY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VK_RETURN:*aAsciiKey = '\n';
|
||||||
|
keyType = SPECIAL_KEY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VK_MENU:
|
||||||
|
keyType = DONT_PROCESS_KEY;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
keyType = STANDARD_KEY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return keyType;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// change the virtual key coming from windows into an ascii code
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
BOOL TranslateToAscii(BYTE *aKeyState,
|
||||||
|
UINT aVirtualKeyCode,
|
||||||
|
UINT aScanCode,
|
||||||
|
WORD *aAsciiKey)
|
||||||
|
{
|
||||||
|
WORD asciiBuf;
|
||||||
|
BOOL bIsExtended;
|
||||||
|
|
||||||
|
bIsExtended = TRUE;
|
||||||
|
*aAsciiKey = 0;
|
||||||
|
switch (aVirtualKeyCode) {
|
||||||
|
case VK_TAB:
|
||||||
|
case VK_HOME:
|
||||||
|
case VK_END:
|
||||||
|
case VK_PRIOR:
|
||||||
|
case VK_NEXT:
|
||||||
|
case VK_UP:
|
||||||
|
case VK_DOWN:
|
||||||
|
case VK_LEFT:
|
||||||
|
case VK_RIGHT:
|
||||||
|
case VK_F1:
|
||||||
|
case VK_F2:
|
||||||
|
case VK_F3:
|
||||||
|
case VK_F4:
|
||||||
|
case VK_F5:
|
||||||
|
case VK_F6:
|
||||||
|
case VK_F7:
|
||||||
|
case VK_F8:
|
||||||
|
case VK_F9:
|
||||||
|
case VK_F10:
|
||||||
|
case VK_F11:
|
||||||
|
case VK_F12:
|
||||||
|
*aAsciiKey = aVirtualKeyCode;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case VK_DELETE:
|
||||||
|
*aAsciiKey = '\177';
|
||||||
|
bIsExtended = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VK_RETURN:
|
||||||
|
*aAsciiKey = '\n';
|
||||||
|
bIsExtended = FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
bIsExtended = FALSE;
|
||||||
|
|
||||||
|
if (::ToAscii(aVirtualKeyCode, aScanCode, aKeyState, &asciiBuf, FALSE) == 1) {
|
||||||
|
*aAsciiKey = (char)asciiBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return bIsExtended;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
BOOL nsWindow::OnKeyDown( UINT aVirtualKeyCode, UINT aScanCode)
|
||||||
|
{
|
||||||
|
WORD asciiKey;
|
||||||
|
|
||||||
|
asciiKey = 0;
|
||||||
|
|
||||||
|
switch (IsSpecialChar(aVirtualKeyCode, &asciiKey)) {
|
||||||
|
case EXTENDED_KEY:
|
||||||
|
break;
|
||||||
|
|
||||||
|
// special keys don't generate an action but don't even go
|
||||||
|
// through WM_CHAR
|
||||||
|
case SPECIAL_KEY:
|
||||||
|
break;
|
||||||
|
|
||||||
|
// standard keys are processed through WM_CHAR
|
||||||
|
case STANDARD_KEY:
|
||||||
|
asciiKey = 0; // just to be paranoid
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("In OnKeyDown ascii %d virt: %d scan: %d\n", asciiKey, aVirtualKeyCode, aScanCode);
|
||||||
|
|
||||||
|
// if we enter this if statement we expect not to get a WM_CHAR
|
||||||
|
if (asciiKey) {
|
||||||
|
//printf("Dispatching Key Down [%d]\n", asciiKey);
|
||||||
|
DispatchKeyEvent(NS_KEY_DOWN, asciiKey, aVirtualKeyCode);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// always let the def proc process a WM_KEYDOWN
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
BOOL nsWindow::OnKeyUp( UINT aVirtualKeyCode, UINT aScanCode)
|
||||||
|
{
|
||||||
|
WORD asciiKey;
|
||||||
|
|
||||||
|
asciiKey = 0;
|
||||||
|
|
||||||
|
switch (IsSpecialChar(aVirtualKeyCode, &asciiKey)) {
|
||||||
|
case EXTENDED_KEY:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STANDARD_KEY: {
|
||||||
|
BYTE keyState[256];
|
||||||
|
::GetKeyboardState(keyState);
|
||||||
|
::ToAscii(aVirtualKeyCode, aScanCode, keyState, &asciiKey, FALSE);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case SPECIAL_KEY:
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // switch
|
||||||
|
|
||||||
|
if (asciiKey) {
|
||||||
|
//printf("Dispatching Key Up [%d]\n", asciiKey);
|
||||||
|
DispatchKeyEvent(NS_KEY_UP, asciiKey, aVirtualKeyCode);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// always let the def proc process a WM_KEYUP
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
BOOL nsWindow::OnChar( UINT aVirtualKeyCode )
|
||||||
|
{
|
||||||
|
|
||||||
|
// if we get a '\n', ignore it because we already processed it in OnKeyDown.
|
||||||
|
// This is the safest assumption since not always pressing enter produce a WM_CHAR
|
||||||
|
//if (IsDBCSLeadByte(aVirtualKeyCode) || aVirtualKeyCode == 0xD /*'\n'*/ ) {
|
||||||
|
// return FALSE;
|
||||||
|
//}
|
||||||
|
//printf("OnChar (KeyDown) %d\n", aVirtualKeyCode);
|
||||||
|
|
||||||
|
DispatchKeyEvent(NS_KEY_DOWN, aVirtualKeyCode, aVirtualKeyCode);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Process all nsWindows messages
|
// Process all nsWindows messages
|
||||||
|
@ -1925,48 +2181,46 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
|
||||||
result = OnPaint();
|
result = OnPaint();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_SYSCHAR:
|
||||||
case WM_CHAR:
|
case WM_CHAR:
|
||||||
printf("Doing WM_CHAR\n");
|
|
||||||
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
||||||
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
||||||
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
||||||
|
|
||||||
if (!mIMEIsComposing)
|
if (!mIMEIsComposing)
|
||||||
result = OnKey(NS_KEY_DOWN, FALSE, wParam, vkKeyCached, LOWORD(lParam), HIWORD(lParam));
|
result = OnChar(wParam);
|
||||||
else
|
else
|
||||||
result = PR_FALSE;
|
result = PR_FALSE;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Let ths fall through if it isn't a key pad
|
||||||
|
case WM_SYSKEYUP:
|
||||||
|
// if it's a keypad key don't process a WM_CHAR will come or...oh well...
|
||||||
|
if (IsKeypadKey(wParam, lParam & 0x01000000)) {
|
||||||
|
result = PR_TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
||||||
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
||||||
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
||||||
|
|
||||||
if (!mIMEIsComposing)
|
if (!mIMEIsComposing)
|
||||||
result = OnKey(NS_KEY_UP, TRUE, 0, wParam, LOWORD(lParam), HIWORD(lParam));
|
result = OnKeyUp(wParam, (HIWORD(lParam) & 0xFF));
|
||||||
else
|
else
|
||||||
result = PR_FALSE;
|
result = PR_FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
case WM_KEYDOWN: {
|
||||||
{
|
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
||||||
// Cache the key code when it is regular chars
|
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
||||||
vkKeyCached = (UINT)wParam;
|
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
||||||
|
|
||||||
// Tab and return keys do not generate WM_CHAR events
|
if (!mIMEIsComposing)
|
||||||
if (vkKeyCached == 9 ||
|
result = OnKeyDown(wParam, (HIWORD(lParam) & 0xFF));
|
||||||
vkKeyCached == 13) {
|
else
|
||||||
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
|
result = PR_FALSE;
|
||||||
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
|
|
||||||
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
|
|
||||||
if (!mIMEIsComposing)
|
|
||||||
result = OnKey(NS_KEY_DOWN, TRUE, 0, wParam, LOWORD(lParam), HIWORD(lParam));
|
|
||||||
else
|
|
||||||
result = PR_FALSE;
|
|
||||||
} else {
|
|
||||||
//these are handled by WM_CHAR
|
|
||||||
result = PR_FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2330,7 +2584,7 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT
|
||||||
kIClipboardIID,
|
kIClipboardIID,
|
||||||
(nsISupports **)&clipboard);
|
(nsISupports **)&clipboard);
|
||||||
clipboard->EmptyClipboard();
|
clipboard->EmptyClipboard();
|
||||||
NS_RELEASE(clipboard);
|
nsServiceManager::ReleaseService(kCClipboardCID, clipboard);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,7 +164,12 @@ protected:
|
||||||
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
|
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
|
||||||
virtual PRBool OnPaint();
|
virtual PRBool OnPaint();
|
||||||
virtual PRBool OnResize(nsRect &aWindowRect);
|
virtual PRBool OnResize(nsRect &aWindowRect);
|
||||||
virtual PRBool OnKey(PRUint32 aEventType, PRBool aCalcCharCode, TCHAR aCharCode, UINT nChar, UINT nRepCnt, UINT nFlags);
|
|
||||||
|
BOOL OnChar(UINT aVirtualKeyCode);
|
||||||
|
BOOL OnKeyDown( UINT aVirtualKeyCode, UINT aScanCode);
|
||||||
|
BOOL OnKeyUp( UINT aVirtualKeyCode, UINT aScanCode);
|
||||||
|
ULONG IsSpecialChar(UINT aVirtualKeyCode, WORD *aAsciiKey);
|
||||||
|
virtual PRBool DispatchKeyEvent(PRUint32 aEventType, WORD aCharCode, UINT aVirtualCharCode);
|
||||||
|
|
||||||
virtual PRBool DispatchFocus(PRUint32 aEventType);
|
virtual PRBool DispatchFocus(PRUint32 aEventType);
|
||||||
virtual PRBool OnScroll(UINT scrollCode, int cPos);
|
virtual PRBool OnScroll(UINT scrollCode, int cPos);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче