mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 02:14:43 +00:00
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:
parent
0174b1ed3b
commit
8e327f28fa
@ -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.
|
||||
|
@ -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__
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
||||
/**************************************************************
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user