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