deprecated_gdk_sources = files('deprecated/gdkcolor.c')
gdk_sources = files(
  'gdk-private.c',
  'gdk.c',
  'gdkapplaunchcontext.c',
  'gdkcairo.c',
  'gdkcursor.c',
  'gdkdeprecated.c',
  'gdkdevice.c',
  'gdkdevicemanager.c',
  'gdkdevicepad.c',
  'gdkdisplay.c',
  'gdkdisplaymanager.c',
  'gdkdnd.c',
  'gdkevents.c',
  'gdkframetimings.c',
  'gdkgl.c',
  'gdkglcontext.c',
  'gdkglobals.c',
  'gdkkeys.c',
  'gdkkeyuni.c',
  'gdkoffscreenwindow.c',
  'gdkframeclock.c',
  'gdkframeclockidle.c',
  'gdkpango.c',
  'gdkpixbuf-drawable.c',
  'gdkproperty.c',
  'gdkrectangle.c',
  'gdkrgba.c',
  'gdkscreen.c',
  'gdkselection.c',
  'gdkvisual.c',
  'gdkwindow.c',
  'gdkwindowimpl.c',
  'gdkseat.c',
  'gdkseatdefault.c',
  'gdkdevicetool.c',
  'gdkdrawingcontext.c',
  'gdkmonitor.c'
)

gdk_gir_public_headers = files(
  'gdk.h',
  'gdk-autocleanup.h',
  'gdkapplaunchcontext.h',
  'gdkcairo.h',
  'gdkcursor.h',
  'gdkdevice.h',
  'gdkdevicetool.h',
  'gdkdevicemanager.h',
  'gdkdevicepad.h',
  'gdkdisplay.h',
  'gdkdisplaymanager.h',
  'gdkdnd.h',
  'gdkdrawingcontext.h',
  'gdkevents.h',
  'gdkframetimings.h',
  'gdkglcontext.h',
  'gdkkeys.h',
  'gdkkeysyms.h',
  'gdkmain.h',
  'gdkmonitor.h',
  'gdkpango.h',
  'gdkframeclock.h',
  'gdkpixbuf.h',
  'gdkprivate.h',
  'gdkproperty.h',
  'gdkrectangle.h',
  'gdkrgba.h',
  'gdkscreen.h',
  'gdkseat.h',
  'gdkselection.h',
  'gdktestutils.h',
  'gdkthreads.h',
  'gdktypes.h',
  'gdkvisual.h',
  'gdkwindow.h',
)
gdk_nogir_public_headers = [files('gdkkeysyms-compat.h')]
gdk_public_headers = gdk_gir_public_headers + gdk_nogir_public_headers
install_headers(gdk_public_headers, subdir : 'gtk-3.0/gdk')

deprecated_h_sources = files('deprecated/gdkcolor.h')
install_headers(deprecated_h_sources, subdir : 'gtk-3.0/gdk/deprecated')

# This variable is unused, but added just for completeness
gdk_private_headers = files(
  'gdkseatdefaultprivate.h',
  'gdkdevicetoolprivate.h',
  'gdkdrawingcontextprivate.h',
  'gdkmonitorprivate.h',
  'gdkprivate.h',
)

gdk_wayland_sources = files(
  'wayland/gdkapplaunchcontext-wayland.c',
  'wayland/gdkcursor-wayland.c',
  'wayland/gdkdevice-wayland.c',
  'wayland/gdkdisplay-wayland.c',
  'wayland/gdkdnd-wayland.c',
  'wayland/gdkeventsource.c',
  'wayland/gdkglcontext-wayland.c',
  'wayland/gdkkeys-wayland.c',
  'wayland/gdkmonitor-wayland.c',
  'wayland/gdkscreen-wayland.c',
  'wayland/gdkselection-wayland.c',
  'wayland/gdkwindow-wayland.c',
  'wayland/wm-button-layout-translation.c',
)

gdk_broadway_sources = files([
  'broadway/gdkdisplay-broadway.c',
  'broadway/gdkscreen-broadway.c',
  'broadway/broadway-output.c',
  'broadway/broadway-server.c',
  'broadway/gdkbroadway-server.c',
  'broadway/gdkcursor-broadway.c',
  'broadway/gdkvisual-broadway.c',
  'broadway/gdkselection-broadway.c',
  'broadway/gdkwindow-broadway.c',
  'broadway/gdkmonitor-broadway.c',
  'broadway/gdkkeys-broadway.c',
  'broadway/gdkglobals-broadway.c',
  'broadway/gdkeventsource.c',
  'broadway/gdkdnd-broadway.c',
  'broadway/broadwayd.c',
  'broadway/gdkdevicemanager-broadway.c',
  'broadway/gdkdevice-broadway.c',
  'broadway/broadway-buffer.c',
  'broadway/gdktestutils-broadway.c',
  'broadway/gdkproperty-broadway.c'
])

gdk_gresource_xml = configure_file(output : 'gdk.gresource.xml',
  input : 'gen-gdk-gresources-xml.py',
  command : [find_program('gen-gdk-gresources-xml.py'),
             meson.current_source_dir(), '@OUTPUT@'])

gdkresources = gnome.compile_resources('gdkresources',
  gdk_gresource_xml,
  source_dir: '.',
  c_name: '_gdk',
  extra_args: '--manual-register'
)

gdk_enums = gnome.mkenums('gdkenumtypes',
  sources: gdk_public_headers,
  c_template : 'gdkenumtypes.c.template',
  h_template : 'gdkenumtypes.h.template',
  install_dir: join_paths(gtk_includedir, 'gtk-3.0/gdk'),
  install_header : true)

gdkenum_h = gdk_enums[1]

gdk_marshalers = gnome.genmarshal('gdkmarshalers',
  sources : 'gdkmarshalers.list',
  prefix : '_gdk_marshal',
  valist_marshallers : true)

gdkmarshal_h = gdk_marshalers[1]

gdkconfig_cdata = configuration_data()
gdkconfig_cdata.set('GDK_WINDOWING_X11', x11_enabled)
gdkconfig_cdata.set('GDK_WINDOWING_WAYLAND', wayland_enabled)
gdkconfig_cdata.set('GDK_WINDOWING_WIN32', win32_enabled)
gdkconfig_cdata.set('GDK_WINDOWING_BROADWAY', broadway_enabled)

gdkconfig = configure_file(
  input  : 'gdkconfig.h.meson',
  output : 'gdkconfig.h',
  configuration : gdkconfig_cdata,
  install_dir: join_paths(gtk_includedir, 'gtk-3.0/gdk'))


gdkversion_cdata = configuration_data()
gdkversion_cdata.set('GTK_MAJOR_VERSION', gtk_major_version)
gdkversion_cdata.set('GTK_MINOR_VERSION', gtk_minor_version)
gdkversion_cdata.set('GTK_MICRO_VERSION', gtk_micro_version)
gdkversion_cdata.set('GTK_API_VERSION', gtk_api_version)
gdkversion_cdata.set('GTK_BINARY_VERSION', gtk_binary_version)
gdkversion_cdata.set('GTK_VERSION', meson.project_version())
gdkversion_cdata.set('LT_CURRENT_MINUS_AGE', gtk_soversion)

gdkversionmacros = configure_file(
  input  : 'gdkversionmacros.h.in',
  output : 'gdkversionmacros.h',
  configuration: gdkversion_cdata,
  install_dir: join_paths(gtk_includedir, 'gtk-3.0/gdk'))

gdkinc = include_directories('.')
gdkx11_inc = include_directories('x11')
gdkwayland_inc = include_directories('wayland')

wlinc = include_directories('.')

gdk_gen_headers = [gdkenum_h, gdkmarshal_h, gdkconfig, gdkversionmacros]

gdk_deps = [
  libm,
  pixbuf_dep,
  cairo_dep,
  pango_dep,
  fribidi_dep,
  cairogobj_dep,
  glib_dep,
  epoxy_dep,
  fontconfig_dep,
  platform_gio_dep,
  pangocairo_dep
]

if win32_enabled
  gdk_deps += [cc.find_library('advapi32'),
               cc.find_library('comctl32'),
               cc.find_library('dwmapi'),
               cc.find_library('imm32'),
               cc.find_library('setupapi'),
               cc.find_library('winmm')]

  gdk_rc = configure_file(
    input: 'win32/rc/gdk.rc.in',
    output: 'gdk.rc',
    configuration: gdkversion_cdata,
  )
  gdk_res = import('windows').compile_resources(gdk_rc, include_directories: include_directories('win32/rc'))
  gdk_sources += gdk_res
endif

gdk_sources = [
  # Generated
  gdkconfig,
  gdk_enums,
  gdk_marshalers,
  gdkresources,
  gdkversionmacros,
  # Static
  gdk_sources,
  deprecated_gdk_sources,
]

if wayland_enabled or broadway_enabled
  if cc.has_function('shm_open')
    shmlib = []
  elif cc.has_function('shm_open', args : '-lrt')
    shmlib = cc.find_library('rt')
  else
    shmlib = []
  endif
endif

gdk_backends = []
gdk_backends_gen_headers = []  # non-public generated headers
foreach backend : ['broadway', 'quartz', 'wayland', 'win32', 'x11']
  if get_variable('@0@_enabled'.format(backend))
    subdir(backend)
    gdk_deps += get_variable('gdk_@0@_deps'.format(backend))
    gdk_backends += get_variable('libgdk_@0@'.format(backend))
    # Special-case this for now to work around Meson bug with get_variable()
    # fallback being an empty array, or any array (#1481)
    if backend == 'wayland'
      gdk_backends_gen_headers += get_variable('gdk_@0@_gen_headers'.format(backend))
    endif
    if backend == 'quartz'
      common_cflags += ['-DGDK_WINDOWING_QUARTZ', '-xobjective-c']
    endif
  endif
endforeach

if gdk_backends.length() == 0
  error('No backends enabled')
endif

gdk_link_args = common_ldflags

# Somehow gdk_win32_display_manager_get_type is not being exported as it
# seems that it was optimized out by the MSVC linker.  Force-export it here.
if cc.get_id() == 'msvc'
  gdk_link_args += [ '-export:gdk_win32_display_manager_get_type' ]
endif

libgdk = shared_library('gdk-3',
                        soversion: gtk_soversion,
                        version: gtk_library_version,
                        sources: [gdk_sources, gdk_backends_gen_headers, gdkconfig],
                        dependencies: gdk_deps,
                        include_directories: [confinc, gdkx11_inc, wlinc],
                        c_args: [
                          '-DGDK_COMPILATION',
                          '-DG_LOG_DOMAIN="Gdk"',
                        ] + common_cflags,
                        link_whole: gdk_backends,
                        link_args: gdk_link_args,
                        darwin_versions : gtk_osxversions,
                        install: true)

gdk_dep_sources = [gdkconfig, gdkenum_h]
# Introspection
if build_gir
  gir_args = ['--quiet']

  # We may build some of the dependencies as sub-projects; this means
  # that we need to depend on the built introspection data, instead of
  # the installed one
  gdk_gir_inc = [ 'cairo-1.0', 'Gio-2.0', ]

  if pixbuf_dep.type_name() == 'internal'
    gdk_gir_inc += subproject('gdk-pixbuf').get_variable('gdkpixbuf_gir').get(0)
  else
    gdk_gir_inc += 'GdkPixbuf-2.0'
  endif

  if pango_dep.type_name() == 'internal'
    gdk_gir_inc += subproject('pango').get_variable('pango_gir').get(0)
  else
    gdk_gir_inc += 'Pango-1.0'
  endif

  gdk_gir_sources = gdk_gir_public_headers + deprecated_h_sources
  gdk_gir_sources += gdk_sources + gdk_enums + [gdkconfig]
  gdk_gir = gnome.generate_gir(libgdk,
                               sources: gdk_gir_sources,
                               namespace: 'Gdk',
                               nsversion: gtk_api_version,
                               identifier_prefix: 'Gdk',
                               symbol_prefix: 'gdk',
                               export_packages: 'gdk-3.0',
                               includes: gdk_gir_inc,
                               header: 'gdk/gdk.h',
                               install: true,
                               extra_args: gir_args + [
                                 '-DGDK_COMPILATION',
                               ])
  gdk_gir_dep = declare_dependency(sources: gdk_gir)
  gdk_dep_sources += gdk_gir

  if x11_enabled
    gdk_x11_gir = gnome.generate_gir(libgdk,
                                     sources: gdk_x11_public_headers + gdk_x11_sources,
                                     namespace: 'GdkX11',
                                     nsversion: gtk_api_version,
                                     identifier_prefix: 'Gdk',
                                     symbol_prefix: 'gdk',
                                     export_packages: 'gdk-x11-3.0',
                                     includes: gdk_gir_inc + [ gdk_gir[0], 'xlib-2.0', ],
                                     install: true,
                                     dependencies: gdk_gir_dep,
                                     header: 'gdk/gdkx.h',
                                     extra_args: gir_args + [
                                       '-DGDK_COMPILATION',
                                     ])
    gdk_dep_sources += gdk_x11_gir
  endif

  if win32_enabled
    gdk_win32_gir = gnome.generate_gir(libgdk,
                                     sources: gdk_win32_public_headers + gdk_win32_sources,
                                     namespace: 'GdkWin32',
                                     nsversion: gtk_api_version,
                                     identifier_prefix: 'Gdk',
                                     symbol_prefix: 'gdk',
                                     export_packages: 'gdk-win32-3.0',
                                     includes: gdk_gir_inc + [gdk_gir[0]],
                                     install: true,
                                     dependencies: gdk_gir_dep,
                                     header: 'gdk/gdkwin32.h',
                                     extra_args: gir_args + [
                                       '-DGDK_COMPILATION',
                                     ])
    gdk_dep_sources += gdk_win32_gir
  endif
endif

libgdk_dep = declare_dependency(
  link_with: libgdk,
  sources: gdk_dep_sources,
  include_directories: [confinc, gdkx11_inc, wlinc],
  dependencies: gdk_deps)
