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