2017-04-04 14:22:00 +00:00
|
|
|
/* -*- 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/. */
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef HEADLESSWIDGET_H
|
|
|
|
#define HEADLESSWIDGET_H
|
|
|
|
|
|
|
|
#include "mozilla/widget/InProcessCompositorWidget.h"
|
|
|
|
#include "nsBaseWidget.h"
|
Bug 1373739 - Make headless compositing Windows-compatible, in addition to Linux. r=dvander
To make the HeadlessCompositorWidget work under Windows as well as Linux, I had
to change the way that I hooked it into the existing CompositorWidget system.
Under GTK, the CompositorWidgetInitData and CompositorWidgetDelegate types
provided the information needed by the headless compositor widget already (the
widget client size). On Windows, however, the definitions of these types
differ, and the client size information is simply retrieved from the platform
APIs when needed.
After this patch, CompositorWidgetDelegate is renamed to
PlatformCompositorWidgetDelegate, and a new base class called
CompositorWidgetDelegate is added with "AsPlatformSpecificDelegate()" and
"AsHeadlessCompositorWidget()" methods. In non-headless mode, widgets use
AsPlatformSpecificDelegate() to access the Windows- and GTK-specific delegate
APIs. In headless mode, AsHeadlessCompositorWidget() is used to access the
singular CompositorWidget implementation for headless. Meanwhile, the
CompositorWidgetInitData IPDL type is made into a union which always contains a
headless-specific HeadlessCompositorWidgetInitData struct and under GTK and
Windows also contains an {X11,Win}CompositorWidgetInitData struct.
This also includes a small patch to ensure that the GPU process and
hardware-accelerated compositing are always disabled under headless mode. These
features weren't activated by default in the Linux environments I tested in, but
did end up activating (and then promptly crashing Firefox) when I tested on
Windows.
MozReview-Commit-ID: CocPoHBDV7H
--HG--
extra : rebase_source : 4581fa63aa3a9f32a8dc2672015a35b9be01b20f
2017-07-07 00:45:34 +00:00
|
|
|
#include "CompositorWidget.h"
|
2017-04-04 14:22:00 +00:00
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
namespace widget {
|
|
|
|
|
|
|
|
class HeadlessWidget : public nsBaseWidget
|
|
|
|
{
|
|
|
|
public:
|
Bug 1373739 - Make headless compositing Windows-compatible, in addition to Linux. r=dvander
To make the HeadlessCompositorWidget work under Windows as well as Linux, I had
to change the way that I hooked it into the existing CompositorWidget system.
Under GTK, the CompositorWidgetInitData and CompositorWidgetDelegate types
provided the information needed by the headless compositor widget already (the
widget client size). On Windows, however, the definitions of these types
differ, and the client size information is simply retrieved from the platform
APIs when needed.
After this patch, CompositorWidgetDelegate is renamed to
PlatformCompositorWidgetDelegate, and a new base class called
CompositorWidgetDelegate is added with "AsPlatformSpecificDelegate()" and
"AsHeadlessCompositorWidget()" methods. In non-headless mode, widgets use
AsPlatformSpecificDelegate() to access the Windows- and GTK-specific delegate
APIs. In headless mode, AsHeadlessCompositorWidget() is used to access the
singular CompositorWidget implementation for headless. Meanwhile, the
CompositorWidgetInitData IPDL type is made into a union which always contains a
headless-specific HeadlessCompositorWidgetInitData struct and under GTK and
Windows also contains an {X11,Win}CompositorWidgetInitData struct.
This also includes a small patch to ensure that the GPU process and
hardware-accelerated compositing are always disabled under headless mode. These
features weren't activated by default in the Linux environments I tested in, but
did end up activating (and then promptly crashing Firefox) when I tested on
Windows.
MozReview-Commit-ID: CocPoHBDV7H
--HG--
extra : rebase_source : 4581fa63aa3a9f32a8dc2672015a35b9be01b20f
2017-07-07 00:45:34 +00:00
|
|
|
HeadlessWidget();
|
2017-04-04 14:22:00 +00:00
|
|
|
|
|
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
|
|
|
|
|
|
void* GetNativeData(uint32_t aDataType) override
|
|
|
|
{
|
|
|
|
// Headless widgets have no native data.
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual nsresult Create(nsIWidget* aParent,
|
|
|
|
nsNativeWidget aNativeParent,
|
|
|
|
const LayoutDeviceIntRect& aRect,
|
|
|
|
nsWidgetInitData* aInitData = nullptr) override;
|
|
|
|
using nsBaseWidget::Create; // for Create signature not overridden here
|
|
|
|
virtual already_AddRefed<nsIWidget> CreateChild(const LayoutDeviceIntRect& aRect,
|
|
|
|
nsWidgetInitData* aInitData = nullptr,
|
|
|
|
bool aForceUseIWidgetParent = false) override;
|
|
|
|
|
2017-06-21 15:51:39 +00:00
|
|
|
virtual nsIWidget* GetTopLevelWidget() override;
|
|
|
|
|
2017-06-21 15:50:02 +00:00
|
|
|
virtual void GetCompositorWidgetInitData(mozilla::widget::CompositorWidgetInitData* aInitData) override;
|
|
|
|
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual void Show(bool aState) override;
|
|
|
|
virtual bool IsVisible() const override;
|
2017-04-26 21:29:32 +00:00
|
|
|
virtual void Move(double aX, double aY) override;
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual void Resize(double aWidth,
|
|
|
|
double aHeight,
|
|
|
|
bool aRepaint) override;
|
|
|
|
virtual void Resize(double aX,
|
|
|
|
double aY,
|
|
|
|
double aWidth,
|
|
|
|
double aHeight,
|
|
|
|
bool aRepaint) override;
|
2017-04-26 21:29:32 +00:00
|
|
|
virtual void SetSizeMode(nsSizeMode aMode) override;
|
2017-05-26 21:11:38 +00:00
|
|
|
virtual nsresult MakeFullScreen(bool aFullScreen,
|
|
|
|
nsIScreen* aTargetScreen = nullptr) override;
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual void Enable(bool aState) override;
|
|
|
|
virtual bool IsEnabled() const override;
|
2017-06-07 21:33:11 +00:00
|
|
|
virtual nsresult SetFocus(bool aRaise) override;
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual nsresult ConfigureChildren(const nsTArray<Configuration>& aConfigurations) override
|
|
|
|
{
|
|
|
|
MOZ_ASSERT_UNREACHABLE("Headless widgets do not support configuring children.");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
virtual void Invalidate(const LayoutDeviceIntRect& aRect) override
|
|
|
|
{
|
|
|
|
// TODO: see if we need to do anything here.
|
|
|
|
}
|
|
|
|
virtual nsresult SetTitle(const nsAString& title) override {
|
|
|
|
// Headless widgets have no title, so just ignore it.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2017-04-26 21:29:32 +00:00
|
|
|
virtual LayoutDeviceIntPoint WidgetToScreenOffset() override;
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual void SetInputContext(const InputContext& aContext,
|
|
|
|
const InputContextAction& aAction) override
|
|
|
|
{
|
2017-04-26 21:29:32 +00:00
|
|
|
mInputContext = aContext;
|
2017-04-04 14:22:00 +00:00
|
|
|
}
|
|
|
|
virtual InputContext GetInputContext() override
|
|
|
|
{
|
2017-04-26 21:29:32 +00:00
|
|
|
return mInputContext;
|
2017-04-04 14:22:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual LayerManager*
|
|
|
|
GetLayerManager(PLayerTransactionChild* aShadowManager = nullptr,
|
|
|
|
LayersBackend aBackendHint = mozilla::layers::LayersBackend::LAYERS_NONE,
|
|
|
|
LayerManagerPersistence aPersistence = LAYER_MANAGER_CURRENT) override;
|
|
|
|
|
Bug 1373739 - Make headless compositing Windows-compatible, in addition to Linux. r=dvander
To make the HeadlessCompositorWidget work under Windows as well as Linux, I had
to change the way that I hooked it into the existing CompositorWidget system.
Under GTK, the CompositorWidgetInitData and CompositorWidgetDelegate types
provided the information needed by the headless compositor widget already (the
widget client size). On Windows, however, the definitions of these types
differ, and the client size information is simply retrieved from the platform
APIs when needed.
After this patch, CompositorWidgetDelegate is renamed to
PlatformCompositorWidgetDelegate, and a new base class called
CompositorWidgetDelegate is added with "AsPlatformSpecificDelegate()" and
"AsHeadlessCompositorWidget()" methods. In non-headless mode, widgets use
AsPlatformSpecificDelegate() to access the Windows- and GTK-specific delegate
APIs. In headless mode, AsHeadlessCompositorWidget() is used to access the
singular CompositorWidget implementation for headless. Meanwhile, the
CompositorWidgetInitData IPDL type is made into a union which always contains a
headless-specific HeadlessCompositorWidgetInitData struct and under GTK and
Windows also contains an {X11,Win}CompositorWidgetInitData struct.
This also includes a small patch to ensure that the GPU process and
hardware-accelerated compositing are always disabled under headless mode. These
features weren't activated by default in the Linux environments I tested in, but
did end up activating (and then promptly crashing Firefox) when I tested on
Windows.
MozReview-Commit-ID: CocPoHBDV7H
--HG--
extra : rebase_source : 4581fa63aa3a9f32a8dc2672015a35b9be01b20f
2017-07-07 00:45:34 +00:00
|
|
|
void SetCompositorWidgetDelegate(CompositorWidgetDelegate* delegate) override;
|
|
|
|
|
2017-04-04 14:22:00 +00:00
|
|
|
virtual nsresult DispatchEvent(WidgetGUIEvent* aEvent,
|
|
|
|
nsEventStatus& aStatus) override;
|
|
|
|
|
|
|
|
private:
|
2017-06-21 15:51:39 +00:00
|
|
|
~HeadlessWidget();
|
2017-04-04 14:22:00 +00:00
|
|
|
bool mEnabled;
|
|
|
|
bool mVisible;
|
2017-06-21 15:51:39 +00:00
|
|
|
nsIWidget* mTopLevel;
|
Bug 1373739 - Make headless compositing Windows-compatible, in addition to Linux. r=dvander
To make the HeadlessCompositorWidget work under Windows as well as Linux, I had
to change the way that I hooked it into the existing CompositorWidget system.
Under GTK, the CompositorWidgetInitData and CompositorWidgetDelegate types
provided the information needed by the headless compositor widget already (the
widget client size). On Windows, however, the definitions of these types
differ, and the client size information is simply retrieved from the platform
APIs when needed.
After this patch, CompositorWidgetDelegate is renamed to
PlatformCompositorWidgetDelegate, and a new base class called
CompositorWidgetDelegate is added with "AsPlatformSpecificDelegate()" and
"AsHeadlessCompositorWidget()" methods. In non-headless mode, widgets use
AsPlatformSpecificDelegate() to access the Windows- and GTK-specific delegate
APIs. In headless mode, AsHeadlessCompositorWidget() is used to access the
singular CompositorWidget implementation for headless. Meanwhile, the
CompositorWidgetInitData IPDL type is made into a union which always contains a
headless-specific HeadlessCompositorWidgetInitData struct and under GTK and
Windows also contains an {X11,Win}CompositorWidgetInitData struct.
This also includes a small patch to ensure that the GPU process and
hardware-accelerated compositing are always disabled under headless mode. These
features weren't activated by default in the Linux environments I tested in, but
did end up activating (and then promptly crashing Firefox) when I tested on
Windows.
MozReview-Commit-ID: CocPoHBDV7H
--HG--
extra : rebase_source : 4581fa63aa3a9f32a8dc2672015a35b9be01b20f
2017-07-07 00:45:34 +00:00
|
|
|
HeadlessCompositorWidget* mCompositorWidget;
|
2017-05-26 21:11:38 +00:00
|
|
|
// The size mode before entering fullscreen mode.
|
|
|
|
nsSizeMode mLastSizeMode;
|
2017-07-11 20:57:25 +00:00
|
|
|
// The last size mode set while the window was visible.
|
|
|
|
nsSizeMode mEffectiveSizeMode;
|
2017-04-26 21:29:32 +00:00
|
|
|
InputContext mInputContext;
|
|
|
|
// In headless there is no window manager to track window bounds
|
|
|
|
// across size mode changes, so we must track it to emulate.
|
|
|
|
LayoutDeviceIntRect mRestoreBounds;
|
2017-07-11 20:57:25 +00:00
|
|
|
void ApplySizeModeSideEffects();
|
2017-06-21 15:51:39 +00:00
|
|
|
// Similarly, we must track the active window ourselves in order
|
|
|
|
// to dispatch (de)activation events properly.
|
|
|
|
void RaiseWindow();
|
|
|
|
static HeadlessWidget* sActiveWindow;
|
2017-04-04 14:22:00 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace widget
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif
|