# 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.

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

component("aura") {
  sources = [
    "client/aura_constants.cc",
    "client/aura_constants.h",
    "client/capture_client.cc",
    "client/capture_client.h",
    "client/capture_delegate.h",
    "client/cursor_client.cc",
    "client/cursor_client.h",
    "client/cursor_client_observer.h",
    "client/cursor_client_observer.cc",
    "client/default_capture_client.cc",
    "client/default_capture_client.h",
    "client/event_client.cc",
    "client/event_client.h",
    "client/focus_change_observer.cc",
    "client/focus_change_observer.h",
    "client/focus_client.cc",
    "client/focus_client.h",
    "client/screen_position_client.cc",
    "client/screen_position_client.h",
    "client/visibility_client.cc",
    "client/visibility_client.h",
    "client/window_stacking_client.cc",
    "client/window_stacking_client.h",
    "client/window_tree_client.cc",
    "client/window_tree_client.h",
    "env.cc",
    "env.h",
    "env_observer.h",
    "input_state_lookup.cc",
    "input_state_lookup.h",
    "input_state_lookup_win.cc",
    "input_state_lookup_win.h",
    "layout_manager.cc",
    "layout_manager.h",
    "scoped_window_targeter.cc",
    "scoped_window_targeter.h",
    "window.cc",
    "window.h",
    "window_event_dispatcher.cc",
    "window_event_dispatcher.h",
    "window_delegate.h",
    "window_layer_type.h",
    "window_observer.cc",
    "window_observer.h",
    "window_targeter.cc",
    "window_targeter.h",
    "window_tracker.cc",
    "window_tracker.h",
    "window_tree_host.cc",
    "window_tree_host.h",
    "window_tree_host_mac.mm",
    "window_tree_host_mac.h",
    "window_tree_host_observer.h",
    "window_tree_host_win.cc",
    "window_tree_host_win.h",
    "window_tree_host_x11.cc",
    "window_tree_host_x11.h",
    "../wm/public/activation_change_observer.h",
    "../wm/public/activation_change_observer.cc",
    "../wm/public/activation_client.cc",
    "../wm/public/activation_client.h",
    "../wm/public/activation_delegate.cc",
    "../wm/public/activation_delegate.h",
    "../wm/public/animation_host.cc",
    "../wm/public/animation_host.h",
    "../wm/public/dispatcher_client.cc",
    "../wm/public/dispatcher_client.h",
    "../wm/public/drag_drop_client.cc",
    "../wm/public/drag_drop_client.h",
    "../wm/public/drag_drop_delegate.cc",
    "../wm/public/drag_drop_delegate.h",
    "../wm/public/scoped_tooltip_disabler.cc",
    "../wm/public/scoped_tooltip_disabler.h",
    "../wm/public/tooltip_client.cc",
    "../wm/public/tooltip_client.h",
    "../wm/public/transient_window_client.cc",
    "../wm/public/transient_window_client.h",
    "../wm/public/window_move_client.cc",
    "../wm/public/window_move_client.h",
    "../wm/public/window_types.h",
  ]

  defines = [
    "AURA_IMPLEMENTATION",
  ]

  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//ui/base",
    "//ui/compositor",
    "//ui/events",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  if (use_x11) {
    configs += [
      "//build/config/linux:x11",
      "//build/config/linux:xrandr",
    ]
    deps += [
      "//ui/events/platform/x11",
    ]
  }

  if (is_win) {
    sources -= [
      "input_state_lookup.cc",
      "window_tree_host_x11.cc",
    ]
    deps += [
      "//ui/platform_window/win",
    ]
  }

  if (use_ozone) {
    sources += [
      "window_tree_host_ozone.cc",
      "window_tree_host_ozone.h",
    ]

    # TODO(GYP) enable when these targets exist.
    #deps += [
    #  "//ui/events/ozone",
    #  "//ui/ozone",
    #]
  }
}

if (false) {

source_set("test_support") {
  testonly = true
  sources = [
    "test/aura_test_base.cc",
    "test/aura_test_base.h",
    "test/aura_test_helper.cc",
    "test/aura_test_helper.h",
    "test/aura_test_utils.cc",
    "test/aura_test_utils.h",
    "test/env_test_helper.h",
    "test/event_generator_delegate_aura.cc",
    "test/event_generator_delegate_aura.h",
    "test/test_cursor_client.cc",
    "test/test_cursor_client.h",
    "test/test_focus_client.cc",
    "test/test_focus_client.h",
    "test/test_screen.cc",
    "test/test_screen.h",
    "test/test_window_tree_client.cc",
    "test/test_window_tree_client.h",
    "test/test_windows.cc",
    "test/test_windows.h",
    "test/test_window_delegate.cc",
    "test/test_window_delegate.h",
    "test/ui_controls_factory_aura.h",
    "test/window_event_dispatcher_test_api.cc",
    "test/window_event_dispatcher_test_api.h",
    "test/window_test_api.cc",
    "test/window_test_api.h",
  ]

  public_deps = [
    ":aura",
  ]
  deps = [
    "//skia",
    "//testing/gtest",
    "//ui/base:test_support",
    "//ui/compositor:test_support",
    "//ui/events",
    "//ui/events:events_base",
    "//ui/events:test_support",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/wm",
  ]

  if (is_win) {
    cflags = [
      "/wd4267", # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    ]
  }

  if (use_aura) {
    if (is_win) {
      sources += [
        "test/ui_controls_factory_aurawin.cc",
      ]
    }

    if (use_x11) {
      sources += [
        "test/ui_controls_factory_aurax11.cc",
      ]
    }
  }
}

executable("demo") {
  output_name = "aura_demo"
  testonly = true

  sources = [
    "demo/demo_main.cc",
  ]

  deps = [
    ":aura",
    ":test_support",
    "//base",
    "//base:i18n",
    "//skia",
    "//third_party/icu",
    "//ui/base",
    "//ui/compositor",
    "//ui/compositor:test_support",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (use_x11) {
    deps += [
      "//ui/gfx/x",
    ]
  }
}

executable("bench") {
  output_name = "aura_bench"
  testonly = true

  sources = [
    "bench/bench_main.cc",
  ]

  deps = [
    ":test_support",
    "//base",
    "//base:i18n",
    "//cc",
    "//gpu/command_buffer/client:gles2_interface",
    "//skia",
    "//third_party/icu",
    "//ui/base",
    "//ui/compositor",
    "//ui/compositor:test_support",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (use_x11) {
    deps += [
      "//ui/gfx/x",
    ]
  }
}

test("aura_unittests") {
  sources = [
    "gestures/gesture_recognizer_unittest.cc",
    "test/run_all_unittests.cc",
    "window_event_dispatcher_unittest.cc",
    "window_targeter_unittest.cc",
    "window_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//base/allocator",
    "//base/test:test_support",
    "//skia",
    "//testing/gtest",
    "//ui/base:test_support",
    "//ui/compositor:test_support",
    "//ui/events:test_support",
    "//ui/events:gesture_detection",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gl",
  ]

  if (is_linux) {
    deps += [
      "//third_party/mesa",
    ]
  }
}

}  # if (false)
