Bug 1258808 - Part 2: Enhance Widget for Windows (Widget). r=smaug, f=btseng

--HG--
extra : rebase_source : d22c59ac2a0e0bb7baec976bbabc1c75ec6f5955
extra : histedit_source : 12058ce71e0268f2582044bf307f83d461966bd4
This commit is contained in:
Ho-Pang Hsu 2016-09-01 16:12:15 +08:00
parent 0174b1ed3b
commit 8e327f28fa
7 changed files with 87 additions and 28 deletions

View File

@ -169,6 +169,21 @@ void InkCollector::ClearTarget()
}
}
uint16_t InkCollector::GetPointerId()
{
return mPointerId;
}
void InkCollector::SetPointerId(uint16_t aPointerId)
{
mPointerId = aPointerId;
}
void InkCollector::ClearPointerId()
{
mPointerId = 0;
}
// The display and the digitizer have quite different properties.
// The display has CursorMustTouch, the mouse pointer alway touches the display surface.
// The digitizer lists Integrated and HardProximity.

View File

@ -58,6 +58,10 @@ public:
void SetTarget(HWND aTargetWindow);
void ClearTarget();
uint16_t GetPointerId(); // 0 shows that there is no existing pen.
void SetPointerId(uint16_t aPointerId);
void ClearPointerId();
static StaticAutoPtr<InkCollector> sInkCollector;
protected:
@ -75,6 +79,20 @@ private:
DWORD mCookie = 0;
bool mComInitialized = false;
bool mEnabled = false;
// This value holds the previous pointerId of the pen, and is used by the
// nsWindow when processing a MOZ_WM_PEN_LEAVES_HOVER_OF_DIGITIZER which
// indicates that a pen leaves the digitizer.
// TODO: If we move our implementation to window pointer input messages, then
// we no longer need this value, since the pointerId can be retrieved from the
// window message, please refer to
// https://msdn.microsoft.com/en-us/library/windows/desktop/hh454916(v=vs.85).aspx
// NOTE: The pointerId of a pen shouldn't be 0 on a Windows platform, since 0
// is reserved of the mouse, please refer to
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms703320(v=vs.85).aspx
uint16_t mPointerId = 0;
};
#endif // InkCollector_h__

View File

@ -1084,6 +1084,14 @@ WinUtils::GetMouseInputSource()
return static_cast<uint16_t>(inputSource);
}
/* static */
uint16_t
WinUtils::GetMousePointerID()
{
LPARAM lParamExtraInfo = ::GetMessageExtraInfo();
return lParamExtraInfo & TABLET_INK_ID_MASK;
}
/* static */
bool
WinUtils::GetIsMouseFromTouch(EventMessage aEventMessage)

View File

@ -382,6 +382,13 @@ public:
*/
static uint16_t GetMouseInputSource();
/**
* Windows also fires mouse window messages for pens and touches, so we should
* retrieve their pointer ID on receiving mouse events as well. Please refer to
* https://msdn.microsoft.com/en-us/library/windows/desktop/ms703320(v=vs.85).aspx
*/
static uint16_t GetMousePointerID();
static bool GetIsMouseFromTouch(EventMessage aEventType);
/**

View File

@ -4001,7 +4001,8 @@ bool nsWindow::DispatchPluginEvent(UINT aMessage,
bool
nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
LPARAM lParam, bool aIsContextMenuKey,
int16_t aButton, uint16_t aInputSource)
int16_t aButton, uint16_t aInputSource,
uint16_t aPointerId)
{
bool result = false;
@ -4033,6 +4034,7 @@ nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
// Currently this scheme is used only when pointer events is enabled.
&& gfxPrefs::PointerEventsEnabled()) {
InkCollector::sInkCollector->SetTarget(mWnd);
InkCollector::sInkCollector->SetPointerId(aPointerId);
}
switch (aEventMessage) {
@ -4071,6 +4073,7 @@ nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
modifierKeyState.InitInputEvent(event);
event.button = aButton;
event.inputSource = aInputSource;
event.pointerId = aPointerId;
// If we get here the mouse events must be from non-touch sources, so
// convert it to pointer events as well
event.convertToPointer = true;
@ -4232,7 +4235,7 @@ nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
sCurrentWindow->DispatchMouseEvent(eMouseExitFromWidget,
wParam, pos, false,
WidgetMouseEvent::eLeftButton,
aInputSource);
aInputSource, aPointerId);
}
sCurrentWindow = this;
if (!mInDtor) {
@ -4240,7 +4243,7 @@ nsWindow::DispatchMouseEvent(EventMessage aEventMessage, WPARAM wParam,
sCurrentWindow->DispatchMouseEvent(eMouseEnterIntoWidget,
wParam, pos, false,
WidgetMouseEvent::eLeftButton,
aInputSource);
aInputSource, aPointerId);
}
}
}
@ -5142,7 +5145,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseMove, wParam, lParam,
false, WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
if (userMovedMouse) {
DispatchPendingEvents();
}
@ -5160,7 +5163,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
{
result = DispatchMouseEvent(eMouseDown, wParam, lParam,
false, WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
}
break;
@ -5169,7 +5172,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
{
result = DispatchMouseEvent(eMouseUp, wParam, lParam,
false, WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
}
break;
@ -5189,17 +5192,22 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
// WM_MOUSELEAVE.
LPARAM pos = lParamToClient(::GetMessagePos());
DispatchMouseEvent(eMouseExitFromWidget, mouseState, pos, false,
WidgetMouseEvent::eLeftButton, MOUSE_INPUT_SOURCE());
WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
}
break;
case MOZ_WM_PEN_LEAVES_HOVER_OF_DIGITIZER:
{
LPARAM pos = lParamToClient(::GetMessagePos());
DispatchMouseEvent(eMouseExitFromWidget, wParam, pos, false,
WidgetMouseEvent::eLeftButton,
nsIDOMMouseEvent::MOZ_SOURCE_PEN);
InkCollector::sInkCollector->ClearTarget();
uint16_t pointerId = InkCollector::sInkCollector->GetPointerId();
if (pointerId != 0) {
DispatchMouseEvent(eMouseExitFromWidget, wParam, pos, false,
WidgetMouseEvent::eLeftButton,
nsIDOMMouseEvent::MOZ_SOURCE_PEN, pointerId);
InkCollector::sInkCollector->ClearTarget();
InkCollector::sInkCollector->ClearPointerId();
}
}
break;
@ -5232,7 +5240,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
contextMenukey ?
WidgetMouseEvent::eLeftButton :
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
if (lParam != -1 && !result && mCustomNonClient &&
mDraggableRegion.Contains(GET_X_LPARAM(pos), GET_Y_LPARAM(pos))) {
// Blank area hit, throw up the system menu.
@ -5246,7 +5254,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDoubleClick, wParam,
lParam, false,
WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5254,7 +5262,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDown, wParam,
lParam, false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5262,7 +5270,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseUp, wParam,
lParam, false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5270,7 +5278,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDoubleClick, wParam,
lParam, false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5278,7 +5286,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDown, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5286,7 +5294,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseUp, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5294,7 +5302,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDoubleClick, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eMiddleButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5302,7 +5310,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDown, wParam,
lParam, false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5310,7 +5318,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseUp, wParam,
lParam, false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5318,7 +5326,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDoubleClick, wParam,
lParam, false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5326,7 +5334,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDown, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5334,7 +5342,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseUp, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5342,7 +5350,7 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
result = DispatchMouseEvent(eMouseDoubleClick, 0,
lParamToClient(lParam), false,
WidgetMouseEvent::eRightButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;
@ -5423,11 +5431,11 @@ nsWindow::ProcessMessage(UINT msg, WPARAM& wParam, LPARAM& lParam,
case WM_NCLBUTTONDBLCLK:
DispatchMouseEvent(eMouseDoubleClick, 0, lParamToClient(lParam),
false, WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
result =
DispatchMouseEvent(eMouseUp, 0, lParamToClient(lParam),
false, WidgetMouseEvent::eLeftButton,
MOUSE_INPUT_SOURCE());
MOUSE_INPUT_SOURCE(), MOUSE_POINTERID());
DispatchPendingEvents();
break;

View File

@ -227,7 +227,8 @@ public:
int16_t aButton =
mozilla::WidgetMouseEvent::eLeftButton,
uint16_t aInputSource =
nsIDOMMouseEvent::MOZ_SOURCE_MOUSE);
nsIDOMMouseEvent::MOZ_SOURCE_MOUSE,
uint16_t aPointerId = 0);
virtual bool DispatchWindowEvent(mozilla::WidgetGUIEvent* aEvent,
nsEventStatus& aStatus);
void DispatchPendingEvents();

View File

@ -36,7 +36,9 @@
#define TABLET_INK_SIGNATURE 0xFFFFFF00
#define TABLET_INK_CHECK 0xFF515700
#define TABLET_INK_TOUCH 0x00000080
#define TABLET_INK_ID_MASK 0x0000007F
#define MOUSE_INPUT_SOURCE() WinUtils::GetMouseInputSource()
#define MOUSE_POINTERID() WinUtils::GetMousePointerID()
/**************************************************************
*