1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6 #include "GtkCompositorWidget.h"
7
8 #include "gfxPlatformGtk.h"
9 #include "mozilla/layers/CompositorThread.h"
10 #include "mozilla/widget/InProcessCompositorWidget.h"
11 #include "mozilla/widget/PlatformWidgetTypes.h"
12 #include "nsWindow.h"
13
14 namespace mozilla {
15 namespace widget {
16
GtkCompositorWidget(const GtkCompositorWidgetInitData & aInitData,const layers::CompositorOptions & aOptions,nsWindow * aWindow)17 GtkCompositorWidget::GtkCompositorWidget(
18 const GtkCompositorWidgetInitData& aInitData,
19 const layers::CompositorOptions& aOptions, nsWindow* aWindow)
20 : CompositorWidget(aOptions), mWidget(aWindow) {
21 // If we have a nsWindow, then grab the already existing display connection
22 // If we don't, then use the init data to connect to the display
23 if (aWindow) {
24 mXDisplay = aWindow->XDisplay();
25 } else {
26 mXDisplay = XOpenDisplay(aInitData.XDisplayString().get());
27 }
28
29 #ifdef MOZ_WAYLAND
30 if (!aInitData.IsX11Display()) {
31 if (!aWindow) {
32 NS_WARNING("GtkCompositorWidget: We're missing nsWindow!");
33 }
34 mProvider.Initialize(aWindow);
35 } else
36 #endif
37 {
38 mXWindow = (Window)aInitData.XWindow();
39
40 // Grab the window's visual and depth
41 XWindowAttributes windowAttrs;
42 if (!XGetWindowAttributes(mXDisplay, mXWindow, &windowAttrs)) {
43 NS_WARNING("GtkCompositorWidget(): XGetWindowAttributes() failed!");
44 }
45
46 Visual* visual = windowAttrs.visual;
47 int depth = windowAttrs.depth;
48
49 // Initialize the window surface provider
50 mProvider.Initialize(mXDisplay, mXWindow, visual, depth,
51 aInitData.Shaped());
52 }
53 mClientSize = aInitData.InitialClientSize();
54 }
55
~GtkCompositorWidget()56 GtkCompositorWidget::~GtkCompositorWidget() {
57 mProvider.CleanupResources();
58
59 // If we created our own display connection, we need to destroy it
60 if (!mWidget && mXDisplay) {
61 XCloseDisplay(mXDisplay);
62 mXDisplay = nullptr;
63 }
64 }
65
StartRemoteDrawing()66 already_AddRefed<gfx::DrawTarget> GtkCompositorWidget::StartRemoteDrawing() {
67 return nullptr;
68 }
EndRemoteDrawing()69 void GtkCompositorWidget::EndRemoteDrawing() {}
70
71 already_AddRefed<gfx::DrawTarget>
StartRemoteDrawingInRegion(LayoutDeviceIntRegion & aInvalidRegion,layers::BufferMode * aBufferMode)72 GtkCompositorWidget::StartRemoteDrawingInRegion(
73 LayoutDeviceIntRegion& aInvalidRegion, layers::BufferMode* aBufferMode) {
74 return mProvider.StartRemoteDrawingInRegion(aInvalidRegion, aBufferMode);
75 }
76
EndRemoteDrawingInRegion(gfx::DrawTarget * aDrawTarget,const LayoutDeviceIntRegion & aInvalidRegion)77 void GtkCompositorWidget::EndRemoteDrawingInRegion(
78 gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) {
79 mProvider.EndRemoteDrawingInRegion(aDrawTarget, aInvalidRegion);
80 }
81
RealWidget()82 nsIWidget* GtkCompositorWidget::RealWidget() { return mWidget; }
83
NotifyClientSizeChanged(const LayoutDeviceIntSize & aClientSize)84 void GtkCompositorWidget::NotifyClientSizeChanged(
85 const LayoutDeviceIntSize& aClientSize) {
86 mClientSize = aClientSize;
87 }
88
GetClientSize()89 LayoutDeviceIntSize GtkCompositorWidget::GetClientSize() { return mClientSize; }
90
GetWidgetKey()91 uintptr_t GtkCompositorWidget::GetWidgetKey() {
92 return reinterpret_cast<uintptr_t>(mWidget);
93 }
94
GetEGLNativeWindow()95 EGLNativeWindowType GtkCompositorWidget::GetEGLNativeWindow() {
96 return mWidget
97 ? (EGLNativeWindowType)mWidget->GetNativeData(NS_NATIVE_EGL_WINDOW)
98 : nullptr;
99 }
100
101 #ifdef MOZ_WAYLAND
SetEGLNativeWindowSize(const LayoutDeviceIntSize & aEGLWindowSize)102 void GtkCompositorWidget::SetEGLNativeWindowSize(
103 const LayoutDeviceIntSize& aEGLWindowSize) {
104 if (mWidget) {
105 mWidget->SetEGLNativeWindowSize(aEGLWindowSize);
106 }
107 }
108 #endif
109
110 } // namespace widget
111 } // namespace mozilla
112