Bug 731878 part.3 Set modifiers and buttons of nsMouseEvent on Windows r=jimm

This commit is contained in:
Masayuki Nakano 2012-04-25 12:00:01 +09:00
parent a3a57bb16c
commit 423cee2da1
3 changed files with 97 additions and 21 deletions

View File

@ -201,10 +201,9 @@ nsNativeDragTarget::DispatchDragDropEvent(PRUint32 aEventType, POINTL aPT)
event.refPoint.y = 0;
}
event.isShift = IsKeyDown(NS_VK_SHIFT);
event.isControl = IsKeyDown(NS_VK_CONTROL);
event.isMeta = false;
event.isAlt = IsKeyDown(NS_VK_ALT);
nsModifierKeyState modifierKeyState;
modifierKeyState.InitInputEvent(event);
event.inputSource = static_cast<nsBaseDragService*>(mDragService)->GetInputSource();
mWindow->DispatchEvent(&event, status);

View File

@ -3795,10 +3795,8 @@ bool nsWindow::DispatchMouseEvent(PRUint32 aEventType, WPARAM wParam,
InitEvent(event, &eventPoint);
}
event.isShift = IS_VK_DOWN(NS_VK_SHIFT);
event.isControl = IS_VK_DOWN(NS_VK_CONTROL);
event.isMeta = false;
event.isAlt = IS_VK_DOWN(NS_VK_ALT);
nsModifierKeyState modifierKeyState;
modifierKeyState.InitInputEvent(event);
event.button = aButton;
event.inputSource = aInputSource;
@ -5086,6 +5084,8 @@ bool nsWindow::ProcessMessage(UINT msg, WPARAM &wParam, LPARAM &lParam,
nsMouseEvent event(true, NS_MOUSE_ACTIVATE, this,
nsMouseEvent::eReal);
InitEvent(event);
nsModifierKeyState modifierKeyState;
modifierKeyState.InitInputEvent(event);
DispatchWindowEvent(&event);
if (sSwitchKeyboardLayout && mLastKeyboardLayout)
ActivateKeyboardLayout(mLastKeyboardLayout, 0);
@ -6153,6 +6153,8 @@ bool nsWindow::OnTouch(WPARAM wParam, LPARAM lParam)
touchPoint.ScreenToClient(mWnd);
nsMozTouchEvent touchEvent(true, msg, this, pInputs[i].dwID);
nsModifierKeyState modifierKeyState;
modifierKeyState.InitInputEvent(touchEvent);
touchEvent.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
touchEvent.refPoint = touchPoint;
@ -6219,10 +6221,8 @@ bool nsWindow::OnGesture(WPARAM wParam, LPARAM lParam)
}
// Polish up and send off the new event
event.isShift = IS_VK_DOWN(NS_VK_SHIFT);
event.isControl = IS_VK_DOWN(NS_VK_CONTROL);
event.isMeta = false;
event.isAlt = IS_VK_DOWN(NS_VK_ALT);
nsModifierKeyState modifierKeyState;
modifierKeyState.InitInputEvent(event);
event.button = 0;
event.time = ::GetMessageTime();
event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
@ -7927,11 +7927,17 @@ nsWindow::DealWithPopups(HWND inWnd, UINT inMsg, WPARAM inWParam, LPARAM inLPara
**************************************************************/
// nsModifierKeyState used in various character processing.
nsModifierKeyState::nsModifierKeyState()
void
nsModifierKeyState::Update()
{
mIsShiftDown = IS_VK_DOWN(NS_VK_SHIFT);
mIsControlDown = IS_VK_DOWN(NS_VK_CONTROL);
mIsAltDown = IS_VK_DOWN(NS_VK_ALT);
mIsShiftDown = IS_VK_DOWN(VK_SHIFT);
mIsControlDown = IS_VK_DOWN(VK_CONTROL);
mIsAltDown = IS_VK_DOWN(VK_MENU);
mIsWinDown = IS_VK_DOWN(VK_LWIN) || IS_VK_DOWN(VK_RWIN);
mIsCapsLocked = (::GetKeyState(VK_CAPITAL) & 1);
mIsNumLocked = (::GetKeyState(VK_NUMLOCK) & 1);
mIsScrollLocked = (::GetKeyState(VK_SCROLL) & 1);
}
void
@ -7941,6 +7947,65 @@ nsModifierKeyState::InitInputEvent(nsInputEvent& aInputEvent) const
aInputEvent.isControl = mIsControlDown;
aInputEvent.isMeta = false;
aInputEvent.isAlt = mIsAltDown;
switch(aInputEvent.eventStructType) {
case NS_MOUSE_EVENT:
case NS_MOUSE_SCROLL_EVENT:
case NS_DRAG_EVENT:
case NS_SIMPLE_GESTURE_EVENT:
case NS_MOZTOUCH_EVENT:
break;
default:
return;
}
nsMouseEvent_base& mouseEvent = static_cast<nsMouseEvent_base&>(aInputEvent);
mouseEvent.modifiers = 0;
if (mIsShiftDown) {
mouseEvent.modifiers |= MODIFIER_SHIFT;
}
if (mIsControlDown) {
mouseEvent.modifiers |= MODIFIER_CONTROL;
}
if (mIsAltDown) {
mouseEvent.modifiers |= MODIFIER_ALT;
}
if (mIsWinDown) {
mouseEvent.modifiers |= MODIFIER_WIN;
}
if (mIsCapsLocked) {
mouseEvent.modifiers |= MODIFIER_CAPSLOCK;
}
if (mIsNumLocked) {
mouseEvent.modifiers |= MODIFIER_NUMLOCK;
}
if (mIsScrollLocked) {
mouseEvent.modifiers |= MODIFIER_SCROLL;
}
// If both Control key and Alt key are pressed, it means AltGr is pressed.
// Ideally, we should check whether the current keyboard layout has AltGr
// or not. However, setting AltGr flags for keyboard which doesn't have
// AltGr must not be serious bug. So, it should be OK for now.
if (mIsControlDown && mIsAltDown) {
mouseEvent.modifiers |= MODIFIER_ALTGRAPH;
}
mouseEvent.buttons = 0;
if (::GetKeyState(VK_LBUTTON) < 0) {
mouseEvent.buttons |= nsMouseEvent::eLeftButtonFlag;
}
if (::GetKeyState(VK_RBUTTON) < 0) {
mouseEvent.buttons |= nsMouseEvent::eRightButtonFlag;
}
if (::GetKeyState(VK_MBUTTON) < 0) {
mouseEvent.buttons |= nsMouseEvent::eMiddleButtonFlag;
}
if (::GetKeyState(VK_XBUTTON1) < 0) {
mouseEvent.buttons |= nsMouseEvent::e4thButtonFlag;
}
if (::GetKeyState(VK_XBUTTON2) < 0) {
mouseEvent.buttons |= nsMouseEvent::e5thButtonFlag;
}
}
// Note that the result of GetTopLevelWindow method can be different from the

View File

@ -261,14 +261,26 @@ struct nsModifierKeyState {
bool mIsShiftDown;
bool mIsControlDown;
bool mIsAltDown;
bool mIsWinDown;
nsModifierKeyState();
nsModifierKeyState(bool aIsShiftDown, bool aIsControlDown,
bool aIsAltDown) :
mIsShiftDown(aIsShiftDown), mIsControlDown(aIsControlDown),
mIsAltDown(aIsAltDown)
bool mIsCapsLocked;
bool mIsNumLocked;
bool mIsScrollLocked;
nsModifierKeyState()
{
Update();
}
nsModifierKeyState(bool aIsShiftDown, bool aIsControlDown,
bool aIsAltDown)
{
Update();
mIsShiftDown = aIsShiftDown;
mIsControlDown = aIsControlDown;
mIsAltDown = aIsAltDown;
}
void Update();
void InitInputEvent(nsInputEvent& aInputEvent) const;
};