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

visibility = [ "//ui/ozone/*" ]

import("//build/config/linux/pkg_config.gni")

pkg_config("wayland-egl") {
  packages = [ "wayland-egl" ]
}

source_set("wayland") {
  sources = [
    "client_native_pixmap_factory_wayland.cc",
    "client_native_pixmap_factory_wayland.h",
    "gl_surface_wayland.cc",
    "gl_surface_wayland.h",
    "ozone_platform_wayland.cc",
    "ozone_platform_wayland.h",
    "wayland_connection.cc",
    "wayland_connection.h",
    "wayland_cursor.cc",
    "wayland_cursor.h",
    "wayland_data_device.cc",
    "wayland_data_device.h",
    "wayland_data_offer.cc",
    "wayland_data_offer.h",
    "wayland_data_source.cc",
    "wayland_data_source.h",
    "wayland_keyboard.cc",
    "wayland_keyboard.h",
    "wayland_object.cc",
    "wayland_object.h",
    "wayland_output.cc",
    "wayland_output.h",
    "wayland_pointer.cc",
    "wayland_pointer.h",
    "wayland_surface_factory.cc",
    "wayland_surface_factory.h",
    "wayland_touch.cc",
    "wayland_touch.h",
    "wayland_window.cc",
    "wayland_window.h",
    "xdg_surface_wrapper.cc",
    "xdg_surface_wrapper.h",
    "xdg_surface_wrapper_v5.cc",
    "xdg_surface_wrapper_v5.h",
    "xdg_surface_wrapper_v6.cc",
    "xdg_surface_wrapper_v6.h",
  ]

  import("//ui/base/ui_features.gni")
  if (use_xkbcommon) {
    sources += [
      "wayland_xkb_keyboard_layout_engine.cc",
      "wayland_xkb_keyboard_layout_engine.h",
    ]
    configs += [ "//ui/events/ozone:xkbcommon" ]
  }

  deps = [
    "//base",
    "//skia",
    "//third_party/wayland:wayland_client",
    "//third_party/wayland-protocols:xdg_shell_protocol",
    "//ui/base",
    "//ui/base:ui_features",
    "//ui/display/manager",
    "//ui/events",
    "//ui/events:dom_keycode_converter",
    "//ui/events/ozone:events_ozone",
    "//ui/events/ozone:events_ozone_layout",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/ozone:ozone_base",
    "//ui/ozone/common",
    "//ui/platform_window",
  ]

  defines = [ "OZONE_IMPLEMENTATION" ]

  configs += [
    ":wayland-egl",
    "//third_party/khronos:khronos_headers",
  ]
}

source_set("wayland_unittests") {
  testonly = true

  sources = [
    "fake_server.cc",
    "fake_server.h",
    "wayland_connection_unittest.cc",
    "wayland_data_device_unittest.cc",
    "wayland_keyboard_unittest.cc",
    "wayland_pointer_unittest.cc",
    "wayland_surface_factory_unittest.cc",
    "wayland_test.cc",
    "wayland_test.h",
    "wayland_touch_unittest.cc",
    "wayland_window_unittest.cc",
  ]

  deps = [
    ":wayland",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/wayland:wayland_server",
    "//third_party/wayland-protocols:xdg_shell_protocol",
    "//ui/base:ui_features",
    "//ui/events/ozone:events_ozone_layout",
    "//ui/ozone:platform",
    "//ui/ozone:test_support",
  ]

  import("//ui/base/ui_features.gni")
  if (use_xkbcommon) {
    deps += [ "//ui/events/keycodes:xkb" ]
  }

  defines = [ "WL_HIDE_DEPRECATED" ]
}
