blob: 3baa288954046d59af1192c75f7ada25ab7090ec [file] [edit]
//
// Copyright 2026 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// window_system.cpp: Shared X11-vs-Wayland selection policy for Ozone/Linux.
#include "common/linux/window_system.h"
#include "common/system_utils.h"
namespace angle
{
bool IsWaylandDisplay()
{
return !GetEnvironmentVar("WAYLAND_DISPLAY").empty();
}
bool IsWaylandSession()
{
// Any one of these is enough, as none is always present: XDG_SESSION_TYPE is
// only set by pam_systemd so it is absent under su and cron, and
// DESKTOP_SESSION is a display-manager convention whose value varies by
// distribution. Both describe the login session and stay true under
// XWayland, which is why they inform driver workarounds but not selection.
return IsWaylandDisplay() || GetEnvironmentVar("XDG_SESSION_TYPE") == "wayland" ||
GetEnvironmentVar("DESKTOP_SESSION").find("wayland") != std::string::npos;
}
WindowSystem GetWindowSystemFromEnvironment()
{
// A named compositor socket means connect to it directly rather than going
// through XWayland.
return IsWaylandDisplay() ? WindowSystem::Wayland : WindowSystem::X11;
}
WindowSystem ChoosePreferredWindowSystem(bool x11Compiled,
bool waylandCompiled,
WindowSystem preferred)
{
if (preferred == WindowSystem::X11 && x11Compiled)
{
return WindowSystem::X11;
}
if (preferred == WindowSystem::Wayland && waylandCompiled)
{
return WindowSystem::Wayland;
}
// The preference is not compiled in, so take whichever backend is.
if (x11Compiled)
{
return WindowSystem::X11;
}
if (waylandCompiled)
{
return WindowSystem::Wayland;
}
return WindowSystem::Unspecified;
}
} // namespace angle