diff options
Diffstat (limited to 'widget/windows/winrt/MetroInput.h')
-rw-r--r-- | widget/windows/winrt/MetroInput.h | 293 |
1 files changed, 0 insertions, 293 deletions
diff --git a/widget/windows/winrt/MetroInput.h b/widget/windows/winrt/MetroInput.h deleted file mode 100644 index 580e5b38c..000000000 --- a/widget/windows/winrt/MetroInput.h +++ /dev/null @@ -1,293 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#pragma once - -// Moz headers (alphabetical) -#include "APZController.h" -#include "keyboardlayout.h" // mModifierKeyState -#include "nsBaseHashtable.h" // mTouches -#include "nsHashKeys.h" // type of key for mTouches -#include "mozwrlbase.h" -#include "nsDeque.h" -#include "mozilla/EventForwards.h" -#include "mozilla/layers/APZCTreeManager.h" - -// System headers (alphabetical) -#include <EventToken.h> // EventRegistrationToken -#include <stdint.h> // uint32_t -#include <wrl\client.h> // Microsoft::WRL::ComPtr class -#include <wrl\implements.h> // Microsoft::WRL::InspectableClass macro - -// Moz forward declarations -class MetroWidget; -struct nsIntPoint; - -namespace mozilla { -namespace dom { -class Touch; -} -} - -// Windows forward declarations -namespace ABI { - namespace Windows { - namespace Devices { - namespace Input { - enum PointerDeviceType; - } - }; - namespace Foundation { - struct Point; - }; - namespace UI { - namespace Core { - struct ICoreWindow; - struct IAcceleratorKeyEventArgs; - struct IKeyEventArgs; - struct IPointerEventArgs; - }; - namespace Input { - struct IEdgeGesture; - struct IEdgeGestureEventArgs; - struct IGestureRecognizer; - struct IManipulationCompletedEventArgs; - struct IManipulationStartedEventArgs; - struct IManipulationUpdatedEventArgs; - struct IPointerPoint; - struct IRightTappedEventArgs; - struct ITappedEventArgs; - struct ManipulationDelta; - }; - }; - }; -}; - -namespace mozilla { -namespace widget { -namespace winrt { - -class MetroInput : public Microsoft::WRL::RuntimeClass<IInspectable>, - public APZPendingResponseFlusher -{ - InspectableClass(L"MetroInput", BaseTrust); - -private: - typedef mozilla::layers::AllowedTouchBehavior AllowedTouchBehavior; - typedef uint32_t TouchBehaviorFlags; - - // Devices - typedef ABI::Windows::Devices::Input::PointerDeviceType PointerDeviceType; - - // Foundation - typedef ABI::Windows::Foundation::Point Point; - - // UI::Core - typedef ABI::Windows::UI::Core::ICoreWindow ICoreWindow; - typedef ABI::Windows::UI::Core::IAcceleratorKeyEventArgs \ - IAcceleratorKeyEventArgs; - typedef ABI::Windows::UI::Core::IKeyEventArgs IKeyEventArgs; - typedef ABI::Windows::UI::Core::IPointerEventArgs IPointerEventArgs; - - // UI::Input - typedef ABI::Windows::UI::Input::IEdgeGesture IEdgeGesture; - typedef ABI::Windows::UI::Input::IEdgeGestureEventArgs IEdgeGestureEventArgs; - typedef ABI::Windows::UI::Input::IGestureRecognizer IGestureRecognizer; - typedef ABI::Windows::UI::Input::IManipulationCompletedEventArgs \ - IManipulationCompletedEventArgs; - typedef ABI::Windows::UI::Input::IManipulationStartedEventArgs \ - IManipulationStartedEventArgs; - typedef ABI::Windows::UI::Input::IManipulationUpdatedEventArgs \ - IManipulationUpdatedEventArgs; - typedef ABI::Windows::UI::Input::IPointerPoint IPointerPoint; - typedef ABI::Windows::UI::Input::IRightTappedEventArgs IRightTappedEventArgs; - typedef ABI::Windows::UI::Input::ITappedEventArgs ITappedEventArgs; - typedef ABI::Windows::UI::Input::ManipulationDelta ManipulationDelta; - - typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid; - -public: - MetroInput(MetroWidget* aWidget, - ICoreWindow* aWindow); - virtual ~MetroInput(); - - // These input events are received from our window. These are basic - // pointer and keyboard press events. MetroInput responds to them - // by sending goanna events and forwarding these input events to its - // GestureRecognizer to be processed into more complex input events - // (tap, rightTap, rotate, etc) - HRESULT OnPointerPressed(ICoreWindow* aSender, - IPointerEventArgs* aArgs); - HRESULT OnPointerReleased(ICoreWindow* aSender, - IPointerEventArgs* aArgs); - HRESULT OnPointerMoved(ICoreWindow* aSender, - IPointerEventArgs* aArgs); - HRESULT OnPointerEntered(ICoreWindow* aSender, - IPointerEventArgs* aArgs); - HRESULT OnPointerExited(ICoreWindow* aSender, - IPointerEventArgs* aArgs); - - // The Edge gesture event is special. It does not come from our window - // or from our GestureRecognizer. - HRESULT OnEdgeGestureStarted(IEdgeGesture* aSender, - IEdgeGestureEventArgs* aArgs); - HRESULT OnEdgeGestureCanceled(IEdgeGesture* aSender, - IEdgeGestureEventArgs* aArgs); - HRESULT OnEdgeGestureCompleted(IEdgeGesture* aSender, - IEdgeGestureEventArgs* aArgs); - - // Swipe gesture callback from the GestureRecognizer. - HRESULT OnManipulationCompleted(IGestureRecognizer* aSender, - IManipulationCompletedEventArgs* aArgs); - - // Tap gesture callback from the GestureRecognizer. - HRESULT OnTapped(IGestureRecognizer* aSender, ITappedEventArgs* aArgs); - HRESULT OnRightTapped(IGestureRecognizer* aSender, - IRightTappedEventArgs* aArgs); - - void HandleTap(const Point& aPoint, unsigned int aTapCount); - void HandleLongTap(const Point& aPoint); - - // The APZPendingResponseFlusher implementation - void FlushPendingContentResponse(); - - static bool IsInputModeImprecise(); - -private: - Microsoft::WRL::ComPtr<ICoreWindow> mWindow; - Microsoft::WRL::ComPtr<MetroWidget> mWidget; - Microsoft::WRL::ComPtr<IGestureRecognizer> mGestureRecognizer; - - ModifierKeyState mModifierKeyState; - - // Tracking input level - enum InputPrecisionLevel { - LEVEL_PRECISE, - LEVEL_IMPRECISE - }; - static InputPrecisionLevel sCurrentInputLevel; - void UpdateInputLevel(InputPrecisionLevel aInputLevel); - - // Initialization/Uninitialization helpers - void RegisterInputEvents(); - void UnregisterInputEvents(); - - // Hit testing for apz content - bool mNonApzTargetForTouch; - bool HitTestChrome(const LayoutDeviceIntPoint& pt); - - // Event processing helpers. See function definitions for more info. - bool TransformRefPoint(const Point& aPosition, - LayoutDeviceIntPoint& aRefPointOut); - void TransformTouchEvent(WidgetTouchEvent* aEvent); - void OnPointerNonTouch(IPointerPoint* aPoint); - void AddPointerMoveDataToRecognizer(IPointerEventArgs* aArgs); - void InitGoannaMouseEventFromPointerPoint(WidgetMouseEvent* aEvent, - IPointerPoint* aPoint); - void ProcessManipulationDelta(ManipulationDelta const& aDelta, - Point const& aPosition, - uint32_t aMagEventType, - uint32_t aRotEventType); - uint16_t ProcessInputTypeForGesture(IEdgeGestureEventArgs* aArgs); - bool ShouldDeliverInputToRecognizer(); - - // Returns array of allowed touch behaviors for touch points of given TouchEvent. - // Note: event argument should be transformed via apzc before supplying to this method. - void GetAllowedTouchBehavior(WidgetTouchEvent* aTransformedEvent, nsTArray<TouchBehaviorFlags>& aOutBehaviors); - - // First, read the comment in gfx/layers/apz/src/TouchBlockState.h. - // The following booleans track the following pieces of state: - // mCancelable - if we have not yet notified the APZ code about the prevent- - // default status of the current touch block. This is flipped from true - // to false when this notification happens. - // mRecognizerWantsEvents - If the gesture recognizer should be receiving - // events. This is normally true, but will be set to false if the APZ - // decides the touch block should be thrown away entirely, or if content - // consumes the touch block. - // XXX There is a hazard with mRecognizerWantsEvents because it is accessed - // both in the sync and async portions of the code. - bool mCancelable; - bool mRecognizerWantsEvents; - - // In the old Win32 way of doing things, we would receive a WM_TOUCH event - // that told us the state of every touchpoint on the touch surface. If - // multiple touchpoints had moved since the last update we would learn - // about all their movement simultaneously. - // - // In the new WinRT way of doing things, we receive a separate - // PointerPressed/PointerMoved/PointerReleased event for each touchpoint - // that has changed. - // - // When we learn of touch input, we dispatch goanna events in response. - // With the new WinRT way of doing things, we would end up sending many - // more goanna events than we would using the Win32 mechanism. E.g., - // for 5 active touchpoints, we would be sending 5 times as many goanna - // events. This caused performance to visibly degrade on modestly-powered - // machines. In response, we no longer send touch events immediately - // upon receiving PointerPressed or PointerMoved. Instead, we store - // the updated touchpoint info and record the fact that the touchpoint - // has changed. If ever we try to update a touchpoint has already - // changed, we dispatch a touch event containing all the changed touches. - void InitTouchEventTouchList(WidgetTouchEvent* aEvent); - nsBaseHashtable<nsUint32HashKey, - nsRefPtr<mozilla::dom::Touch>, - nsRefPtr<mozilla::dom::Touch> > mTouches; - - // These registration tokens are set when we register ourselves to receive - // events from our window. We must hold on to them for the entire duration - // that we want to receive these events. When we are done, we must - // unregister ourself with the window using these tokens. - EventRegistrationToken mTokenPointerPressed; - EventRegistrationToken mTokenPointerReleased; - EventRegistrationToken mTokenPointerMoved; - EventRegistrationToken mTokenPointerEntered; - EventRegistrationToken mTokenPointerExited; - - // When we register ourselves to handle edge gestures, we receive a - // token. To we unregister ourselves, we must use the token we received. - EventRegistrationToken mTokenEdgeStarted; - EventRegistrationToken mTokenEdgeCanceled; - EventRegistrationToken mTokenEdgeCompleted; - - // These registration tokens are set when we register ourselves to receive - // events from our GestureRecognizer. It's probably not a huge deal if we - // don't unregister ourselves with our GestureRecognizer before destroying - // the GestureRecognizer, but it can't hurt. - EventRegistrationToken mTokenManipulationCompleted; - EventRegistrationToken mTokenTapped; - EventRegistrationToken mTokenRightTapped; - - // Due to a limitation added in 8.1 the ui thread can't re-enter the main - // native event dispatcher in MetroAppShell. So all events delivered to us - // on the ui thread via a native event dispatch call get bounced through - // the goanna thread event queue using runnables. Most events can be sent - // async without the need to see the status result. Those that do have - // specialty callbacks. Note any event that arrives to us on the ui thread - // that originates from another thread is safe to send sync. - - // Async event dispatching - void DispatchAsyncEventIgnoreStatus(WidgetInputEvent* aEvent); - void DispatchAsyncTouchEvent(WidgetTouchEvent* aEvent); - - // Async event callbacks - void DeliverNextQueuedEventIgnoreStatus(); - void DeliverNextQueuedTouchEvent(); - - void HandleTouchStartEvent(WidgetTouchEvent* aEvent); - void HandleFirstTouchMoveEvent(WidgetTouchEvent* aEvent); - void SendPointerCancelToContent(const WidgetTouchEvent& aEvent); - bool SendPendingResponseToApz(); - void CancelGesture(); - - // Sync event dispatching - void DispatchEventIgnoreStatus(WidgetGUIEvent* aEvent); - - nsDeque mInputEventQueue; - mozilla::layers::ScrollableLayerGuid mTargetAPZCGuid; - uint64_t mInputBlockId; - static nsEventStatus sThrowawayStatus; -}; - -} } } |