# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# =============================================
#   PLEASE DO NOT ADD MORE FLAGS TO THIS FILE
# =============================================
#
# These flags are effectively global. Your feature flag should go near the
# code it controls. Most of these items are here now because they control
# legacy global #defines passed to the compiler (now replaced with generated
# buildflag headers -- see //build/buildflag_header.gni).
#
# These flags are ui-related so should eventually be moved to various places
# in //ui/*.
#
# There is more advice on where to put build flags in the "Build flag" section
# of //build/config/BUILDCONFIG.gn.

import("//build/config/chromecast_build.gni")

declare_args() {
  # Indicates if Ash is enabled. Ash is the Aura Shell which provides a
  # desktop-like environment for Aura. Requires use_aura = true
  use_ash = is_chromeos && !is_chromecast

  # Indicates if Ozone is enabled. Ozone is a low-level library layer for Linux
  # that does not require X11. Enabling this feature disables use of glib, x11,
  # Pango, and Cairo. Default to false on non-Chromecast builds.
  use_ozone = is_chromecast && !is_android

  # Indicates if Aura is enabled. Aura is a low-level windowing library, sort
  # of a replacement for GDI or GTK.
  use_aura = is_win || is_linux

  # Whether we should use glib, a low level C utility library.
  use_glib = is_linux

  # Indicates if Wayland display server support is enabled.
  enable_wayland_server = is_chromeos

  # Enable experimental vulkan backend.
  enable_vulkan = false
}

declare_args() {
  # True means the UI is built using the "views" framework.
  toolkit_views =
      (is_mac || is_win || is_chromeos || use_aura) && !is_chromecast
}

# Additional dependent variables -----------------------------------------------
#
# These variables depend on other variables and can't be set externally.

# Use GPU accelerated cross process image transport by default on linux builds
# with the Aura window manager.
ui_compositor_image_transport = use_aura && is_linux

# Indicates if the UI toolkit depends on X11.
use_x11 = is_linux && !use_ozone

# Turn off glib if Ozone is enabled.
if (use_ozone) {
  use_glib = false
}

if (is_linux && !use_ozone) {
  use_cairo = true
  use_pango = true
} else {
  use_cairo = false
  use_pango = false
}

# Whether to use atk, the Accessibility ToolKit library
use_atk = is_desktop_linux && use_x11
# =============================================
#   PLEASE DO NOT ADD MORE FLAGS TO THIS FILE
# =============================================
#
# See comment at the top.
