# 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/features.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")
import("//ui/base/ui_features.gni")

declare_args() {
  # Support ChromeOS touchpad gestures with ozone.
  use_evdev_gestures = false
}

if (use_xkbcommon) {
  pkg_config("xkbcommon") {
    packages = [ "xkbcommon" ]
  }
}

if (use_ozone) {
  component("events_ozone") {
    sources = [
      "chromeos/cursor_controller.cc",
      "chromeos/cursor_controller.h",
      "device/device_event.cc",
      "device/device_event.h",
      "device/device_event_observer.h",
      "device/device_manager.cc",
      "device/device_manager.h",
      "device/device_manager_manual.cc",
      "device/device_manager_manual.h",
      "device/udev/device_manager_udev.cc",
      "device/udev/device_manager_udev.h",
      "events_ozone_export.h",
      "keyboard/event_auto_repeat_handler.cc",
      "keyboard/event_auto_repeat_handler.h",
    ]

    deps = [
      "//base",
      "//base/third_party/dynamic_annotations",
      "//ui/display",
      "//ui/events",
      "//ui/events:events_base",
      "//ui/gfx",
    ]

    defines = [ "EVENTS_OZONE_IMPLEMENTATION" ]

    if (!use_udev) {
      sources -= [
        "device/udev/device_manager_udev.cc",
        "device/udev/device_manager_udev.h",
      ]
    }

    if (use_udev) {
      deps += [ "//device/udev_linux" ]
    }
  }

  config("evdev") {
    defines = [ "USE_EVDEV" ]
  }

  config("evdev_gestures") {
    defines = [ "USE_EVDEV_GESTURES" ]
  }

  if (is_linux || is_chromeos) {
    component("events_ozone_evdev") {
      sources = [
        "evdev/device_event_dispatcher_evdev.cc",
        "evdev/device_event_dispatcher_evdev.h",
        "evdev/event_converter_evdev.cc",
        "evdev/event_converter_evdev.h",
        "evdev/event_converter_evdev_impl.cc",
        "evdev/event_converter_evdev_impl.h",
        "evdev/event_device_info.cc",
        "evdev/event_device_info.h",
        "evdev/event_factory_evdev.cc",
        "evdev/event_factory_evdev.h",
        "evdev/event_thread_evdev.cc",
        "evdev/event_thread_evdev.h",
        "evdev/events_ozone_evdev_export.h",
        "evdev/gamepad_event_converter_evdev.cc",
        "evdev/gamepad_event_converter_evdev.h",
        "evdev/input_controller_evdev.cc",
        "evdev/input_controller_evdev.h",
        "evdev/input_device_factory_evdev.cc",
        "evdev/input_device_factory_evdev.h",
        "evdev/input_device_factory_evdev_proxy.cc",
        "evdev/input_device_factory_evdev_proxy.h",
        "evdev/input_device_settings_evdev.cc",
        "evdev/input_device_settings_evdev.h",
        "evdev/input_injector_evdev.cc",
        "evdev/input_injector_evdev.h",
        "evdev/keyboard_evdev.cc",
        "evdev/keyboard_evdev.h",
        "evdev/keyboard_util_evdev.cc",
        "evdev/keyboard_util_evdev.h",
        "evdev/mouse_button_map_evdev.cc",
        "evdev/mouse_button_map_evdev.h",
        "evdev/tablet_event_converter_evdev.cc",
        "evdev/tablet_event_converter_evdev.h",
        "evdev/touch_evdev_debug_buffer.cc",
        "evdev/touch_evdev_debug_buffer.h",
        "evdev/touch_evdev_types.cc",
        "evdev/touch_evdev_types.h",
        "evdev/touch_event_converter_evdev.cc",
        "evdev/touch_event_converter_evdev.h",
        "evdev/touch_filter/edge_touch_filter.cc",
        "evdev/touch_filter/edge_touch_filter.h",
        "evdev/touch_filter/false_touch_finder.cc",
        "evdev/touch_filter/false_touch_finder.h",
        "evdev/touch_filter/far_apart_taps_touch_noise_filter.cc",
        "evdev/touch_filter/far_apart_taps_touch_noise_filter.h",
        "evdev/touch_filter/horizontally_aligned_touch_noise_filter.cc",
        "evdev/touch_filter/horizontally_aligned_touch_noise_filter.h",
        "evdev/touch_filter/low_pressure_filter.cc",
        "evdev/touch_filter/low_pressure_filter.h",
        "evdev/touch_filter/single_position_touch_noise_filter.cc",
        "evdev/touch_filter/single_position_touch_noise_filter.h",
        "evdev/touch_filter/touch_filter.h",
        "gamepad/gamepad_event.cc",
        "gamepad/gamepad_event.h",
        "gamepad/gamepad_mapping.cc",
        "gamepad/gamepad_mapping.h",
        "gamepad/gamepad_observer.h",
        "gamepad/gamepad_provider_ozone.cc",
        "gamepad/gamepad_provider_ozone.h",
        "gamepad/generic_gamepad_mapping.cc",
        "gamepad/generic_gamepad_mapping.h",
        "gamepad/static_gamepad_mapping.cc",
        "gamepad/static_gamepad_mapping.h",
        "gamepad/webgamepad_constants.h",
      ]

      defines = [ "EVENTS_OZONE_EVDEV_IMPLEMENTATION" ]

      deps = [
        ":events_ozone",
        ":events_ozone_layout",
        "//base",
        "//ui/display",
        "//ui/events",
        "//ui/events:dom_keycode_converter",
        "//ui/events:events_base",
        "//ui/events/devices",
        "//ui/events/platform",
        "//ui/gfx",
        "//ui/ozone:ozone_base",
      ]

      public_configs = [ ":evdev" ]

      if (use_evdev_gestures) {
        sources += [
          "evdev/libgestures_glue/event_reader_libevdev_cros.cc",
          "evdev/libgestures_glue/event_reader_libevdev_cros.h",
          "evdev/libgestures_glue/gesture_feedback.cc",
          "evdev/libgestures_glue/gesture_feedback.h",
          "evdev/libgestures_glue/gesture_interpreter_libevdev_cros.cc",
          "evdev/libgestures_glue/gesture_interpreter_libevdev_cros.h",
          "evdev/libgestures_glue/gesture_logging.cc",
          "evdev/libgestures_glue/gesture_logging.h",
          "evdev/libgestures_glue/gesture_property_provider.cc",
          "evdev/libgestures_glue/gesture_property_provider.h",
          "evdev/libgestures_glue/gesture_timer_provider.cc",
          "evdev/libgestures_glue/gesture_timer_provider.h",
        ]

        deps += [
          "//third_party/gestures",
          "//third_party/libevdev",
        ]

        public_configs += [ ":evdev_gestures" ]
      }
    }
  }
}

component("events_ozone_layout") {
  sources = [
    "layout/events_ozone_layout_export.h",
    "layout/keyboard_layout_engine.h",
    "layout/keyboard_layout_engine_manager.cc",
    "layout/keyboard_layout_engine_manager.h",
    "layout/layout_util.cc",
    "layout/layout_util.h",
    "layout/no/no_keyboard_layout_engine.cc",
    "layout/no/no_keyboard_layout_engine.h",
    "layout/stub/stub_keyboard_layout_engine.cc",
    "layout/stub/stub_keyboard_layout_engine.h",
  ]

  defines = [ "EVENTS_OZONE_LAYOUT_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//ui/events:dom_keycode_converter",
    "//ui/events:events_base",
  ]

  if (use_xkbcommon) {
    configs += [ ":xkbcommon" ]

    sources += [
      "layout/xkb/xkb_evdev_codes.cc",
      "layout/xkb/xkb_evdev_codes.h",
      "layout/xkb/xkb_key_code_converter.h",
      "layout/xkb/xkb_keyboard_layout_engine.cc",
      "layout/xkb/xkb_keyboard_layout_engine.h",
    ]

    deps += [ "//ui/events/keycodes:xkb" ]
  }
}
