diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -343,16 +343,24 @@ # include # ifdef MOZ_WAYLAND # include # include "mozilla/widget/nsWaylandDisplay.h" # endif +# ifdef MOZ_WAYLAND_PROXY +# include "wayland-proxy.h" +# endif # ifdef MOZ_X11 # include # endif /* MOZ_X11 */ #endif #include "BinaryPath.h" +#ifdef MOZ_LOGGING +# include "mozilla/Logging.h" +extern mozilla::LazyLogModule gWidgetWaylandLog; +#endif /* MOZ_LOGGING */ + #ifdef FUZZING # include "FuzzerRunner.h" namespace mozilla { FuzzerRunner* fuzzerRunner = 0; @@ -3670,10 +3678,13 @@ class XREMain { public: XREMain() = default; ~XREMain() { +#if defined(MOZ_WAYLAND_PROXY) + mWaylandProxy = nullptr; +#endif mScopedXPCOM = nullptr; mAppData = nullptr; } int XRE_main(int argc, char* argv[], const BootstrapConfig& aConfig); @@ -3689,10 +3700,13 @@ nsCOMPtr mProfLD; nsCOMPtr mProfileLock; #if defined(MOZ_HAS_REMOTE) RefPtr mRemoteService; #endif +#if defined(MOZ_WAYLAND_PROXY) + std::unique_ptr mWaylandProxy; +#endif UniquePtr mScopedXPCOM; UniquePtr mAppData; nsXREDirProvider mDirProvider; @@ -4709,20 +4723,34 @@ #if defined(MOZ_WIDGET_GTK) if (!isBackgroundTaskMode && !gfxPlatform::IsHeadless()) { const char* display_name = nullptr; bool saveDisplayArg = false; + bool waylandEnabled = IsWaylandEnabled(); +# ifdef MOZ_WAYLAND_PROXY + auto* proxyEnv = getenv("MOZ_DISABLE_WAYLAND_PROXY"); + bool disableWaylandProxy = proxyEnv && *proxyEnv; + if (!disableWaylandProxy && XRE_IsParentProcess() && waylandEnabled) { + mWaylandProxy = WaylandProxy::Create(); + mWaylandProxy->RunThread(); +# ifdef MOZ_LOGGING + if (MOZ_LOG_TEST(gWidgetWaylandLog, mozilla::LogLevel::Debug)) { + mWaylandProxy->SetVerbose(true); + } +# endif + } +# endif + // display_name is owned by gdk. display_name = gdk_get_display_arg_name(); // if --display argument is given make sure it's // also passed to ContentChild::Init() by MOZ_GDK_DISPLAY. if (display_name) { SaveWordToEnv("MOZ_GDK_DISPLAY", nsDependentCString(display_name)); saveDisplayArg = true; } - bool waylandEnabled = IsWaylandEnabled(); // On Wayland disabled builds read X11 DISPLAY env exclusively // and don't care about different displays. if (!waylandEnabled && !display_name) { display_name = PR_GetEnv("DISPLAY"); if (!display_name) { @@ -5953,10 +5981,15 @@ // appropriately when necessary. if (!gfxPlatform::IsHeadless()) { # ifdef MOZ_WAYLAND WaylandDisplayRelease(); # endif +# ifdef MOZ_WAYLAND_PROXY + if (mWaylandProxy) { + mWaylandProxy = nullptr; + } +# endif } #endif XRE_DeinitCommandLine();