diff -r 000000000000 -r 6474c204b198 widget/windows/winrt/MetroWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widget/windows/winrt/MetroWidget.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,269 @@ +/* -*- Mode: C++; tab-width: 2; 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 + +#include "nscore.h" +#include "nsdefs.h" +#include "prlog.h" +#include "nsAutoPtr.h" +#include "nsBaseWidget.h" +#include "nsWindowBase.h" +#include "nsString.h" +#include "nsTArray.h" +#include "nsWindowDbg.h" +#include "WindowHook.h" +#include "TaskbarWindowPreview.h" +#include "nsIdleService.h" +#ifdef ACCESSIBILITY +#include "mozilla/a11y/Accessible.h" +#endif +#include "mozilla/EventForwards.h" +#include "mozilla/layers/CompositorParent.h" +#include "mozilla/layers/LayerManagerComposite.h" +#include "nsDeque.h" +#include "APZController.h" + +#include "mozwrlbase.h" + +#include +#include +#include +#include +#include + +class nsNativeDragTarget; + +namespace mozilla { +namespace widget { +namespace winrt { + +class FrameworkView; + +} } } + +class DispatchMsg; + +class MetroWidget : public nsWindowBase, + public nsIObserver +{ + typedef uint32_t TouchBehaviorFlags; + + typedef mozilla::widget::WindowHook WindowHook; + typedef mozilla::widget::TaskbarWindowPreview TaskbarWindowPreview; + typedef ABI::Windows::UI::Input::IPointerPoint IPointerPoint; + typedef ABI::Windows::UI::Core::IPointerEventArgs IPointerEventArgs; + typedef ABI::Windows::UI::Core::IKeyEventArgs IKeyEventArgs; + typedef ABI::Windows::UI::Core::ICharacterReceivedEventArgs ICharacterReceivedEventArgs; + typedef mozilla::widget::winrt::FrameworkView FrameworkView; + typedef mozilla::widget::winrt::APZController APZController; + typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid; + + static LRESULT CALLBACK + StaticWindowProcedure(HWND aWnd, UINT aMsg, WPARAM aWParan, LPARAM aLParam); + LRESULT WindowProcedure(HWND aWnd, UINT aMsg, WPARAM aWParan, LPARAM aLParam); + +public: + MetroWidget(); + virtual ~MetroWidget(); + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_NSIOBSERVER + + static HWND GetICoreWindowHWND() { return sICoreHwnd; } + + // nsWindowBase + virtual bool DispatchWindowEvent(mozilla::WidgetGUIEvent* aEvent) MOZ_OVERRIDE; + virtual bool DispatchKeyboardEvent(mozilla::WidgetGUIEvent* aEvent) MOZ_OVERRIDE; + virtual bool DispatchScrollEvent(mozilla::WidgetGUIEvent* aEvent) MOZ_OVERRIDE; + virtual bool DispatchPluginEvent(const MSG &aMsg) MOZ_OVERRIDE { return false; } + virtual bool IsTopLevelWidget() MOZ_OVERRIDE { return true; } + virtual nsWindowBase* GetParentWindowBase(bool aIncludeOwner) MOZ_OVERRIDE { return nullptr; } + // InitEvent assumes physical coordinates and is used by shared win32 code. Do + // not hand winrt event coordinates to this routine. + virtual void InitEvent(mozilla::WidgetGUIEvent& aEvent, + nsIntPoint* aPoint = nullptr) MOZ_OVERRIDE; + + // nsBaseWidget + virtual CompositorParent* NewCompositorParent(int aSurfaceWidth, int aSurfaceHeight); + virtual void SetWidgetListener(nsIWidgetListener* aWidgetListener); + + // nsIWidget interface + NS_IMETHOD Create(nsIWidget *aParent, + nsNativeWidget aNativeParent, + const nsIntRect &aRect, + nsDeviceContext *aContext, + nsWidgetInitData *aInitData = nullptr); + NS_IMETHOD Destroy(); + NS_IMETHOD EnableDragDrop(bool aEnable); + NS_IMETHOD SetParent(nsIWidget *aNewParent); + NS_IMETHOD Show(bool bState); + NS_IMETHOD IsVisible(bool & aState); + NS_IMETHOD IsEnabled(bool *aState); + NS_IMETHOD GetBounds(nsIntRect &aRect); + NS_IMETHOD GetScreenBounds(nsIntRect &aRect); + NS_IMETHOD GetClientBounds(nsIntRect &aRect); + NS_IMETHOD Invalidate(bool aEraseBackground = false, + bool aUpdateNCArea = false, + bool aIncludeChildren = false); + NS_IMETHOD Invalidate(const nsIntRect & aRect); + NS_IMETHOD DispatchEvent(mozilla::WidgetGUIEvent* aEvent, + nsEventStatus& aStatus); + NS_IMETHOD ConstrainPosition(bool aAllowSlop, int32_t *aX, int32_t *aY); + NS_IMETHOD Move(double aX, double aY); + NS_IMETHOD Resize(double aWidth, double aHeight, bool aRepaint); + NS_IMETHOD Resize(double aX, double aY, double aWidth, double aHeight, bool aRepaint); + NS_IMETHOD SetFocus(bool aRaise); + NS_IMETHOD Enable(bool aState); + NS_IMETHOD SetCursor(nsCursor aCursor); + NS_IMETHOD SetTitle(const nsAString& aTitle); + NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, + bool aDoCapture); + NS_IMETHOD ReparentNativeWidget(nsIWidget* aNewParent); + virtual nsresult SynthesizeNativeKeyEvent(int32_t aNativeKeyboardLayout, + int32_t aNativeKeyCode, + uint32_t aModifierFlags, + const nsAString& aCharacters, + const nsAString& aUnmodifiedCharacters); + virtual nsresult SynthesizeNativeMouseEvent(nsIntPoint aPoint, + uint32_t aNativeMessage, + uint32_t aModifierFlags); + virtual nsresult SynthesizeNativeMouseScrollEvent(nsIntPoint aPoint, + uint32_t aNativeMessage, + double aDeltaX, + double aDeltaY, + double aDeltaZ, + uint32_t aModifierFlags, + uint32_t aAdditionalFlags); + virtual bool HasPendingInputEvent(); + virtual double GetDefaultScaleInternal(); + float GetDPI(); + mozilla::LayoutDeviceIntPoint CSSIntPointToLayoutDeviceIntPoint(const mozilla::CSSIntPoint &aCSSPoint); + void ChangedDPI(); + virtual uint32_t GetMaxTouchPoints() const MOZ_OVERRIDE; + virtual bool IsVisible() const; + virtual bool IsEnabled() const; + // ShouldUseOffMainThreadCompositing is defined in base widget + virtual bool ShouldUseOffMainThreadCompositing(); + bool ShouldUseMainThreadD3D10Manager(); + bool ShouldUseBasicManager(); + bool ShouldUseAPZC(); + virtual LayerManager* GetLayerManager(PLayerTransactionChild* aShadowManager = nullptr, + LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE, + LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT, + bool* aAllowRetaining = nullptr); + virtual void GetPreferredCompositorBackends(nsTArray& aHints) { aHints.AppendElement(mozilla::layers::LayersBackend::LAYERS_D3D11); } + + // IME related interfaces + NS_IMETHOD_(void) SetInputContext(const InputContext& aContext, + const InputContextAction& aAction); + NS_IMETHOD_(nsIWidget::InputContext) GetInputContext(); + NS_IMETHOD NotifyIME(const IMENotification& aIMENotification) MOZ_OVERRIDE; + NS_IMETHOD GetToggledKeyState(uint32_t aKeyCode, bool* aLEDState); + virtual nsIMEUpdatePreference GetIMEUpdatePreference() MOZ_OVERRIDE; + + // FrameworkView helpers + void SizeModeChanged(); + void Activated(bool aActiveated); + void Paint(const nsIntRegion& aInvalidRegion); + + MetroWidget* MetroWidget::GetTopLevelWindow(bool aStopOnDialogOrPopup) { return this; } + virtual nsresult ConfigureChildren(const nsTArray& aConfigurations); + virtual void* GetNativeData(uint32_t aDataType); + virtual void FreeNativeData(void * data, uint32_t aDataType); + virtual nsIntPoint WidgetToScreenOffset(); + + already_AddRefed GetPresShell(); + + void UserActivity(); + +#ifdef ACCESSIBILITY + mozilla::a11y::Accessible* DispatchAccessibleEvent(uint32_t aEventType); + mozilla::a11y::Accessible* GetAccessible(); +#endif // ACCESSIBILITY + + // needed for current nsIFilePicker + void PickerOpen(); + void PickerClosed(); + bool DestroyCalled() { return false; } + void SuppressBlurEvents(bool aSuppress); + bool BlurEventsSuppressed(); + + // needed for nsITaskbarWindowPreview + bool HasTaskbarIconBeenCreated() { return false; } + void SetHasTaskbarIconBeenCreated(bool created = true) { } + already_AddRefed GetTaskbarPreview() { return nullptr; } + void SetTaskbarPreview(nsITaskbarWindowPreview *preview) { } + WindowHook& GetWindowHook() { return mWindowHook; } + + void SetView(FrameworkView* aView); + void FindMetroWindow(); + virtual void SetTransparencyMode(nsTransparencyMode aMode); + virtual nsTransparencyMode GetTransparencyMode(); + + TouchBehaviorFlags ContentGetAllowedTouchBehavior(const nsIntPoint& aPoint); + + // apzc controller related api + void ApzcGetAllowedTouchBehavior(mozilla::WidgetInputEvent* aTransformedEvent, nsTArray& aOutBehaviors); + void ApzcSetAllowedTouchBehavior(const ScrollableLayerGuid& aGuid, nsTArray& aBehaviors); + + // Hit test a point to see if an apzc would consume input there + bool ApzHitTest(mozilla::ScreenIntPoint& pt); + // Transforms a coord so that it properly targets gecko content based + // on apzc transforms currently applied. + void ApzTransformGeckoCoordinate(const mozilla::ScreenIntPoint& pt, + mozilla::LayoutDeviceIntPoint* aRefPointOut); + // send ContentRecievedTouch calls to the apz with appropriate preventDefault params + void ApzContentConsumingTouch(const ScrollableLayerGuid& aGuid); + void ApzContentIgnoringTouch(const ScrollableLayerGuid& aGuid); + // Input handling + nsEventStatus ApzReceiveInputEvent(mozilla::WidgetInputEvent* aEvent, + ScrollableLayerGuid* aOutTargetGuid); + +protected: + friend class FrameworkView; + + struct OleInitializeWrapper { + HRESULT const hr; + + OleInitializeWrapper() + : hr(::OleInitialize(nullptr)) + { + } + + ~OleInitializeWrapper() { + if (SUCCEEDED(hr)) { + ::OleFlushClipboard(); + ::OleUninitialize(); + } + } + }; + + void SetSubclass(); + void RemoveSubclass(); + nsIWidgetListener* GetPaintListener(); + + // Async event dispatching + void DispatchAsyncScrollEvent(DispatchMsg* aEvent); + void DeliverNextScrollEvent(); + void DeliverNextKeyboardEvent(); + +protected: + OleInitializeWrapper mOleInitializeWrapper; + WindowHook mWindowHook; + Microsoft::WRL::ComPtr mView; + nsTransparencyMode mTransparencyMode; + nsIntRegion mInvalidatedRegion; + nsCOMPtr mIdleService; + HWND mWnd; + static HWND sICoreHwnd; + WNDPROC mMetroWndProc; + bool mTempBasicLayerInUse; + uint64_t mRootLayerTreeId; + nsDeque mEventQueue; + nsDeque mKeyEventQueue; + nsRefPtr mController; + nsRefPtr mNativeDragTarget; +};