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

assert(is_win)

import("//flutter/shell/platform/glfw/config.gni")
import("//flutter/testing/testing.gni")

_public_headers = [ "public/flutter_windows.h" ]

config("relative_angle_headers") {
  include_dirs = [ "//third_party/angle/include" ]
}

# Any files that are built by clients (client_wrapper code, library headers for
# implementations using this shared code, etc.) include the public headers
# assuming they are in the include path. This configuration should be added to
# any such code that is also built by GN to make the includes work.
config("relative_flutter_windows_headers") {
  include_dirs = [ "public" ]
}

# The headers are a separate source set since the client wrapper is allowed
# to depend on the public headers, but none of the rest of the code.
source_set("flutter_windows_headers") {
  public = _public_headers

  public_deps = [
    "//flutter/shell/platform/common/cpp:common_cpp_library_headers",
  ]

  configs +=
      [ "//flutter/shell/platform/common/cpp:desktop_library_implementation" ]

  public_configs =
      [ "//flutter/shell/platform/common/cpp:relative_flutter_library_headers" ]
}

source_set("flutter_windows_source") {
  sources = [
    "angle_surface_manager.cc",
    "angle_surface_manager.h",
    "dpi_utils.cc",
    "dpi_utils.h",
    "flutter_windows.cc",
    "key_event_handler.cc",
    "key_event_handler.h",
    "keyboard_hook_handler.h",
    "platform_handler.cc",
    "platform_handler.h",
    "string_conversion.cc",
    "string_conversion.h",
    "text_input_plugin.cc",
    "text_input_plugin.h",
    "win32_flutter_window.cc",
    "win32_flutter_window.h",
    "win32_task_runner.cc",
    "win32_task_runner.h",
    "win32_window.cc",
    "win32_window.h",
    "window_state.h",
  ]

  configs += [
    "//flutter/shell/platform/common/cpp:desktop_library_implementation",
    "//third_party/angle:gl_prototypes",
  ]

  public_configs = [ ":relative_angle_headers" ]

  deps = [
    ":flutter_windows_headers",
    "//flutter/shell/platform/common/cpp:common_cpp",
    "//flutter/shell/platform/common/cpp:common_cpp_input",
    "//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
    "//flutter/shell/platform/embedder:embedder_with_symbol_prefix",
    "//flutter/shell/platform/windows/client_wrapper:client_wrapper_windows",
    "//third_party/angle:libEGL_static",  # the order of libEGL_static and libGLESv2_static is important.. if reversed, will cause a linker error DllMain already defined in LIBCMTD.lib
    "//third_party/angle:libGLESv2_static",
    "//third_party/rapidjson",
  ]
}

copy("publish_headers_windows") {
  sources = _public_headers
  outputs = [
    "$root_out_dir/{{source_file_part}}",
  ]

  # The Windows header assumes the presence of the common headers.
  deps = [
    "//flutter/shell/platform/common/cpp:publish_headers",
  ]
}

shared_library("flutter_windows") {
  deps = [
    ":flutter_windows_source",
  ]

  public_configs = [ "//flutter:config" ]
}

test_fixtures("flutter_windows_fixtures") {
  fixtures = []
}

executable("flutter_windows_unittests") {
  testonly = true

  sources = [
    "dpi_utils_unittests.cc",
    "string_conversion_unittests.cc",
    "testing/win32_flutter_window_test.cc",
    "testing/win32_flutter_window_test.h",
    "testing/win32_window_test.cc",
    "testing/win32_window_test.h",
    "win32_flutter_window_unittests.cc",
    "win32_window_unittests.cc",
  ]

  public_configs = [ "//flutter:config" ]

  deps = [
    ":flutter_windows_fixtures",
    ":flutter_windows_headers",
    ":flutter_windows_source",
    "//flutter/testing",
    "//third_party/rapidjson",
  ]
}

shared_library("flutter_windows_glfw") {
  deps = [
    "//flutter/shell/platform/glfw:flutter_glfw",
  ]

  public_configs = [ "//flutter:config" ]
}

group("windows_glfw") {
  deps = [
    ":flutter_windows",
    ":flutter_windows_glfw",
    "//flutter/shell/platform/glfw:publish_headers_glfw",
    "//flutter/shell/platform/glfw/client_wrapper:publish_wrapper_glfw",
  ]
}

group("windows") {
  deps = [
    ":flutter_windows",
    ":publish_headers_windows",
    "//flutter/shell/platform/windows/client_wrapper:publish_wrapper_windows",
  ]
  if (build_glfw_shell) {
    deps += [ ":windows_glfw" ]
  }
}
