| // | |
| // 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 |