# Copyright 2014 The Chromium Authors
# 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")
import("//build/config/chromeos/args.gni")
import("//build/config/chromeos/ui_mode.gni")
import("//build/config/ozone.gni")

declare_args() {
  # Indicates if the UI toolkit depends on X11.
  # Enabled by default. Can be disabled if Ozone only build is required and
  # vice-versa.
  use_x11 = is_linux && !is_chromecast && !is_chromeos_lacros

  # 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 || is_chromeos || is_fuchsia
}

declare_args() {
  # True means the UI is built using the "views" framework.
  toolkit_views = is_mac || is_win || is_linux || is_chromeos || is_fuchsia

  use_glib =
      is_linux && !is_castos &&
      !is_starboard &&
      # Avoid the need for glib when Android is building things via secondary
      # toolchains.
      target_os != "android"
}

assert(!use_glib || (is_linux && !is_castos))

use_atk = use_glib && current_toolchain == default_toolchain

# Whether using Xvfb to provide a display server for a test might be
# necessary.
use_xvfb_in_this_config =
    is_linux || (is_chromeos_lacros && !is_chromeos_device)
#
# =============================================
#   PLEASE DO NOT ADD MORE FLAGS TO THIS FILE
# =============================================
#
# See comment at the top.
