mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 773741 - Support touch events in resizers. r=enn
This commit is contained in:
parent
cbca4b70ef
commit
4bc78c38b2
@ -33,6 +33,7 @@
|
||||
|
||||
#include "nsBoxLayoutState.h"
|
||||
#include "nsBoxFrame.h"
|
||||
#include "nsDOMTouchEvent.h"
|
||||
#include "nsStyleContext.h"
|
||||
#include "nsPresContext.h"
|
||||
#include "nsCOMPtr.h"
|
||||
@ -2173,3 +2174,35 @@ nsBoxFrame::WrapListsInRedirector(nsDisplayListBuilder* aBuilder,
|
||||
nsXULEventRedirectorWrapper wrapper(this);
|
||||
return wrapper.WrapLists(aBuilder, this, aIn, aOut);
|
||||
}
|
||||
|
||||
bool
|
||||
nsBoxFrame::GetEventPoint(nsGUIEvent* aEvent, nsPoint &aPoint) {
|
||||
nsIntPoint refPoint;
|
||||
bool res = GetEventPoint(aEvent, refPoint);
|
||||
aPoint = nsLayoutUtils::GetEventCoordinatesRelativeTo(aEvent, refPoint, this);
|
||||
return res;
|
||||
}
|
||||
|
||||
bool
|
||||
nsBoxFrame::GetEventPoint(nsGUIEvent* aEvent, nsIntPoint &aPoint) {
|
||||
NS_ENSURE_TRUE(aEvent, false);
|
||||
|
||||
if (aEvent->eventStructType == NS_TOUCH_EVENT) {
|
||||
nsTouchEvent* touchEvent = static_cast<nsTouchEvent*>(aEvent);
|
||||
// return false if there is more than one touch on the page, or if
|
||||
// we can't find a touch point
|
||||
if (touchEvent->touches.Length() != 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsIDOMTouch *touch = touchEvent->touches.SafeElementAt(0);
|
||||
if (!touch) {
|
||||
return false;
|
||||
}
|
||||
nsDOMTouch* domtouch = static_cast<nsDOMTouch*>(touch);
|
||||
aPoint = domtouch->mRefPoint;
|
||||
} else {
|
||||
aPoint = aEvent->refPoint;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -210,6 +210,13 @@ protected:
|
||||
|
||||
nsCOMPtr<nsBoxLayout> mLayoutManager;
|
||||
|
||||
// Get the point associated with this event. Returns true if a single valid
|
||||
// point was found. Otherwise false.
|
||||
bool GetEventPoint(nsGUIEvent *aEvent, nsPoint &aPoint);
|
||||
// Gets the event coordinates relative to the widget offset associated with
|
||||
// this frame. Return true if a single valid point was found.
|
||||
bool GetEventPoint(nsGUIEvent *aEvent, nsIntPoint &aPoint);
|
||||
|
||||
protected:
|
||||
nsresult RegUnregAccessKey(bool aDoReg);
|
||||
|
||||
|
@ -62,9 +62,11 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
|
||||
bool doDefault = true;
|
||||
|
||||
switch (aEvent->message) {
|
||||
case NS_TOUCH_START:
|
||||
case NS_MOUSE_BUTTON_DOWN: {
|
||||
if (aEvent->eventStructType == NS_MOUSE_EVENT &&
|
||||
static_cast<nsMouseEvent*>(aEvent)->button == nsMouseEvent::eLeftButton)
|
||||
if (aEvent->eventStructType == NS_TOUCH_EVENT ||
|
||||
(aEvent->eventStructType == NS_MOUSE_EVENT &&
|
||||
static_cast<nsMouseEvent*>(aEvent)->button == nsMouseEvent::eLeftButton))
|
||||
{
|
||||
nsCOMPtr<nsIBaseWindow> window;
|
||||
nsIPresShell* presShell = aPresContext->GetPresShell();
|
||||
@ -112,21 +114,26 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
|
||||
&mMouseDownRect.width, &mMouseDownRect.height);
|
||||
}
|
||||
|
||||
// remember current mouse coordinates
|
||||
nsIntPoint refPoint;
|
||||
if (!GetEventPoint(aEvent, refPoint))
|
||||
return NS_OK;
|
||||
mMouseDownPoint = refPoint + aEvent->widget->WidgetToScreenOffset();
|
||||
|
||||
// we're tracking
|
||||
mTrackingMouseMove = true;
|
||||
|
||||
// remember current mouse coordinates
|
||||
mMouseDownPoint = aEvent->refPoint + aEvent->widget->WidgetToScreenOffset();
|
||||
|
||||
nsIPresShell::SetCapturingContent(GetContent(), CAPTURE_IGNOREALLOWED);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case NS_TOUCH_END:
|
||||
case NS_MOUSE_BUTTON_UP: {
|
||||
|
||||
if (mTrackingMouseMove && aEvent->eventStructType == NS_MOUSE_EVENT &&
|
||||
static_cast<nsMouseEvent*>(aEvent)->button == nsMouseEvent::eLeftButton)
|
||||
if (aEvent->eventStructType == NS_TOUCH_EVENT ||
|
||||
(aEvent->eventStructType == NS_MOUSE_EVENT &&
|
||||
static_cast<nsMouseEvent*>(aEvent)->button == nsMouseEvent::eLeftButton))
|
||||
{
|
||||
// we're done tracking.
|
||||
mTrackingMouseMove = false;
|
||||
@ -138,6 +145,7 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
|
||||
}
|
||||
break;
|
||||
|
||||
case NS_TOUCH_MOVE:
|
||||
case NS_MOUSE_MOVE: {
|
||||
if (mTrackingMouseMove)
|
||||
{
|
||||
@ -160,7 +168,10 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext,
|
||||
|
||||
// retrieve the offset of the mousemove event relative to the mousedown.
|
||||
// The difference is how much the resize needs to be
|
||||
nsIntPoint screenPoint(aEvent->refPoint + aEvent->widget->WidgetToScreenOffset());
|
||||
nsIntPoint refPoint;
|
||||
if (!GetEventPoint(aEvent, refPoint))
|
||||
return NS_OK;
|
||||
nsIntPoint screenPoint(refPoint + aEvent->widget->WidgetToScreenOffset());
|
||||
nsIntPoint mouseMove(screenPoint - mMouseDownPoint);
|
||||
|
||||
// Determine which direction to resize by checking the dir attribute.
|
||||
|
@ -47,6 +47,7 @@ protected:
|
||||
const SizeInfo& aSizeInfo, SizeInfo* aOriginalSizeInfo);
|
||||
static void MaybePersistOriginalSize(nsIContent* aContent, const SizeInfo& aSizeInfo);
|
||||
static void RestoreOriginalSize(nsIContent* aContent);
|
||||
|
||||
protected:
|
||||
nsIntRect mMouseDownRect;
|
||||
nsIntPoint mMouseDownPoint;
|
||||
|
@ -574,40 +574,6 @@ nsSliderFrame::HandleEvent(nsPresContext* aPresContext,
|
||||
return nsFrame::HandleEvent(aPresContext, aEvent, aEventStatus);
|
||||
}
|
||||
|
||||
bool
|
||||
nsSliderFrame::GetEventPoint(nsGUIEvent* aEvent, nsPoint &aPoint) {
|
||||
nsIntPoint refPoint;
|
||||
nsresult rv;
|
||||
if (aEvent->eventStructType == NS_TOUCH_EVENT) {
|
||||
rv = GetTouchPoint(static_cast<nsTouchEvent*>(aEvent), refPoint);
|
||||
if (NS_FAILED(rv))
|
||||
return false;
|
||||
} else {
|
||||
refPoint = aEvent->refPoint;
|
||||
}
|
||||
aPoint = nsLayoutUtils::GetEventCoordinatesRelativeTo(aEvent, refPoint, this);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
nsSliderFrame::GetTouchPoint(nsTouchEvent* aEvent, nsIntPoint &aPoint)
|
||||
{
|
||||
NS_ENSURE_TRUE(aEvent, false);
|
||||
// return false if there is more than one touch on the page, or if
|
||||
// we can't find a touch point
|
||||
if (aEvent->touches.Length() != 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsIDOMTouch *touch = aEvent->touches.SafeElementAt(0);
|
||||
if (!touch) {
|
||||
return false;
|
||||
}
|
||||
nsDOMTouch* domtouch = static_cast<nsDOMTouch*>(touch);
|
||||
aPoint = domtouch->mRefPoint;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Helper function to collect the "scroll to click" metric. Beware of
|
||||
// caching this, users expect to be able to change the system preference
|
||||
// and see the browser change its behavior immediately.
|
||||
|
@ -139,15 +139,6 @@ private:
|
||||
nsresult CurrentPositionChanged(nsPresContext* aPresContext,
|
||||
bool aImmediateRedraw);
|
||||
|
||||
// Get the point associated with this event. Returns true if a valid point
|
||||
// was found. Otherwise false.
|
||||
bool GetEventPoint(nsGUIEvent *aEvent, nsPoint &aPoint);
|
||||
|
||||
// Get the point associated with this touch event. Returns true if a valid point
|
||||
// was found. False if there is more than one touch present on the page, or
|
||||
// if a point could not be found for the given touch.
|
||||
bool GetTouchPoint(nsTouchEvent *aEvent, nsIntPoint &aPoint);
|
||||
|
||||
void DragThumb(bool aGrabMouseEvents);
|
||||
void AddListener();
|
||||
void RemoveListener();
|
||||
|
@ -22,7 +22,7 @@ MOCHITEST_CHROME_FILES = test_bug381167.xhtml \
|
||||
$(NULL)
|
||||
|
||||
ifneq (mobile,$(MOZ_BUILD_APP))
|
||||
MOCHITEST_FILES = test_resizer_incontent.xul
|
||||
MOCHITEST_FILES = test_resizer_incontent.xul \
|
||||
|
||||
MOCHITEST_CHROME_FILES += test_resizer.xul \
|
||||
window_resizer.xul \
|
||||
|
Loading…
Reference in New Issue
Block a user