# 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")
import("//mojo/public/mojo_application.gni")
import("//mojo/public/tools/bindings/mojom.gni")

group("wm_flow") {
  deps = [
    ":app",
    ":embedded",
    ":wm",
  ]
}

mojo_native_application("wm") {
  output_name = "wm_flow_wm"

  sources = [
    "wm/frame_controller.cc",
    "wm/frame_controller.h",
    "wm/wm.cc",
  ]

  deps = [
    ":wm_bindings",
    "//base",
    "//mojo/application",
    "//mojo/converters/geometry",
    "//mojo/public/interfaces/application",
    "//mojo/services/input_events/interfaces",
    "//mojo/services/view_manager/public/cpp",
    "//services/window_manager:lib",
    "//skia",
    "//ui/gfx/geometry",
    "//url",
  ]
}

mojo_native_application("app") {
  output_name = "wm_flow_app"

  sources = [
    "app/app.cc",
  ]

  deps = [
    ":embedder_bindings",
    ":embeddee_bindings",
    "//base",
    "//examples/bitmap_uploader",
    "//mojo/application",
    "//mojo/common",
    "//mojo/public/interfaces/application:application",
    "//mojo/services/view_manager/public/cpp",
    "//services/window_manager:lib",
    "//skia",
    "//url",
  ]
}

mojo_native_application("embedded") {
  output_name = "wm_flow_embedded"

  sources = [
    "embedded/embedded.cc",
  ]

  deps = [
    ":embeddee_bindings",
    ":embedder_bindings",
    "//base",
    "//examples/bitmap_uploader",
    "//mojo/application",
    "//mojo/services/view_manager/public/cpp",
    "//services/window_manager:lib",
    "//skia",
    "//url",
  ]
}

mojom("wm_bindings") {
  sources = [
    "wm/window_frame_host.mojom",
  ]
}

mojom("embedder_bindings") {
  sources = [
    "app/embedder.mojom",
  ]
}

mojom("embeddee_bindings") {
  sources = [
    "embedded/embeddee.mojom",
  ]
}
