chromium/ui/gfx/x/BUILD.gn

# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/ozone.gni")
import("//build/config/ui.gni")
import("//tools/generate_library_loader/generate_library_loader.gni")

assert(ozone_platform_x11)

declare_args() {
  regenerate_x11_protos = false
}

config("x11_private_config") {
  visibility = [ ":*" ]
  defines = [ "IS_X11_IMPL" ]
}

config("build_xprotos_config") {
  cflags = [
    "-Wno-shadow",

    # Generated proto files pull all fields from a struct into scope
    # even if they aren't used.  Rather than adding logic in the
    # generator to determine which fields are used and keeping only
    # those, simply ignore unused variable warnings.
    "-Wno-unused-variable",
  ]
}

generate_library_loader("xlib_loader") {
  name = "XlibLoader"
  output_h = "xlib_loader.h"
  output_cc = "xlib_loader.cc"
  header = "\"ui/gfx/x/xlib.h\""

  functions = [
    "XInitThreads",
    "XOpenDisplay",
    "XCloseDisplay",
    "XFlush",
    "XSynchronize",
    "XSetErrorHandler",
    "XFree",
    "XPending",
  ]
}

generate_library_loader("xlib_xcb_loader") {
  name = "XlibXcbLoader"
  output_h = "xlib_xcb_loader.h"
  output_cc = "xlib_xcb_loader.cc"
  header = "\"ui/gfx/x/xlib_xcb.h\""

  functions = [ "XGetXCBConnection" ]
}

protos = [
  "bigreq",
  "dri3",
  "glx",
  "randr",
  "render",
  "screensaver",
  "shape",
  "shm",
  "sync",
  "xfixes",
  "xinput",
  "xkb",
  "xproto",
  "xtest",

  # Unused extensions:
  # "composite",
  # "damage",
  # "dpms",
  # "dri2",
  # "ge",
  # "present",
  # "record",
  # "res",
  # "xc_misc",
  # "xevie",
  # "xf86dri",
  # "xf86vidmode",
  # "xinerama",
  # "xprint",
  # "xselinux",
  # "xv",
  # "xvmc",
]
proto_generated_files = [
  "read_error.cc",
  "extension_manager.h",
  "extension_manager.cc",
]
foreach(proto, protos) {
  proto_generated_files += [
    "${proto}.h",
    "${proto}.cc",
  ]
}

if (regenerate_x11_protos) {
  xcbproto_path = "//third_party/xcbproto/src"

  action("gen_xprotos") {
    visibility = [ ":build_xprotos" ]
    script = "gen_xproto.py"

    sources = []
    foreach(proto, protos) {
      sources += [ "$xcbproto_path/src/${proto}.xml" ]
    }

    outputs = []
    foreach(proto_generated_file, proto_generated_files) {
      outputs += [ "$target_gen_dir/$proto_generated_file" ]
    }

    args = rebase_path([
                         xcbproto_path,
                         target_gen_dir,
                       ],
                       root_build_dir) + protos
  }
} else {
  copy("gen_xprotos") {
    sources = []
    foreach(proto_generated_file, proto_generated_files) {
      sources += [ "generated_protos/$proto_generated_file" ]
    }

    outputs = [ "$target_gen_dir/{{source_file_part}}" ]
  }
}

source_set("build_xprotos") {
  visibility = [ ":x" ]
  deps = [
    ":gen_xprotos",
    "//base",
  ]
  sources = get_target_outputs(":gen_xprotos")
  configs += [
    ":build_xprotos_config",
    ":x11_private_config",
  ]
}

component("x") {
  output_name = "gfx_x11"

  sources = [
    "atom_cache.cc",
    "atom_cache.h",
    "connection.cc",
    "connection.h",
    "error.cc",
    "error.h",
    "event.cc",
    "event.h",
    "event_observer.h",
    "future.cc",
    "future.h",
    "geometry_cache.cc",
    "geometry_cache.h",
    "keyboard_state.cc",
    "keyboard_state.h",
    "property_cache.cc",
    "property_cache.h",
    "ref_counted_fd.cc",
    "ref_counted_fd.h",
    "visual_manager.cc",
    "visual_manager.h",
    "visual_picker_glx.cc",
    "visual_picker_glx.h",
    "window_cache.cc",
    "window_cache.h",
    "window_event_manager.cc",
    "window_event_manager.h",
    "wm_sync.cc",
    "wm_sync.h",
    "x11_path.cc",
    "x11_path.h",
    "xlib_support.cc",
    "xlib_support.h",
    "xproto_internal.cc",
    "xproto_internal.h",
    "xproto_types.cc",
    "xproto_types.h",
  ]
  deps = [
    ":xlib_loader",
    ":xlib_xcb_loader",
    "//base",
    "//base",
    "//base:i18n",
    "//skia",
    "//ui/events/platform",
    "//ui/gfx:gfx_switches",
    "//ui/gfx/geometry",
  ]
  public_deps = [
    ":build_xprotos",
    "//ui/gfx/x/keysyms",
  ]
  configs += [ ":x11_private_config" ]
  libs = [ "xcb" ]
}

source_set("unit_test") {
  testonly = true
  sources = [
    "connection_unittest.cc",
    "geometry_cache_unittest.cc",
    "property_cache_unittest.cc",
    "window_cache_unittest.cc",
    "wm_sync_unittest.cc",
  ]
  deps = [
    "//base",
    "//testing/gtest",
    "//ui/gfx/geometry",
    "//ui/gfx/x",
  ]
}