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

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",
    ]

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

    defines = [ "EVENTS_OZONE_IMPLEMENTATION" ]

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

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

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

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

  if (use_evdev_gestures) {
    pkg_config("libevdev-cros") {
      packages = [ "libevdev-cros" ]
    }

    pkg_config("libgestures") {
      packages = [ "libgestures" ]
    }
  }

  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_modifiers_evdev.cc",
      "evdev/event_modifiers_evdev.h",
      "evdev/event_thread_evdev.cc",
      "evdev/event_thread_evdev.h",
      "evdev/events_ozone_evdev_export.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_noise/far_apart_taps_touch_noise_filter.cc",
      "evdev/touch_noise/far_apart_taps_touch_noise_filter.h",
      "evdev/touch_noise/horizontally_aligned_touch_noise_filter.cc",
      "evdev/touch_noise/horizontally_aligned_touch_noise_filter.h",
      "evdev/touch_noise/single_position_touch_noise_filter.cc",
      "evdev/touch_noise/single_position_touch_noise_filter.h",
      "evdev/touch_noise/touch_noise_filter.h",
      "evdev/touch_noise/touch_noise_finder.cc",
      "evdev/touch_noise/touch_noise_finder.h",
    ]

    defines = [ "EVENTS_OZONE_EVDEV_IMPLEMENTATION" ]

    deps = [
      ":events_ozone",
      ":events_ozone_layout",
      "//base",
      "//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_ozone && 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",
      ]

      public_configs += [ ":evdev_gestures" ]

      configs += [
        ":libevdev-cros",
        ":libgestures",
      ]
    }
  }
}

config("events_ozone_layout_config") {
  if (use_xkbcommon) {
    defines = [ "USE_XKBCOMMON" ]
  }
}

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",
  ]

  public_configs = [ ":events_ozone_layout_config" ]

  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" ]
  }
}
