|
Packit |
f0b94e |
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
Packit |
f0b94e |
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
f0b94e |
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
f0b94e |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
Packit |
f0b94e |
#ifndef nsBaseWidget_h__
|
|
Packit |
f0b94e |
#define nsBaseWidget_h__
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#include "InputData.h"
|
|
Packit |
f0b94e |
#include "mozilla/EventForwards.h"
|
|
Packit |
f0b94e |
#include "mozilla/Mutex.h"
|
|
Packit |
f0b94e |
#include "mozilla/RefPtr.h"
|
|
Packit |
f0b94e |
#include "mozilla/UniquePtr.h"
|
|
Packit |
f0b94e |
#include "mozilla/WidgetUtils.h"
|
|
Packit |
f0b94e |
#include "mozilla/layers/APZCCallbackHelper.h"
|
|
Packit |
f0b94e |
#include "mozilla/layers/CompositorOptions.h"
|
|
Packit |
f0b94e |
#include "nsRect.h"
|
|
Packit |
f0b94e |
#include "nsIWidget.h"
|
|
Packit |
f0b94e |
#include "nsWidgetsCID.h"
|
|
Packit |
f0b94e |
#include "nsIFile.h"
|
|
Packit |
f0b94e |
#include "nsString.h"
|
|
Packit |
f0b94e |
#include "nsCOMPtr.h"
|
|
Packit |
f0b94e |
#include "nsIRollupListener.h"
|
|
Packit |
f0b94e |
#include "nsIObserver.h"
|
|
Packit |
f0b94e |
#include "nsIWidgetListener.h"
|
|
Packit |
f0b94e |
#include "nsPIDOMWindow.h"
|
|
Packit |
f0b94e |
#include "nsWeakReference.h"
|
|
Packit |
f0b94e |
#include <algorithm>
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#if defined(XP_WIN)
|
|
Packit |
f0b94e |
// Scroll capture constants
|
|
Packit |
f0b94e |
const uint32_t kScrollCaptureFillColor = 0xFFa0a0a0; // gray
|
|
Packit |
f0b94e |
const mozilla::gfx::SurfaceFormat kScrollCaptureFormat =
|
|
Packit |
f0b94e |
mozilla::gfx::SurfaceFormat::X8R8G8B8_UINT32;
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class nsIContent;
|
|
Packit |
f0b94e |
class gfxContext;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace mozilla {
|
|
Packit |
f0b94e |
class CompositorVsyncDispatcher;
|
|
Packit |
f0b94e |
class LiveResizeListener;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#ifdef ACCESSIBILITY
|
|
Packit |
f0b94e |
namespace a11y {
|
|
Packit |
f0b94e |
class Accessible;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace gfx {
|
|
Packit |
f0b94e |
class DrawTarget;
|
|
Packit |
f0b94e |
class SourceSurface;
|
|
Packit |
f0b94e |
} // namespace gfx
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace layers {
|
|
Packit |
f0b94e |
class BasicLayerManager;
|
|
Packit |
f0b94e |
class CompositorBridgeChild;
|
|
Packit |
f0b94e |
class CompositorBridgeParent;
|
|
Packit |
f0b94e |
class IAPZCTreeManager;
|
|
Packit |
f0b94e |
class GeckoContentController;
|
|
Packit |
f0b94e |
class APZEventState;
|
|
Packit |
f0b94e |
class CompositorSession;
|
|
Packit |
f0b94e |
class ImageContainer;
|
|
Packit |
f0b94e |
struct ScrollableLayerGuid;
|
|
Packit |
f0b94e |
class RemoteCompositorSession;
|
|
Packit |
f0b94e |
} // namespace layers
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace widget {
|
|
Packit |
f0b94e |
class CompositorWidgetDelegate;
|
|
Packit |
f0b94e |
class InProcessCompositorWidget;
|
|
Packit |
f0b94e |
class WidgetRenderingContext;
|
|
Packit |
f0b94e |
} // namespace widget
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class CompositorVsyncDispatcher;
|
|
Packit |
f0b94e |
} // namespace mozilla
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
namespace base {
|
|
Packit |
f0b94e |
class Thread;
|
|
Packit |
f0b94e |
} // namespace base
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Windows specific constant indicating the maximum number of touch points the
|
|
Packit |
f0b94e |
// inject api will allow. This also sets the maximum numerical value for touch
|
|
Packit |
f0b94e |
// ids we can use when injecting touch points on Windows.
|
|
Packit |
f0b94e |
#define TOUCH_INJECT_MAX_POINTS 256
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class nsBaseWidget;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Helper class used in shutting down gfx related code.
|
|
Packit |
f0b94e |
class WidgetShutdownObserver final : public nsIObserver {
|
|
Packit |
f0b94e |
~WidgetShutdownObserver();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
public:
|
|
Packit |
f0b94e |
explicit WidgetShutdownObserver(nsBaseWidget* aWidget);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
NS_DECL_ISUPPORTS
|
|
Packit |
f0b94e |
NS_DECL_NSIOBSERVER
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void Register();
|
|
Packit |
f0b94e |
void Unregister();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsBaseWidget* mWidget;
|
|
Packit |
f0b94e |
bool mRegistered;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Common widget implementation used as base class for native
|
|
Packit |
f0b94e |
* or crossplatform implementations of Widgets.
|
|
Packit |
f0b94e |
* All cross-platform behavior that all widgets need to implement
|
|
Packit |
f0b94e |
* should be placed in this class.
|
|
Packit |
f0b94e |
* (Note: widget implementations are not required to use this
|
|
Packit |
f0b94e |
* class, but it gives them a head start.)
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference {
|
|
Packit |
f0b94e |
friend class DispatchWheelEventOnMainThread;
|
|
Packit |
f0b94e |
friend class mozilla::widget::InProcessCompositorWidget;
|
|
Packit |
f0b94e |
friend class mozilla::layers::RemoteCompositorSession;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
typedef base::Thread Thread;
|
|
Packit |
f0b94e |
typedef mozilla::gfx::DrawTarget DrawTarget;
|
|
Packit |
f0b94e |
typedef mozilla::gfx::SourceSurface SourceSurface;
|
|
Packit |
f0b94e |
typedef mozilla::layers::BasicLayerManager BasicLayerManager;
|
|
Packit |
f0b94e |
typedef mozilla::layers::BufferMode BufferMode;
|
|
Packit |
f0b94e |
typedef mozilla::layers::CompositorBridgeChild CompositorBridgeChild;
|
|
Packit |
f0b94e |
typedef mozilla::layers::CompositorBridgeParent CompositorBridgeParent;
|
|
Packit |
f0b94e |
typedef mozilla::layers::IAPZCTreeManager IAPZCTreeManager;
|
|
Packit |
f0b94e |
typedef mozilla::layers::GeckoContentController GeckoContentController;
|
|
Packit |
f0b94e |
typedef mozilla::layers::ScrollableLayerGuid ScrollableLayerGuid;
|
|
Packit |
f0b94e |
typedef mozilla::layers::APZEventState APZEventState;
|
|
Packit |
f0b94e |
typedef mozilla::layers::SetAllowedTouchBehaviorCallback
|
|
Packit |
f0b94e |
SetAllowedTouchBehaviorCallback;
|
|
Packit |
f0b94e |
typedef mozilla::CSSIntRect CSSIntRect;
|
|
Packit |
f0b94e |
typedef mozilla::CSSRect CSSRect;
|
|
Packit |
f0b94e |
typedef mozilla::ScreenRotation ScreenRotation;
|
|
Packit |
f0b94e |
typedef mozilla::widget::CompositorWidgetDelegate CompositorWidgetDelegate;
|
|
Packit |
f0b94e |
typedef mozilla::layers::CompositorSession CompositorSession;
|
|
Packit |
f0b94e |
typedef mozilla::layers::ImageContainer ImageContainer;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual ~nsBaseWidget();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
public:
|
|
Packit |
f0b94e |
nsBaseWidget();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
NS_DECL_ISUPPORTS
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// nsIWidget interface
|
|
Packit |
f0b94e |
virtual void CaptureMouse(bool aCapture) override {}
|
|
Packit |
f0b94e |
virtual void CaptureRollupEvents(nsIRollupListener* aListener,
|
|
Packit |
f0b94e |
bool aDoCapture) override {}
|
|
Packit |
f0b94e |
virtual nsIWidgetListener* GetWidgetListener() override;
|
|
Packit |
f0b94e |
virtual void SetWidgetListener(nsIWidgetListener* alistener) override;
|
|
Packit |
f0b94e |
virtual void Destroy() override;
|
|
Packit |
f0b94e |
virtual void SetParent(nsIWidget* aNewParent) override{};
|
|
Packit |
f0b94e |
virtual nsIWidget* GetParent(void) override;
|
|
Packit |
f0b94e |
virtual nsIWidget* GetTopLevelWidget() override;
|
|
Packit |
f0b94e |
virtual nsIWidget* GetSheetWindowParent(void) override;
|
|
Packit |
f0b94e |
virtual float GetDPI() override;
|
|
Packit |
f0b94e |
virtual void AddChild(nsIWidget* aChild) override;
|
|
Packit |
f0b94e |
virtual void RemoveChild(nsIWidget* aChild) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void SetZIndex(int32_t aZIndex) override;
|
|
Packit |
f0b94e |
virtual void PlaceBehind(nsTopLevelWidgetZPlacement aPlacement,
|
|
Packit |
f0b94e |
nsIWidget* aWidget, bool aActivate) override {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void SetSizeMode(nsSizeMode aMode) override;
|
|
Packit |
f0b94e |
virtual nsSizeMode SizeMode() override { return mSizeMode; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual bool IsFullyOccluded() const override { return mIsFullyOccluded; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void SetCursor(nsCursor aCursor) override;
|
|
Packit |
f0b94e |
virtual nsresult SetCursor(imgIContainer* aCursor, uint32_t aHotspotX,
|
|
Packit |
f0b94e |
uint32_t aHotspotY) override;
|
|
Packit |
f0b94e |
virtual void ClearCachedCursor() override { mUpdateCursor = true; }
|
|
Packit |
f0b94e |
virtual void SetTransparencyMode(nsTransparencyMode aMode) override;
|
|
Packit |
f0b94e |
virtual nsTransparencyMode GetTransparencyMode() override;
|
|
Packit |
f0b94e |
virtual void GetWindowClipRegion(
|
|
Packit |
f0b94e |
nsTArray<LayoutDeviceIntRect>* aRects) override;
|
|
Packit |
f0b94e |
virtual void SetWindowShadowStyle(int32_t aStyle) override {}
|
|
Packit |
f0b94e |
virtual void SetShowsToolbarButton(bool aShow) override {}
|
|
Packit |
f0b94e |
virtual void SetShowsFullScreenButton(bool aShow) override {}
|
|
Packit |
f0b94e |
virtual void SetWindowAnimationType(WindowAnimationType aType) override {}
|
|
Packit |
f0b94e |
virtual void HideWindowChrome(bool aShouldHide) override {}
|
|
Packit |
f0b94e |
virtual bool PrepareForFullscreenTransition(nsISupports** aData) override {
|
|
Packit |
f0b94e |
return false;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void PerformFullscreenTransition(FullscreenTransitionStage aStage,
|
|
Packit |
f0b94e |
uint16_t aDuration,
|
|
Packit |
f0b94e |
nsISupports* aData,
|
|
Packit |
f0b94e |
nsIRunnable* aCallback) override;
|
|
Packit |
f0b94e |
virtual void CleanupFullscreenTransition() override{};
|
|
Packit |
f0b94e |
virtual already_AddRefed<nsIScreen> GetWidgetScreen() override;
|
|
Packit |
f0b94e |
virtual nsresult MakeFullScreen(bool aFullScreen,
|
|
Packit |
f0b94e |
nsIScreen* aScreen = nullptr) override;
|
|
Packit |
f0b94e |
void InfallibleMakeFullScreen(bool aFullScreen, nsIScreen* aScreen = nullptr);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual LayerManager* GetLayerManager(
|
|
Packit |
f0b94e |
PLayerTransactionChild* aShadowManager = nullptr,
|
|
Packit |
f0b94e |
LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE,
|
|
Packit |
f0b94e |
LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// A remote compositor session tied to this window has been lost and IPC
|
|
Packit |
f0b94e |
// messages will no longer work. The widget must clean up any lingering
|
|
Packit |
f0b94e |
// resources and possibly schedule another paint.
|
|
Packit |
f0b94e |
//
|
|
Packit |
f0b94e |
// A reference to the session object is held until this function has
|
|
Packit |
f0b94e |
// returned.
|
|
Packit |
f0b94e |
void NotifyCompositorSessionLost(
|
|
Packit |
f0b94e |
mozilla::layers::CompositorSession* aSession);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
already_AddRefed<mozilla::CompositorVsyncDispatcher>
|
|
Packit |
f0b94e |
GetCompositorVsyncDispatcher();
|
|
Packit |
f0b94e |
void CreateCompositorVsyncDispatcher();
|
|
Packit |
f0b94e |
virtual void CreateCompositor();
|
|
Packit |
f0b94e |
virtual void CreateCompositor(int aWidth, int aHeight);
|
|
Packit |
f0b94e |
virtual void SetCompositorWidgetDelegate(CompositorWidgetDelegate* delegate) {
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void PrepareWindowEffects() override {}
|
|
Packit |
f0b94e |
virtual void UpdateThemeGeometries(
|
|
Packit |
f0b94e |
const nsTArray<ThemeGeometry>& aThemeGeometries) override {}
|
|
Packit |
f0b94e |
virtual void SetModal(bool aModal) override {}
|
|
Packit |
f0b94e |
virtual uint32_t GetMaxTouchPoints() const override;
|
|
Packit |
f0b94e |
virtual void SetWindowClass(const nsAString& xulWinType) override {}
|
|
Packit |
f0b94e |
virtual nsresult SetWindowClipRegion(
|
|
Packit |
f0b94e |
const nsTArray<LayoutDeviceIntRect>& aRects,
|
|
Packit |
f0b94e |
bool aIntersectWithExisting) override;
|
|
Packit |
f0b94e |
// Return whether this widget interprets parameters to Move and Resize APIs
|
|
Packit |
f0b94e |
// as "desktop pixels" rather than "device pixels", and therefore
|
|
Packit |
f0b94e |
// applies its GetDefaultScale() value to them before using them as mBounds
|
|
Packit |
f0b94e |
// etc (which are always stored in device pixels).
|
|
Packit |
f0b94e |
// Note that APIs that -get- the widget's position/size/bounds, rather than
|
|
Packit |
f0b94e |
// -setting- them (i.e. moving or resizing the widget) will always return
|
|
Packit |
f0b94e |
// values in the widget's device pixels.
|
|
Packit |
f0b94e |
bool BoundsUseDesktopPixels() const {
|
|
Packit |
f0b94e |
return mWindowType <= eWindowType_popup;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
// Default implementation, to be overridden by platforms where desktop coords
|
|
Packit |
f0b94e |
// are virtualized and may not correspond to device pixels on the screen.
|
|
Packit |
f0b94e |
mozilla::DesktopToLayoutDeviceScale GetDesktopToDeviceScale() override {
|
|
Packit |
f0b94e |
return mozilla::DesktopToLayoutDeviceScale(1.0);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void ConstrainPosition(bool aAllowSlop, int32_t* aX,
|
|
Packit |
f0b94e |
int32_t* aY) override {}
|
|
Packit |
f0b94e |
virtual void MoveClient(double aX, double aY) override;
|
|
Packit |
f0b94e |
virtual void ResizeClient(double aWidth, double aHeight,
|
|
Packit |
f0b94e |
bool aRepaint) override;
|
|
Packit |
f0b94e |
virtual void ResizeClient(double aX, double aY, double aWidth, double aHeight,
|
|
Packit |
f0b94e |
bool aRepaint) override;
|
|
Packit |
f0b94e |
virtual LayoutDeviceIntRect GetBounds() override;
|
|
Packit |
f0b94e |
virtual LayoutDeviceIntRect GetClientBounds() override;
|
|
Packit |
f0b94e |
virtual LayoutDeviceIntRect GetScreenBounds() override;
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult
|
|
Packit |
f0b94e |
GetRestoredBounds(LayoutDeviceIntRect& aRect) override;
|
|
Packit |
f0b94e |
virtual nsresult SetNonClientMargins(
|
|
Packit |
f0b94e |
LayoutDeviceIntMargin& aMargins) override;
|
|
Packit |
f0b94e |
virtual LayoutDeviceIntPoint GetClientOffset() override;
|
|
Packit |
f0b94e |
virtual void EnableDragDrop(bool aEnable) override{};
|
|
Packit |
f0b94e |
virtual nsresult AsyncEnableDragDrop(bool aEnable) override;
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult GetAttention(int32_t aCycleCount) override {
|
|
Packit |
f0b94e |
return NS_OK;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual bool HasPendingInputEvent() override;
|
|
Packit |
f0b94e |
virtual void SetIcon(const nsAString& aIconSpec) override {}
|
|
Packit |
f0b94e |
virtual void SetWindowTitlebarColor(nscolor aColor, bool aActive) override {}
|
|
Packit |
f0b94e |
virtual void SetDrawsInTitlebar(bool aState) override {}
|
|
Packit |
f0b94e |
virtual bool ShowsResizeIndicator(LayoutDeviceIntRect* aResizerRect) override;
|
|
Packit |
f0b94e |
virtual void FreeNativeData(void* data, uint32_t aDataType) override {}
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult BeginResizeDrag(mozilla::WidgetGUIEvent* aEvent,
|
|
Packit |
f0b94e |
int32_t aHorizontal,
|
|
Packit |
f0b94e |
int32_t aVertical) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult
|
|
Packit |
f0b94e |
BeginMoveDrag(mozilla::WidgetMouseEvent* aEvent) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual nsresult ActivateNativeMenuItemAt(
|
|
Packit |
f0b94e |
const nsAString& indexString) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual nsresult ForceUpdateNativeMenuAt(
|
|
Packit |
f0b94e |
const nsAString& indexString) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
nsresult NotifyIME(const IMENotification& aIMENotification) final;
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult StartPluginIME(
|
|
Packit |
f0b94e |
const mozilla::WidgetKeyboardEvent& aKeyboardEvent, int32_t aPanelX,
|
|
Packit |
f0b94e |
int32_t aPanelY, nsString& aCommitted) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void SetPluginFocused(bool& aFocused) override {}
|
|
Packit |
f0b94e |
virtual void SetCandidateWindowForPlugin(
|
|
Packit |
f0b94e |
const mozilla::widget::CandidateWindowPosition& aPosition) override {}
|
|
Packit |
f0b94e |
virtual void DefaultProcOfPluginEvent(
|
|
Packit |
f0b94e |
const mozilla::WidgetPluginEvent& aEvent) override {}
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult
|
|
Packit |
f0b94e |
AttachNativeKeyEvent(mozilla::WidgetKeyboardEvent& aEvent) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
bool ComputeShouldAccelerate();
|
|
Packit |
f0b94e |
virtual bool WidgetTypeSupportsAcceleration() { return true; }
|
|
Packit |
f0b94e |
virtual MOZ_MUST_USE nsresult
|
|
Packit |
f0b94e |
OnDefaultButtonLoaded(const LayoutDeviceIntRect& aButtonRect) override {
|
|
Packit |
f0b94e |
return NS_ERROR_NOT_IMPLEMENTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual already_AddRefed<nsIWidget> CreateChild(
|
|
Packit |
f0b94e |
const LayoutDeviceIntRect& aRect, nsWidgetInitData* aInitData = nullptr,
|
|
Packit |
f0b94e |
bool aForceUseIWidgetParent = false) override;
|
|
Packit |
f0b94e |
virtual void AttachViewToTopLevel(bool aUseAttachedEvents) override;
|
|
Packit |
f0b94e |
virtual nsIWidgetListener* GetAttachedWidgetListener() override;
|
|
Packit |
f0b94e |
virtual void SetAttachedWidgetListener(nsIWidgetListener* aListener) override;
|
|
Packit |
f0b94e |
virtual nsIWidgetListener* GetPreviouslyAttachedWidgetListener() override;
|
|
Packit |
f0b94e |
virtual void SetPreviouslyAttachedWidgetListener(
|
|
Packit |
f0b94e |
nsIWidgetListener* aListener) override;
|
|
Packit |
f0b94e |
TextEventDispatcher* GetTextEventDispatcher() final;
|
|
Packit |
f0b94e |
virtual TextEventDispatcherListener* GetNativeTextEventDispatcherListener()
|
|
Packit |
f0b94e |
override;
|
|
Packit |
f0b94e |
virtual void ZoomToRect(const uint32_t& aPresShellId,
|
|
Packit |
f0b94e |
const FrameMetrics::ViewID& aViewId,
|
|
Packit |
f0b94e |
const CSSRect& aRect,
|
|
Packit |
f0b94e |
const uint32_t& aFlags) override;
|
|
Packit |
f0b94e |
// Dispatch an event that must be first be routed through APZ.
|
|
Packit |
f0b94e |
nsEventStatus DispatchInputEvent(mozilla::WidgetInputEvent* aEvent) override;
|
|
Packit |
f0b94e |
void DispatchEventToAPZOnly(mozilla::WidgetInputEvent* aEvent) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void SetConfirmedTargetAPZC(
|
|
Packit |
f0b94e |
uint64_t aInputBlockId,
|
|
Packit |
f0b94e |
const nsTArray<ScrollableLayerGuid>& aTargets) const override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void UpdateZoomConstraints(
|
|
Packit |
f0b94e |
const uint32_t& aPresShellId, const FrameMetrics::ViewID& aViewId,
|
|
Packit |
f0b94e |
const mozilla::Maybe<ZoomConstraints>& aConstraints) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
bool AsyncPanZoomEnabled() const override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void NotifyWindowDestroyed();
|
|
Packit |
f0b94e |
void NotifySizeMoveDone();
|
|
Packit |
f0b94e |
void NotifyWindowMoved(int32_t aX, int32_t aY);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Register plugin windows for remote updates from the compositor
|
|
Packit |
f0b94e |
virtual void RegisterPluginWindowForRemoteUpdates() override;
|
|
Packit |
f0b94e |
virtual void UnregisterPluginWindowForRemoteUpdates() override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void SetNativeData(uint32_t aDataType, uintptr_t aVal) override{};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Should be called by derived implementations to notify on system color and
|
|
Packit |
f0b94e |
// theme changes.
|
|
Packit |
f0b94e |
void NotifySysColorChanged();
|
|
Packit |
f0b94e |
void NotifyThemeChanged();
|
|
Packit |
f0b94e |
void NotifyUIStateChanged(UIStateChangeType aShowAccelerators,
|
|
Packit |
f0b94e |
UIStateChangeType aShowFocusRings);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#ifdef ACCESSIBILITY
|
|
Packit |
f0b94e |
// Get the accessible for the window.
|
|
Packit |
f0b94e |
mozilla::a11y::Accessible* GetRootAccessible();
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Return true if this is a simple widget (that is typically not worth
|
|
Packit |
f0b94e |
// accelerating)
|
|
Packit |
f0b94e |
bool IsSmallPopup() const;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsPopupLevel PopupLevel() { return mPopupLevel; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual LayoutDeviceIntSize ClientToWindowSize(
|
|
Packit |
f0b94e |
const LayoutDeviceIntSize& aClientSize) override {
|
|
Packit |
f0b94e |
return aClientSize;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// return true if this is a popup widget with a native titlebar
|
|
Packit |
f0b94e |
bool IsPopupWithTitleBar() const {
|
|
Packit |
f0b94e |
return (mWindowType == eWindowType_popup &&
|
|
Packit |
f0b94e |
mBorderStyle != eBorderStyle_default &&
|
|
Packit |
f0b94e |
mBorderStyle & eBorderStyle_title);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void ReparentNativeWidget(nsIWidget* aNewParent) override {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual const SizeConstraints GetSizeConstraints() override;
|
|
Packit |
f0b94e |
virtual void SetSizeConstraints(const SizeConstraints& aConstraints) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void StartAsyncScrollbarDrag(
|
|
Packit |
f0b94e |
const AsyncDragMetrics& aDragMetrics) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual bool StartAsyncAutoscroll(const ScreenPoint& aAnchorLocation,
|
|
Packit |
f0b94e |
const ScrollableLayerGuid& aGuid) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void StopAsyncAutoscroll(const ScrollableLayerGuid& aGuid) override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Use this when GetLayerManager() returns a BasicLayerManager
|
|
Packit |
f0b94e |
* (nsBaseWidget::GetLayerManager() does). This sets up the widget's
|
|
Packit |
f0b94e |
* layer manager to temporarily render into aTarget.
|
|
Packit |
f0b94e |
*
|
|
Packit |
f0b94e |
* |aNaturalWidgetBounds| is the un-rotated bounds of |aWidget|.
|
|
Packit |
f0b94e |
* |aRotation| is the "virtual rotation" to apply when rendering to
|
|
Packit |
f0b94e |
* the target. When |aRotation| is ROTATION_0,
|
|
Packit |
f0b94e |
* |aNaturalWidgetBounds| is not used.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
class AutoLayerManagerSetup {
|
|
Packit |
f0b94e |
public:
|
|
Packit |
f0b94e |
AutoLayerManagerSetup(nsBaseWidget* aWidget, gfxContext* aTarget,
|
|
Packit |
f0b94e |
BufferMode aDoubleBuffering,
|
|
Packit |
f0b94e |
ScreenRotation aRotation = mozilla::ROTATION_0);
|
|
Packit |
f0b94e |
~AutoLayerManagerSetup();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
private:
|
|
Packit |
f0b94e |
nsBaseWidget* mWidget;
|
|
Packit |
f0b94e |
RefPtr<BasicLayerManager> mLayerManager;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
friend class AutoLayerManagerSetup;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual bool ShouldUseOffMainThreadCompositing();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
static nsIRollupListener* GetActiveRollupListener();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void Shutdown();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#if defined(XP_WIN)
|
|
Packit |
f0b94e |
uint64_t CreateScrollCaptureContainer() override;
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// These functions should be called at the start and end of a "live" widget
|
|
Packit |
f0b94e |
// resize (i.e. when the window contents are repainting during the resize,
|
|
Packit |
f0b94e |
// such as when the user drags a window border). It will suppress the
|
|
Packit |
f0b94e |
// displayport during the live resize to avoid unneccessary overpainting.
|
|
Packit |
f0b94e |
void NotifyLiveResizeStarted();
|
|
Packit |
f0b94e |
void NotifyLiveResizeStopped();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#if defined(MOZ_WIDGET_ANDROID)
|
|
Packit |
f0b94e |
void RecvToolbarAnimatorMessageFromCompositor(int32_t) override{};
|
|
Packit |
f0b94e |
void UpdateRootFrameMetrics(const ScreenPoint& aScrollOffset,
|
|
Packit |
f0b94e |
const CSSToScreenScale& aZoom) override{};
|
|
Packit |
f0b94e |
void RecvScreenPixels(mozilla::ipc::Shmem&& aMem,
|
|
Packit |
f0b94e |
const ScreenIntSize& aSize) override{};
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Whether context menus should only appear on mouseup instead of mousedown,
|
|
Packit |
f0b94e |
* on OSes where they normally appear on mousedown (macOS, *nix).
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
static bool ShowContextMenuAfterMouseUp();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
// These are methods for CompositorWidgetWrapper, and should only be
|
|
Packit |
f0b94e |
// accessed from that class. Derived widgets can choose which methods to
|
|
Packit |
f0b94e |
// implement, or none if supporting out-of-process compositing.
|
|
Packit |
f0b94e |
virtual bool PreRender(mozilla::widget::WidgetRenderingContext* aContext) {
|
|
Packit |
f0b94e |
return true;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void PostRender(mozilla::widget::WidgetRenderingContext* aContext) {}
|
|
Packit |
f0b94e |
virtual void DrawWindowUnderlay(
|
|
Packit |
f0b94e |
mozilla::widget::WidgetRenderingContext* aContext,
|
|
Packit |
f0b94e |
LayoutDeviceIntRect aRect) {}
|
|
Packit |
f0b94e |
virtual void DrawWindowOverlay(
|
|
Packit |
f0b94e |
mozilla::widget::WidgetRenderingContext* aContext,
|
|
Packit |
f0b94e |
LayoutDeviceIntRect aRect) {}
|
|
Packit |
f0b94e |
virtual already_AddRefed<DrawTarget> StartRemoteDrawing();
|
|
Packit |
f0b94e |
virtual already_AddRefed<DrawTarget> StartRemoteDrawingInRegion(
|
|
Packit |
f0b94e |
LayoutDeviceIntRegion& aInvalidRegion, BufferMode* aBufferMode) {
|
|
Packit |
f0b94e |
return StartRemoteDrawing();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void EndRemoteDrawing() {}
|
|
Packit |
f0b94e |
virtual void EndRemoteDrawingInRegion(DrawTarget* aDrawTarget,
|
|
Packit |
f0b94e |
LayoutDeviceIntRegion& aInvalidRegion) {
|
|
Packit |
f0b94e |
EndRemoteDrawing();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual void CleanupRemoteDrawing() {}
|
|
Packit |
f0b94e |
virtual void CleanupWindowEffects() {}
|
|
Packit |
f0b94e |
virtual bool InitCompositor(mozilla::layers::Compositor* aCompositor) {
|
|
Packit |
f0b94e |
return true;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
virtual uint32_t GetGLFrameBufferFormat();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
void ResolveIconName(const nsAString& aIconName, const nsAString& aIconSuffix,
|
|
Packit |
f0b94e |
nsIFile** aResult);
|
|
Packit |
f0b94e |
virtual void OnDestroy();
|
|
Packit |
f0b94e |
void BaseCreate(nsIWidget* aParent, nsWidgetInitData* aInitData);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual void ConfigureAPZCTreeManager();
|
|
Packit |
f0b94e |
virtual void ConfigureAPZControllerThread();
|
|
Packit |
f0b94e |
virtual already_AddRefed<GeckoContentController>
|
|
Packit |
f0b94e |
CreateRootContentController();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Dispatch an event that has already been routed through APZ.
|
|
Packit |
f0b94e |
nsEventStatus ProcessUntransformedAPZEvent(mozilla::WidgetInputEvent* aEvent,
|
|
Packit |
f0b94e |
const ScrollableLayerGuid& aGuid,
|
|
Packit |
f0b94e |
uint64_t aInputBlockId,
|
|
Packit |
f0b94e |
nsEventStatus aApzResponse);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
const LayoutDeviceIntRegion RegionFromArray(
|
|
Packit |
f0b94e |
const nsTArray<LayoutDeviceIntRect>& aRects);
|
|
Packit |
f0b94e |
void ArrayFromRegion(const LayoutDeviceIntRegion& aRegion,
|
|
Packit |
f0b94e |
nsTArray<LayoutDeviceIntRect>& aRects);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual nsresult SynthesizeNativeKeyEvent(
|
|
Packit |
f0b94e |
int32_t aNativeKeyboardLayout, int32_t aNativeKeyCode,
|
|
Packit |
f0b94e |
uint32_t aModifierFlags, const nsAString& aCharacters,
|
|
Packit |
f0b94e |
const nsAString& aUnmodifiedCharacters, nsIObserver* aObserver) override {
|
|
Packit |
f0b94e |
mozilla::widget::AutoObserverNotifier notifier(aObserver, "keyevent");
|
|
Packit |
f0b94e |
return NS_ERROR_UNEXPECTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual nsresult SynthesizeNativeMouseEvent(LayoutDeviceIntPoint aPoint,
|
|
Packit |
f0b94e |
uint32_t aNativeMessage,
|
|
Packit |
f0b94e |
uint32_t aModifierFlags,
|
|
Packit |
f0b94e |
nsIObserver* aObserver) override {
|
|
Packit |
f0b94e |
mozilla::widget::AutoObserverNotifier notifier(aObserver, "mouseevent");
|
|
Packit |
f0b94e |
return NS_ERROR_UNEXPECTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual nsresult SynthesizeNativeMouseMove(LayoutDeviceIntPoint aPoint,
|
|
Packit |
f0b94e |
nsIObserver* aObserver) override {
|
|
Packit |
f0b94e |
mozilla::widget::AutoObserverNotifier notifier(aObserver, "mouseevent");
|
|
Packit |
f0b94e |
return NS_ERROR_UNEXPECTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual nsresult SynthesizeNativeMouseScrollEvent(
|
|
Packit |
f0b94e |
LayoutDeviceIntPoint aPoint, uint32_t aNativeMessage, double aDeltaX,
|
|
Packit |
f0b94e |
double aDeltaY, double aDeltaZ, uint32_t aModifierFlags,
|
|
Packit |
f0b94e |
uint32_t aAdditionalFlags, nsIObserver* aObserver) override {
|
|
Packit |
f0b94e |
mozilla::widget::AutoObserverNotifier notifier(aObserver,
|
|
Packit |
f0b94e |
"mousescrollevent");
|
|
Packit |
f0b94e |
return NS_ERROR_UNEXPECTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual nsresult SynthesizeNativeTouchPoint(uint32_t aPointerId,
|
|
Packit |
f0b94e |
TouchPointerState aPointerState,
|
|
Packit |
f0b94e |
LayoutDeviceIntPoint aPoint,
|
|
Packit |
f0b94e |
double aPointerPressure,
|
|
Packit |
f0b94e |
uint32_t aPointerOrientation,
|
|
Packit |
f0b94e |
nsIObserver* aObserver) override {
|
|
Packit |
f0b94e |
mozilla::widget::AutoObserverNotifier notifier(aObserver, "touchpoint");
|
|
Packit |
f0b94e |
return NS_ERROR_UNEXPECTED;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* GetPseudoIMEContext() returns pseudo IME context when TextEventDispatcher
|
|
Packit |
f0b94e |
* has non-native input transaction. Otherwise, returns nullptr.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void* GetPseudoIMEContext();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
// Utility to check if an array of clip rects is equal to our
|
|
Packit |
f0b94e |
// internally stored clip rect array mClipRects.
|
|
Packit |
f0b94e |
bool IsWindowClipRegionEqual(const nsTArray<LayoutDeviceIntRect>& aRects);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Stores the clip rectangles in aRects into mClipRects.
|
|
Packit |
f0b94e |
void StoreWindowClipRegion(const nsTArray<LayoutDeviceIntRect>& aRects);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual already_AddRefed<nsIWidget> AllocateChildPopupWidget() {
|
|
Packit |
f0b94e |
static NS_DEFINE_IID(kCPopUpCID, NS_CHILD_CID);
|
|
Packit |
f0b94e |
nsCOMPtr<nsIWidget> widget = do_CreateInstance(kCPopUpCID);
|
|
Packit |
f0b94e |
return widget.forget();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
LayerManager* CreateBasicLayerManager();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsPopupType PopupType() const { return mPopupType; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
bool HasRemoteContent() const { return mHasRemoteContent; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void NotifyRollupGeometryChange() {
|
|
Packit |
f0b94e |
// XULPopupManager isn't interested in this notification, so only
|
|
Packit |
f0b94e |
// send it if gRollupListener is set.
|
|
Packit |
f0b94e |
if (gRollupListener) {
|
|
Packit |
f0b94e |
gRollupListener->NotifyGeometryChange();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Apply the current size constraints to the given size.
|
|
Packit |
f0b94e |
*
|
|
Packit |
f0b94e |
* @param aWidth width to constrain
|
|
Packit |
f0b94e |
* @param aHeight height to constrain
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void ConstrainSize(int32_t* aWidth, int32_t* aHeight) {
|
|
Packit |
f0b94e |
SizeConstraints c = GetSizeConstraints();
|
|
Packit |
f0b94e |
*aWidth = std::max(c.mMinSize.width, std::min(c.mMaxSize.width, *aWidth));
|
|
Packit |
f0b94e |
*aHeight =
|
|
Packit |
f0b94e |
std::max(c.mMinSize.height, std::min(c.mMaxSize.height, *aHeight));
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
virtual CompositorBridgeChild* GetRemoteRenderer() override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Notify the widget that this window is being used with OMTC.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
virtual void WindowUsesOMTC() {}
|
|
Packit |
f0b94e |
virtual void RegisterTouchWindow() {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsIDocument* GetDocument() const;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void EnsureTextEventDispatcher();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Notify the compositor that a device reset has occurred.
|
|
Packit |
f0b94e |
void OnRenderingDeviceReset();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
bool UseAPZ();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
bool AllowWebRenderForThisWindow();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* For widgets that support synthesizing native touch events, this function
|
|
Packit |
f0b94e |
* can be used to manage the current state of synthetic pointers. Each widget
|
|
Packit |
f0b94e |
* must maintain its own MultiTouchInput instance and pass it in as the state,
|
|
Packit |
f0b94e |
* along with the desired parameters for the changes. This function returns
|
|
Packit |
f0b94e |
* a new MultiTouchInput object that is ready to be dispatched.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
mozilla::MultiTouchInput UpdateSynthesizedTouchState(
|
|
Packit |
f0b94e |
mozilla::MultiTouchInput* aState, uint32_t aTime,
|
|
Packit |
f0b94e |
mozilla::TimeStamp aTimeStamp, uint32_t aPointerId,
|
|
Packit |
f0b94e |
TouchPointerState aPointerState, LayoutDeviceIntPoint aPoint,
|
|
Packit |
f0b94e |
double aPointerPressure, uint32_t aPointerOrientation);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Dispatch the given MultiTouchInput through APZ to Gecko (if APZ is enabled)
|
|
Packit |
f0b94e |
* or directly to gecko (if APZ is not enabled). This function must only
|
|
Packit |
f0b94e |
* be called from the main thread, and if APZ is enabled, that must also be
|
|
Packit |
f0b94e |
* the APZ controller thread.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void DispatchTouchInput(mozilla::MultiTouchInput& aInput);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#if defined(XP_WIN)
|
|
Packit |
f0b94e |
void UpdateScrollCapture() override;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* To be overridden by derived classes to return a snapshot that can be used
|
|
Packit |
f0b94e |
* during scrolling. Returning null means we won't update the container.
|
|
Packit |
f0b94e |
* @return an already AddRefed SourceSurface containing the snapshot
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
virtual already_AddRefed<SourceSurface> CreateScrollSnapshot() {
|
|
Packit |
f0b94e |
return nullptr;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Used by derived classes to create a fallback scroll image.
|
|
Packit |
f0b94e |
* @param aSnapshotDrawTarget DrawTarget to fill with fallback image.
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
void DefaultFillScrollCapture(DrawTarget* aSnapshotDrawTarget);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
RefPtr<ImageContainer> mScrollCaptureContainer;
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
// Returns whether compositing should use an external surface size.
|
|
Packit |
f0b94e |
virtual bool UseExternalCompositingSurface() const { return false; }
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
/**
|
|
Packit |
f0b94e |
* Starts the OMTC compositor destruction sequence.
|
|
Packit |
f0b94e |
*
|
|
Packit |
f0b94e |
* When this function returns, the compositor should not be
|
|
Packit |
f0b94e |
* able to access the opengl context anymore.
|
|
Packit |
f0b94e |
* It is safe to call it several times if platform implementations
|
|
Packit |
f0b94e |
* require the compositor to be destroyed before ~nsBaseWidget is
|
|
Packit |
f0b94e |
* reached (This is the case with gtk2 for instance).
|
|
Packit |
f0b94e |
*/
|
|
Packit |
f0b94e |
virtual void DestroyCompositor();
|
|
Packit |
f0b94e |
void DestroyLayerManager();
|
|
Packit |
f0b94e |
void ReleaseContentController();
|
|
Packit |
f0b94e |
void RevokeTransactionIdAllocator();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
void FreeShutdownObserver();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
nsIWidgetListener* mWidgetListener;
|
|
Packit |
f0b94e |
nsIWidgetListener* mAttachedWidgetListener;
|
|
Packit |
f0b94e |
nsIWidgetListener* mPreviouslyAttachedWidgetListener;
|
|
Packit |
f0b94e |
RefPtr<LayerManager> mLayerManager;
|
|
Packit |
f0b94e |
RefPtr<CompositorSession> mCompositorSession;
|
|
Packit |
f0b94e |
RefPtr<CompositorBridgeChild> mCompositorBridgeChild;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
mozilla::UniquePtr<mozilla::Mutex> mCompositorVsyncDispatcherLock;
|
|
Packit |
f0b94e |
RefPtr<mozilla::CompositorVsyncDispatcher> mCompositorVsyncDispatcher;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
RefPtr<IAPZCTreeManager> mAPZC;
|
|
Packit |
f0b94e |
RefPtr<GeckoContentController> mRootContentController;
|
|
Packit |
f0b94e |
RefPtr<APZEventState> mAPZEventState;
|
|
Packit |
f0b94e |
SetAllowedTouchBehaviorCallback mSetAllowedTouchBehaviorCallback;
|
|
Packit |
f0b94e |
RefPtr<WidgetShutdownObserver> mShutdownObserver;
|
|
Packit |
f0b94e |
RefPtr<TextEventDispatcher> mTextEventDispatcher;
|
|
Packit |
f0b94e |
nsCursor mCursor;
|
|
Packit |
f0b94e |
nsBorderStyle mBorderStyle;
|
|
Packit |
f0b94e |
LayoutDeviceIntRect mBounds;
|
|
Packit |
f0b94e |
LayoutDeviceIntRect* mOriginalBounds;
|
|
Packit |
f0b94e |
// When this pointer is null, the widget is not clipped
|
|
Packit |
f0b94e |
mozilla::UniquePtr<LayoutDeviceIntRect[]> mClipRects;
|
|
Packit |
f0b94e |
uint32_t mClipRectCount;
|
|
Packit |
f0b94e |
nsSizeMode mSizeMode;
|
|
Packit |
f0b94e |
nsPopupLevel mPopupLevel;
|
|
Packit |
f0b94e |
nsPopupType mPopupType;
|
|
Packit |
f0b94e |
SizeConstraints mSizeConstraints;
|
|
Packit |
f0b94e |
bool mHasRemoteContent;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
bool mUpdateCursor;
|
|
Packit |
f0b94e |
bool mUseAttachedEvents;
|
|
Packit |
f0b94e |
bool mIMEHasFocus;
|
|
Packit |
f0b94e |
bool mIsFullyOccluded;
|
|
Packit |
f0b94e |
static nsIRollupListener* gRollupListener;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
struct InitialZoomConstraints {
|
|
Packit |
f0b94e |
InitialZoomConstraints(const uint32_t& aPresShellID,
|
|
Packit |
f0b94e |
const FrameMetrics::ViewID& aViewID,
|
|
Packit |
f0b94e |
const ZoomConstraints& aConstraints)
|
|
Packit |
f0b94e |
: mPresShellID(aPresShellID),
|
|
Packit |
f0b94e |
mViewID(aViewID),
|
|
Packit |
f0b94e |
mConstraints(aConstraints) {}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
uint32_t mPresShellID;
|
|
Packit |
f0b94e |
FrameMetrics::ViewID mViewID;
|
|
Packit |
f0b94e |
ZoomConstraints mConstraints;
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
mozilla::Maybe<InitialZoomConstraints> mInitialZoomConstraints;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// This points to the resize listeners who have been notified that a live
|
|
Packit |
f0b94e |
// resize is in progress. This should always be empty when a live-resize is
|
|
Packit |
f0b94e |
// not in progress.
|
|
Packit |
f0b94e |
nsTArray<RefPtr<mozilla::LiveResizeListener>> mLiveResizeListeners;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#ifdef DEBUG
|
|
Packit |
f0b94e |
protected:
|
|
Packit |
f0b94e |
static nsAutoString debug_GuiEventToString(
|
|
Packit |
f0b94e |
mozilla::WidgetGUIEvent* aGuiEvent);
|
|
Packit |
f0b94e |
static bool debug_WantPaintFlashing();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
static void debug_DumpInvalidate(FILE* aFileOut, nsIWidget* aWidget,
|
|
Packit |
f0b94e |
const LayoutDeviceIntRect* aRect,
|
|
Packit |
f0b94e |
const char* aWidgetName, int32_t aWindowID);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
static void debug_DumpEvent(FILE* aFileOut, nsIWidget* aWidget,
|
|
Packit |
f0b94e |
mozilla::WidgetGUIEvent* aGuiEvent,
|
|
Packit |
f0b94e |
const char* aWidgetName, int32_t aWindowID);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
static void debug_DumpPaintEvent(FILE* aFileOut, nsIWidget* aWidget,
|
|
Packit |
f0b94e |
const nsIntRegion& aPaintEvent,
|
|
Packit |
f0b94e |
const char* aWidgetName, int32_t aWindowID);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
static bool debug_GetCachedBoolPref(const char* aPrefName);
|
|
Packit |
f0b94e |
#endif
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
private:
|
|
Packit |
f0b94e |
already_AddRefed<LayerManager> CreateCompositorSession(
|
|
Packit |
f0b94e |
int aWidth, int aHeight, mozilla::layers::CompositorOptions* aOptionsOut);
|
|
Packit |
f0b94e |
};
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
#endif // nsBaseWidget_h__
|