diff --git a/build-aux/meson/post-install.sh b/build-aux/meson/post-install.sh new file mode 100755 index 0000000000..3471336bdb --- /dev/null +++ b/build-aux/meson/post-install.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +gtk_api_version=$1 +gtk_abi_version=$2 +gtk_libdir=$3 +gtk_datadir=$4 + +# Package managers set this so we don't need to run +if [ -z "$DESTDIR" ]; then + echo Compiling GSettings schemas... + glib-compile-schemas ${gtk_datadir}/glib-2.0/schemas + + echo Updating desktop database... + update-desktop-database -q ${gtk_datadir}/applications + + echo Updating icon cache... + gtk-update-icon-cache -q -t -f ${gtk_datadir}/icons/hicolor + + echo Updating module cache for print backends... + mkdir -p ${gtk_libdir}/gtk-3.0/3.0.0/printbackends + gio-querymodules ${gtk_libdir}/gtk-3.0/3.0.0/printbackends + + echo Updating module cache for input methods... + mkdir -p ${gtk_libdir}/gtk-3.0/3.0.0/immodules + gio-querymodules ${gtk_libdir}/gtk-3.0/3.0.0/immodules +fi diff --git a/config.h.meson b/config.h.meson new file mode 100644 index 0000000000..9fd690f966 --- /dev/null +++ b/config.h.meson @@ -0,0 +1,329 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* always defined to indicate that i18n is enabled */ +#mesondefine ENABLE_NLS + +/* The prefix for our gettext translation domains. */ +#mesondefine GETTEXT_PACKAGE + +/* Disable deprecation warnings from glib */ +#mesondefine GLIB_DISABLE_DEPRECATION_WARNINGS + +/* Define the location where the catalogs will be installed */ +#mesondefine GTK_LOCALEDIR + +/* Define to 1 if you have the `bind_textdomain_codeset' function. */ +#mesondefine HAVE_BIND_TEXTDOMAIN_CODESET + +/* define if we have colord */ +#mesondefine HAVE_COLORD + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_CRT_EXTERNS_H + +/* Define to 1 if CUPS 1.6 API is available */ +#mesondefine HAVE_CUPS_API_1_6 + +/* Define to 1 if you have the `dcgettext' function. */ +#mesondefine HAVE_DCGETTEXT + +/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. + */ +#mesondefine HAVE_DECL_ISINF + +/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. + */ +#mesondefine HAVE_DECL_ISNAN + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_FTW_H + +/* Define to 1 if you have the `getpagesize' function. */ +#mesondefine HAVE_GETPAGESIZE + +/* Define to 1 if you have the `getresuid' function. */ +#mesondefine HAVE_GETRESUID + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#mesondefine HAVE_GETTEXT + +/* Define if gio-unix is available */ +#mesondefine HAVE_GIO_UNIX + +/* Have GNU ftw */ +#mesondefine HAVE_GNU_FTW + +/* Define to 1 if you have the `httpGetAuthString' function. */ +#mesondefine HAVE_HTTPGETAUTHSTRING + +/* Define if cups http_t authstring field is accessible */ +#mesondefine HAVE_HTTP_AUTHSTRING + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_INTTYPES_H + +/* Define to 1 if the system has the type `IPrintDialogCallback'. */ +#mesondefine HAVE_IPRINTDIALOGCALLBACK + +/* Define if your file defines LC_MESSAGES. */ +#mesondefine HAVE_LC_MESSAGES + +/* Define to 1 if you have the `m' library (-lm). */ +#mesondefine HAVE_LIBM + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime_r' function. */ +#mesondefine HAVE_LOCALTIME_R + +/* Define to 1 if you have the `lstat' function. */ +#mesondefine HAVE_LSTAT + +/* Define to 1 if you have the `mallinfo' function. */ +#mesondefine HAVE_MALLINFO + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_MEMORY_H + +/* Define to 1 if you have the `mkstemp' function. */ +#mesondefine HAVE_MKSTEMP + +/* Define to 1 if you have a working `mmap' system call. */ +#mesondefine HAVE_MMAP + +/* Define to 1 if you have the `nearbyint' function. */ +#mesondefine HAVE_NEARBYINT + +/* Define to 1 if libpapi available */ +#mesondefine HAVE_PAPI + +/* Define to 1 if you have the `posix_fallocate' function. */ +#mesondefine HAVE_POSIX_FALLOCATE + +/* Have the Xrandr extension library */ +#mesondefine HAVE_RANDR + +/* Have the Xrandr 1.5 extension library */ +#mesondefine HAVE_RANDR15 + +/* Define to 1 if you have the `rint' function. */ +#mesondefine HAVE_RINT + +/* Define to 1 if you have the `round' function. */ +#mesondefine HAVE_ROUND + +/* Define to 1 if you have the `sincos' function. */ +#mesondefine HAVE_SINCOS + +/* Define to 1 if you have the `log2` function */ +#mesondefine HAVE_LOG2 + +/* Define to 1 if you ahve the `exp2` function */ +#mesondefine HAVE_EXP2 + +/* Have the sockaddr_un.sun_len member */ +#mesondefine HAVE_SOCKADDR_UN_SUN_LEN + +/* Define to 1 if solaris xinerama is available */ +#mesondefine HAVE_SOLARIS_XINERAMA + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_SYS_STAT_H + +/* Define to 1 if sys/sysinfo.h is available */ +#mesondefine HAVE_SYS_SYSINFO_H + +/* Define to 1 if sys/systeminfo.h is available */ +#mesondefine HAVE_SYS_SYSTEMINFO_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#mesondefine HAVE_UNISTD_H + +/* Have the XCOMPOSITE X extension */ +#mesondefine HAVE_XCOMPOSITE + +/* Have the Xcursor library */ +#mesondefine HAVE_XCURSOR + +/* Have the XDAMAGE X extension */ +#mesondefine HAVE_XDAMAGE + +/* Have the XFIXES X extension */ +#mesondefine HAVE_XFIXES + +/* Define to 1 if XFree Xinerama is available */ +#mesondefine HAVE_XFREE_XINERAMA + +/* Have XGenericEvent */ +#mesondefine HAVE_XGENERICEVENTS + +/* Define to 1 if xinerama is available */ +#mesondefine HAVE_XINERAMA + +/* Define to use XKB extension */ +#mesondefine HAVE_XKB + +/* Have the SYNC extension library */ +#mesondefine HAVE_XSYNC + +/* Define to 1 if you have the `_lock_file' function */ +#mesondefine HAVE__LOCK_FILE + +/* Define to 1 if you have the `flockfile' function */ +#mesondefine HAVE_FLOCKFILE + +/* Define if _NL_MEASUREMENT_MEASUREMENT is available */ +#mesondefine HAVE__NL_MEASUREMENT_MEASUREMENT + +/* Define if _NL_PAPER_HEIGHT is available */ +#mesondefine HAVE__NL_PAPER_HEIGHT + +/* Define if _NL_PAPER_WIDTH is available */ +#mesondefine HAVE__NL_PAPER_WIDTH + +/* Define if _NL_TIME_FIRST_WEEKDAY is available */ +#mesondefine HAVE__NL_TIME_FIRST_WEEKDAY + +/* Define to 1 if you have the `_NSGetEnviron' function. */ +#mesondefine HAVE__NSGETENVIRON + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#mesondefine LT_OBJDIR + +/* Define if needed for xReply */ +#mesondefine NEED_XIPROTO_H_FOR_XREPLY + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#mesondefine NO_MINUS_C_MINUS_O + +/* Define to the address where bug reports for this package should be sent. */ +#mesondefine PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#mesondefine PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#mesondefine PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#mesondefine PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#mesondefine PACKAGE_URL + +/* Define to the version of this package. */ +#mesondefine PACKAGE_VERSION + +/* Use NSBundle functions to determine load paths for libraries, translations, + etc. */ +#mesondefine QUARTZ_RELOCATION + +/* Define to 1 if you have the ANSI C header files. */ +#mesondefine STDC_HEADERS + +/* Define to 1 if gmodule works and should be used */ +#mesondefine USE_GMODULE + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define to 1 if XInput 2.0 is available */ +#mesondefine XINPUT_2 + +/* Define to 1 if XInput 2.2 is available */ +#mesondefine XINPUT_2_2 + +/* Define to 1 if the X Window System is missing or not being used. */ +#mesondefine X_DISPLAY_MISSING + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#mesondefine _FILE_OFFSET_BITS + +/* defines how to decorate public symbols while building */ +#mesondefine _GDK_EXTERN + +/* Define for large files, on AIX-style hosts. */ +#mesondefine _LARGE_FILES + +/* Define to 1 if on MINIX. */ +#mesondefine _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#mesondefine _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#mesondefine _POSIX_SOURCE + +/* Define to `int' if doesn't define. */ +#mesondefine gid_t + +/* Define to `int' if doesn't define. */ +#mesondefine uid_t + +/* Define to 1 if linux/memfd.h exists */ +#mesondefine HAVE_LINUX_MEMFD_H + +#mesondefine GTK_LOCALEDIR + +#mesondefine GTK_DATADIR + +#mesondefine GTK_LIBDIR + +#mesondefine HAVE_LINUX_INPUT_H + +#mesondefine HAVE_DEV_EVDEV_INPUT_H + +#mesondefine HAVE_TRUNC diff --git a/demos/gtk-demo/geninclude.py b/demos/gtk-demo/geninclude.py new file mode 100755 index 0000000000..57038a43b8 --- /dev/null +++ b/demos/gtk-demo/geninclude.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +import re +import os +from collections import * + +out_file = sys.argv[1] +in_files = sys.argv[2:] + + +file_output = """ +typedef GtkWidget *(*GDoDemoFunc) (GtkWidget *do_widget); + +typedef struct _Demo Demo; + +struct _Demo +{ + gchar *name; + gchar *title; + gchar *filename; + GDoDemoFunc func; + Demo *children; +}; + +""" + +# Demo = namedtuple('Demo', ['name', 'title', 'file', 'func']) + +demos = [] + +for demo_file in in_files: + filename = demo_file[demo_file.rfind('/')+1:] + demo_name = filename.replace(".c", "") + with open(demo_file, 'r') as f: + title = f.readline().replace("/*", "").strip() + + + file_output += "GtkWidget *do_" + demo_name + " (GtkWidget *do_widget);\n" + # demos += Demo(name = demo_name, + # title = title, + # file = demo_file, + # func = "do_" + title) + demos.append((demo_name, title, filename, "do_" + demo_name, -1)) + +# Generate a List of "Parent names" +parents = [] +parent_ids = [] +parent_index = 0 +for demo in demos: + if "/" in demo[1]: + slash_index = demo[1].index('/') + parent_name = demo[1][:slash_index] + do_break = False + + # Check for duplicates + if not parent_name in parents: + parents.append(parent_name) + parent_ids.append(parent_index) + demos.append(("NULL", parent_name, "NULL", "NULL", parent_index)) + + parent_index = parent_index + 1 + + +# For every child with a parent, generate a list of child demos +i = 0 +for parent in parents: + id = parent_ids[i] + file_output += "\nDemo child" + str(id) + "[] = {\n" + # iterate over all demos and check if the name starts with the given parent name + for child in demos: + if child[1].startswith(parent + "/"): + title = child[1][child[1].rfind('/') + 1:] + file_output += " { \"" + child[0] + "\", \"" + title + "\", \"" + child[2] + "\", " + child[3] + ", NULL },\n" + + + file_output += " { NULL }\n};\n" + i = i + 1 + + +# Sort demos by title +demos = sorted(demos, key=lambda x: x[1]) + +file_output += "\nDemo gtk_demos[] = {\n" +for demo in demos: + # Do not generate one of these for demos with a parent demo + if "/" not in demo[1]: + child_array = "NULL" + name = demo[0]; + title = demo[1]; + file = demo[2] + if name != "NULL": + name = "\"" + name + "\"" + if title != "NULL": + title = "\"" + title + "\"" + if file != "NULL": + file = "\"" + file + "\"" + + if demo[4] != -1: + child_array = "child" + str(demo[4]) + file_output += " { " + name + ", " + title + ", " + file + ", " + demo[3] + ", " + child_array + " },\n" + +file_output += " { NULL }\n};\n" + +ofile = open(out_file, "w") +ofile.write(file_output) +ofile.close() diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index ee44a8530f..4a4489231a 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -75,7 +75,7 @@ gtkdemo_deps = [libgtk_dep] if harfbuzz_dep.found() and pangoft_dep.found() demos += files('font_features.c') - gtkdemo_deps += harfbuzz_dep + gtkdemo_deps += [harfbuzz_dep, pangoft_dep] endif if os_unix @@ -108,6 +108,5 @@ gtkdemo = executable( gtkdemo_resources, dependencies: gtkdemo_deps, include_directories : confinc, - gui_app: true, install: true ) diff --git a/demos/icon-browser/meson.build b/demos/icon-browser/meson.build index 661e5208c8..8bd7e9e5bb 100644 --- a/demos/icon-browser/meson.build +++ b/demos/icon-browser/meson.build @@ -17,6 +17,5 @@ iconbrowser = executable( iconbrowser_resources, dependencies: libgtk_dep, include_directories : confinc, - gui_app: true, install: true ) diff --git a/demos/widget-factory/meson.build b/demos/widget-factory/meson.build index 170a59e4bc..184a8abbb4 100644 --- a/demos/widget-factory/meson.build +++ b/demos/widget-factory/meson.build @@ -15,6 +15,5 @@ widget_factory = executable( widgetfactory_resources, dependencies: libgtk_dep, include_directories : confinc, - gui_app: true, install: true ) diff --git a/gdk/broadway/meson.build b/gdk/broadway/meson.build new file mode 100644 index 0000000000..57e3488786 --- /dev/null +++ b/gdk/broadway/meson.build @@ -0,0 +1,78 @@ +gdk_broadway_sources = files( + 'gdkcursor-broadway.c', + 'gdkdevice-broadway.c', + 'gdkdevicemanager-broadway.c', + 'gdkdisplay-broadway.c', + 'gdkdnd-broadway.c', + 'gdkeventsource.c', + 'gdkglobals-broadway.c', + 'gdkkeys-broadway.c', + 'gdkmonitor-broadway.c', + 'gdkproperty-broadway.c', + 'gdkscreen-broadway.c', + 'gdkselection-broadway.c', + 'gdktestutils-broadway.c', + 'gdkvisual-broadway.c', + 'gdkwindow-broadway.c', + 'gdkbroadway-server.c', +) + +gdk_broadway_public_headers = files( + 'gdkbroadwaydisplay.h', + 'gdkbroadwaysurface.h', + 'gdkbroadwaycursor.h', + 'gdkbroadwaymonitor.h', +) + +# Broadway backend headers aren't installed it seems +#install_headers(gdk_broadway_public_headers, subdir: 'gtk-4.0/gdk/broadway/') +#install_headers('gdkbroadway.h', subdir: 'gtk-4.0/gdk/') + +gdk_broadway_deps = [shmlib] + +gen_c_array = find_program('gen-c-array.py') + +clienthtml_h = custom_target('clienthtml.h', + input : 'client.html', + output : 'clienthtml.h', + command : [ + gen_c_array, + '--array-name=client_html', + '--output=@OUTPUT@', + '@INPUT@', + ], +) + +broadwayjs_h = custom_target('broadwayjs.h', + input : ['broadway.js'], + output : 'broadwayjs.h', + command : [ + gen_c_array, + '--array-name=broadway_js', + '--output=@OUTPUT@', + '@INPUT0@', + ], +) + +libgdk_broadway = static_library('gdk-broadway', + clienthtml_h, broadwayjs_h, + gdk_broadway_sources, gdkconfig, gdkenum_h, + include_directories: [confinc, gdkinc], + c_args: [ + '-DGDK_COMPILATION', + '-DG_LOG_DOMAIN="Gdk"', + ] + common_cflags, + link_args: common_ldflags, + dependencies: [gdk_deps, gdk_broadway_deps]) + +# gtk4-broadwayd + +broadwayd_syslib = os_win32 ? find_library('ws2_32') : shmlib + +executable('broadwayd', + clienthtml_h, broadwayjs_h, + 'broadwayd.c', 'broadway-server.c', 'broadway-output.c', + include_directories: [confinc, gdkinc, include_directories('.')], + c_args: ['-DGDK_COMPILATION', '-DG_LOG_DOMAIN="Gdk"', ], + dependencies : [broadwayd_syslib, gdk_deps], + install : true) diff --git a/gdk/gdkconfig.h.meson b/gdk/gdkconfig.h.meson new file mode 100644 index 0000000000..14f9e8e1ae --- /dev/null +++ b/gdk/gdkconfig.h.meson @@ -0,0 +1,20 @@ +#ifndef __GDKCONFIG_H__ +#define __GDKCONFIG_H__ + +#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +#mesondefine GDK_WINDOWING_X11 +#mesondefine GDK_WINDOWING_BROADWAY +#mesondefine GDK_WINDOWING_WAYLAND +#mesondefine GDK_WINDOWING_WIN32 + +G_END_DECLS + +#endif /* __GDKCONFIG_H__ */ diff --git a/gdk/gen-gdk-gresources-xml.py b/gdk/gen-gdk-gresources-xml.py new file mode 100644 index 0000000000..694a9159aa --- /dev/null +++ b/gdk/gen-gdk-gresources-xml.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +# +# Generate gdk.gresources.xml +# +# Usage: gen-gdk-gresources-xml SRCDIR_GDK [OUTPUT-FILE] + +import os, sys + +srcdir = sys.argv[1] + +xml = ''' + + + +''' + +def get_files(subdir,extension): + return sorted(filter(lambda x: x.endswith((extension)), os.listdir(os.path.join(srcdir,subdir)))) + +for f in get_files('resources/glsl', '.glsl'): + xml += ' resources/glsl/{0}\n'.format(f) + +xml += ''' + +''' + +if len(sys.argv) > 2: + outfile = sys.argv[2] + f = open(outfile, 'w') + f.write(xml) + f.close() +else: + print(xml) diff --git a/gdk/meson.build b/gdk/meson.build index cd5d4cbe2f..e9e7b8a819 100644 --- a/gdk/meson.build +++ b/gdk/meson.build @@ -1,5 +1,5 @@ -deprecated_gdk_sources = ['deprecated/gdkcolor.c'] -gdk_sources = files([ +deprecated_gdk_sources = files('deprecated/gdkcolor.c') +gdk_sources = files( 'gdk-private.c', 'gdk.c', 'gdkapplaunchcontext.c', @@ -37,9 +37,9 @@ gdk_sources = files([ 'gdkdevicetool.c', 'gdkdrawingcontext.c', 'gdkmonitor.c' -]) +) -gdk_public_h_sources = files([ +gdk_public_headers = files( 'gdk.h', 'gdk-autocleanup.h', 'gdkapplaunchcontext.h', @@ -58,6 +58,7 @@ gdk_public_h_sources = files([ 'gdkglcontext.h', 'gdkkeys.h', 'gdkkeysyms.h', + 'gdkkeysyms-compat.h', 'gdkmain.h', 'gdkmonitor.h', 'gdkpango.h', @@ -75,227 +76,125 @@ gdk_public_h_sources = files([ 'gdktypes.h', 'gdkvisual.h', 'gdkwindow.h', -]) +) +install_headers(gdk_public_headers, subdir : 'gtk-3.0/gdk') -gdk_private_h_sources = files([ +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_x_sources = [ - 'x11/MwmUtil.h', - 'x11/gdkapplaunchcontext-x11.c', - 'x11/gdkasync.c', - 'x11/gdkasync.h', - 'x11/gdkcursor-x11.c', - 'x11/gdkdevice-core-x11.c', - 'x11/gdkdevice-xi2.c', - 'x11/gdkdevicemanager-core-x11.c', - 'x11/gdkdevicemanager-x11.c', - 'x11/gdkdevicemanager-xi2.c', - 'x11/gdkdisplaymanager-x11.c', - 'x11/gdkdisplay-x11.c', - 'x11/gdkdisplay-x11.h', - 'x11/gdkdnd-x11.c', - 'x11/gdkeventsource.c', - 'x11/gdkeventsource.h', - 'x11/gdkeventtranslator.c', - 'x11/gdkeventtranslator.h', - 'x11/gdkgeometry-x11.c', - 'x11/gdkglcontext-x11.c', - 'x11/gdkglcontext-x11.h', - 'x11/gdkkeys-x11.c', - 'x11/gdkmain-x11.c', - 'x11/gdkproperty-x11.c', - 'x11/gdkscreen-x11.c', - 'x11/gdkscreen-x11.h', - 'x11/gdkselection-x11.c', - 'x11/gdktestutils-x11.c', - 'x11/gdkvisual-x11.c', - 'x11/gdkwindow-x11.c', - 'x11/gdkwindow-x11.h', - 'x11/gdkxftdefaults.c', - 'x11/gdkxid.c', - 'x11/gdkx.h', - 'x11/xsettings-client.h', - 'x11/xsettings-client.c', - 'x11/gdkmonitor-x11.c', - 'x11/gdkmonitor-x11.h', - 'x11/gdkx11monitor.h' -] - -gdk_x_private_sources = [ - 'x11/gdkprivate-x11.h', - 'x11/gdkdevicemanagerprivate-core.h', -] - -gdk_wayland_sources = files([ +gdk_wayland_sources = files( 'wayland/gdkapplaunchcontext-wayland.c', 'wayland/gdkcursor-wayland.c', 'wayland/gdkdevice-wayland.c', 'wayland/gdkdisplay-wayland.c', - 'wayland/gdkdisplay-wayland.h', 'wayland/gdkdnd-wayland.c', 'wayland/gdkeventsource.c', 'wayland/gdkglcontext-wayland.c', - 'wayland/gdkglcontext-wayland.h', 'wayland/gdkkeys-wayland.c', 'wayland/gdkmonitor-wayland.c', - 'wayland/gdkmonitor-wayland.h', 'wayland/gdkscreen-wayland.c', - 'wayland/gdkseat-wayland.h', 'wayland/gdkselection-wayland.c', - 'wayland/gdkwaylanddevice.h', - 'wayland/gdkwaylanddisplay.h', - 'wayland/gdkwaylandglcontext.h', - 'wayland/gdkwayland.h', - 'wayland/gdkwaylandmonitor.h', - 'wayland/gdkwaylandselection.h', - 'wayland/gdkwaylandwindow.h', 'wayland/gdkwindow-wayland.c', 'wayland/wm-button-layout-translation.c', -]) - -gdk_wayland_private_sources = files([ - 'wayland/gdkprivate-wayland.h', -]) - - +) gdk_broadway_sources = files([ 'broadway/gdkdisplay-broadway.c', - 'broadway/gdkdisplay-broadway.h', 'broadway/gdkscreen-broadway.c', - 'broadway/gdkscreen-broadway.h', 'broadway/broadway-output.c', - 'broadway/broadway-output.h', - 'broadway/broadway-server.h', '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/gdkwindow-broadway.h', 'broadway/gdkmonitor-broadway.c', - 'broadway/gdkmonitor-broadway.h', 'broadway/gdkkeys-broadway.c', 'broadway/gdkglobals-broadway.c', 'broadway/gdkeventsource.c', - 'broadway/gdkeventsource.h', 'broadway/gdkdnd-broadway.c', 'broadway/broadwayd.c', 'broadway/gdkdevicemanager-broadway.c', - 'broadway/gdkdevicemanager-broadway.h', 'broadway/gdkdevice-broadway.c', - 'broadway/gdkdevice-broadway.h', 'broadway/broadway-buffer.c', - 'broadway/broadway-buffer.h', 'broadway/gdktestutils-broadway.c', 'broadway/gdkproperty-broadway.c' ]) -gdk_broadway_private_sources = files([ - 'broadway/gdkprivate-broadway.h' -]) +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@']) -# glsl_sources = [ - # 'gl3-texture-2d.fs.glsl', - # 'gl3-texture-2d.vs.glsl', - # 'gl3-texture-rect.fs.glsl', - # 'gl3-texture-rect.vs.glsl', - # 'gl2-texture-2d.fs.glsl', - # 'gl2-texture-2d.fs.glsl', - # 'gl2-texture-rect.vs.glsl', - # 'gl2-texture-rect.vs.glsl', - # 'gles2-texture.fs.glsl', - # 'gles2-texture.vs.glsl', -# ] -# resource_xml = '' -# foreach glsl_file : glsl_sources - # resource_xml += ' resources/glsl/@0@\n'.format(glsl_file) -# endforeach - - -# cdata = configuration_data() -# cdata.set('GDK_GRESOURCE_XML_FILES', resource_xml) -# gdkresources_xml = configure_file( - # input : 'gdk.gresource.xml.meson', - # output : 'gdk.gresource.xml', - # configuration : cdata -# ) - -gdkresources = gnome.compile_resources( - 'gdkresources', - 'gdk.gresource.xml', +gdkresources = gnome.compile_resources('gdkresources', + gdk_gresource_xml, source_dir: '.', c_name: '_gdk', extra_args: '--manual-register' ) +gdk_headers = gdk_public_headers -deprecated_h_sources = files(['deprecated/gdkcolor.h']) +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) -gdk_headers = gdk_public_h_sources + deprecated_h_sources + gdk_private_h_sources +gdkenum_h = gdk_enums[1] -gdkenum_h = custom_target( - 'gdkenum_h', - output : 'gdkenumtypes.h', - input : gdk_headers, - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gdkenumtypes.h.template', '@OUTPUT@', '@INPUT@']) +gdk_marshalers = gnome.genmarshal('gdkmarshalers', + sources : 'gdkmarshalers.list', + prefix : '_gdk_marshal', + valist_marshallers : true) -gdkenum_c = custom_target( - 'gdkenum_c', - output : 'gdkenumtypes.c', - input : gdk_headers, - depends : gdkenum_h, - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gdkenumtypes.c.template', '@OUTPUT@', '@INPUT@']) +gdkmarshal_h = gdk_marshalers[1] -gdkmarshal_h = custom_target( - 'gdkmarshal_h', - output : 'gdkmarshalers.h', - input : 'gdkmarshalers.list', - command : [mkmarshal, glib_marshal, '_gdk_marshal', '@INPUT@', '@OUTPUT@'] -) +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) -gdkmarshal_c = custom_target( - 'gdkmarshal_c', - output : 'gdkmarshalers.c', - input : 'gdkmarshalers.list', - command : [mkmarshal, glib_marshal, '_gdk_marshal', '@INPUT@', '@OUTPUT@'] -) - -cdata = configuration_data() -cdata.set('GTK_MAJOR_VERSION', gtk_major_version) -cdata.set('GTK_MINOR_VERSION', gtk_minor_version) -cdata.set('GTK_MICRO_VERSION', gtk_micro_version) - - - -if x11_enabled cdata.set('GDK_WINDOWING_X11', '') endif -if wayland_enabled cdata.set('GDK_WINDOWING_WAYLAND', '') endif -if broadway_enabled cdata.set('GDK_WINDOWING_BROADWAY', '') endif gdkconfig = configure_file( input : 'gdkconfig.h.meson', output : 'gdkconfig.h', - configuration : cdata -) + configuration : gdkconfig_cdata, + install_dir: join_paths(gtk_includedir, 'gtk-3.0/gdk'), + install : true) + + +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) gdkversionmacros = configure_file( input : 'gdkversionmacros.h.in', output : 'gdkversionmacros.h', - configuration: cdata -) + 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') -xinc = include_directories('x11') wlinc = include_directories('.') +gdk_gen_headers = [gdkenum_h, gdkmarshal_h, gdkconfig, gdkversionmacros] gdk_deps = [ - mlib, + libm, pixbuf_dep, cairo_dep, pango_dep, @@ -303,80 +202,74 @@ gdk_deps = [ glib_dep, epoxy_dep, fontconfig_dep, - giounix_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')] +endif + gdk_sources = [ + # Generated gdkconfig, - gdk_sources, - deprecated_gdk_sources, - gdkenum_c, gdkenum_h, - gdkmarshal_c, gdkmarshal_h, + gdk_enums, + gdk_marshalers, gdkresources, gdkversionmacros, - gdk_headers + # Static + gdk_sources, + deprecated_gdk_sources, ] -if x11_enabled - gdk_deps += [ - xrender_dep, - xi_dep, - xext_dep, - x11_dep, - xcursor_dep, - xdamage_dep, - xfixes_dep, - xcomposite_dep, - xrandr_dep - ] - gdk_sources += [ - gdk_x_sources, - gdk_x_private_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 -if wayland_enabled - subdir('wayland') - gdk_deps += [ - shmlib, - xkbdep, - wlclientdep, - wlprotocolsdep, - wlcursordep, - wlegldep - ] - gdk_sources += [ - gdk_wayland_sources, - gdk_wayland_private_sources - ] +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 + endif +endforeach + +if gdk_backends.length() == 0 + error('No backends enabled') endif -if broadway_enabled - gdk_deps += [ - shmlib, - ] - gdk_sources += [ - gdk_broadway_sources, - gdk_broadway_private_sources - ] -endif - - -libgdk = shared_library('gdk', - sources: [gdk_sources, gdkconfig, gdkenum_h], - c_args: ['-DHAVE_CONFIG_H', '-DGDK_COMPILATION'], - include_directories: [confinc, xinc, wlinc], - dependencies: gdk_deps, - install: true -) - +libgdk = shared_library('gdk-3', + 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: common_ldflags, + install: true) libgdk_dep = declare_dependency( - sources: ['gdk.h', gdkconfig, gdkenum_h], - depends: gdk_sources, - include_directories: [confinc, xinc, wlinc], - dependencies: gdk_deps, link_with: libgdk, - link_args: ['-Bsymbolic'], -) + sources: ['gdk.h', gdkconfig, gdkenum_h], + include_directories: [confinc, gdkx11_inc, wlinc], + dependencies: gdk_deps) diff --git a/gdk/quartz/meson.build b/gdk/quartz/meson.build new file mode 100644 index 0000000000..8c1b8d1795 --- /dev/null +++ b/gdk/quartz/meson.build @@ -0,0 +1,51 @@ +# FIXME: do we need to do an add_language() for objective-c here? +gdk_quartz_sources = files( + 'GdkQuartzView.c', + 'GdkQuartzNSWindow.c', + 'gdkcursor-quartz.c', + 'gdkdevice-core-quartz.c', + 'gdkdevicemanager-core-quartz.c', + 'gdkdisplay-quartz.c', + 'gdkdisplaymanager-quartz.c', + 'gdkdnd-quartz.c', + 'gdkevents-quartz.c', + 'gdkeventloop-quartz.c', + 'gdkglcontext-quartz.c', + 'gdkglobals-quartz.c', + 'gdkkeys-quartz.c', + 'gdkmonitor-quartz.c', + 'gdkproperty-quartz.c', + 'gdkscreen-quartz.c', + 'gdkselection-quartz.c', + 'gdktestutils-quartz.c', + 'gdkutils-quartz.c', + 'gdkvisual-quartz.c', + 'gdkwindow-quartz.c', +) + +gdk_quartz_public_headers = files( + 'gdkquartzcursor.h', + 'gdkquartzdevice-core.h', + 'gdkquartzdevicemanager-core.h', + 'gdkquartzdisplay.h', + 'gdkquartzdisplaymanager.h', + 'gdkquartzdnd.h', + 'gdkquartzkeys.h', + 'gdkquartzmonitor.h', + 'gdkquartzscreen.h', + 'gdkquartzutils.h', + 'gdkquartzvisual.h', + 'gdkquartzwindow.h', +) + +install_headers(gdk_quartz_public_headers, subdir: 'gtk-3.0/gdk/quartz') +install_headers('gdkquartz.h', subdir: 'gtk-3.0/gdk') + +gdk_quartz_deps = [ # FIXME +] + +libgdk_quartz = static_library('gdk-quartz', + gdk_quartz_sources, gdkconfig, gdkenum_h, + include_directories: [confinc, gdkinc], + c_args: ['-DGDK_COMPILATION', '-DG_LOG_DOMAIN="Gdk"', '-xobjective-c'], + dependencies: [gdk_deps, gdk_quartz_deps]) diff --git a/gdk/wayland/meson.build b/gdk/wayland/meson.build index 6783ecf193..559e02ba3d 100644 --- a/gdk/wayland/meson.build +++ b/gdk/wayland/meson.build @@ -1,115 +1,105 @@ +gdk_wayland_sources = files( + 'gdkapplaunchcontext-wayland.c', + 'gdkcursor-wayland.c', + 'gdkdevice-wayland.c', + 'gdkdisplay-wayland.c', + 'gdkdnd-wayland.c', + 'gdkeventsource.c', + 'gdkkeys-wayland.c', + 'gdkglcontext-wayland.c', + 'gdkmonitor-wayland.c', + 'gdkscreen-wayland.c', + 'gdkselection-wayland.c', + 'gdkwindow-wayland.c', + 'wm-button-layout-translation.c', +) +gdk_wayland_public_headers = files( + 'gdkwaylanddevice.h', + 'gdkwaylanddisplay.h', + 'gdkwaylandglcontext.h', + 'gdkwaylandmonitor.h', + 'gdkwaylandselection.h', + 'gdkwaylandwindow.h', +) -if wayland_enabled - runcmd = run_command('pkg-config', '--variable=pkgdatadir', 'wayland-protocols') - if runcmd.returncode() == 0 - wayland_protocols_datadir = runcmd.stdout().strip() + '/' +install_headers(gdk_wayland_public_headers, subdir: 'gtk-3.0/gdk/wayland') +install_headers('gdkwayland.h', subdir: 'gtk-3.0/gdk') + +gdk_wayland_deps = [ + shmlib, + xkbdep, + wlclientdep, + wlprotocolsdep, + wlcursordep, + wlegldep, +] + +# wayland protocols +proto_dir = dependency('wayland-protocols').get_pkgconfig_variable('pkgdatadir') +assert(proto_dir != '', 'Could not get pkgdatadir from wayland-protocols.pc') + +wayland_scanner = find_program('wayland-scanner') + +# Format: +# - protocol name +# - protocol stability ('private', 'stable' or 'unstable') +# - protocol version (if stability is 'unstable') +proto_sources = [ + ['gtk-shell', 'private', ], + ['gtk-primary-selection', 'private', ], + ['pointer-gestures', 'unstable', 'v1', ], + ['xdg-shell', 'unstable', 'v6', ], + ['xdg-shell', 'stable', ], + ['xdg-foreign', 'unstable', 'v1', ], + ['tablet', 'unstable', 'v2', ], + ['keyboard-shortcuts-inhibit', 'unstable', 'v1', ], + ['server-decoration', 'private' ], +] + +gdk_wayland_gen_headers = [] + +foreach p: proto_sources + proto_name = p.get(0) + proto_stability = p.get(1) + + if proto_stability == 'stable' + output_base = proto_name + input = join_paths(proto_dir, '@0@/@1@/@2@.xml'.format(proto_stability, proto_name, output_base)) + elif proto_stability == 'private' + output_base = proto_name + input = 'protocol/@0@.xml'.format(proto_name) else - error('Could not get wayland-protocols pkgdatadir via pkg-config.') + proto_version = p.get(2) + output_base = '@0@-@1@-@2@'.format(proto_name, proto_stability, proto_version) + input = join_paths(proto_dir, '@0@/@1@/@2@.xml'.format(proto_stability, proto_name, output_base)) endif - wayland_scanner = find_program('wayland-scanner') - genprotocols = find_program('genprotocolfiles.py') + gdk_wayland_gen_headers += custom_target('@0@ client header'.format(output_base), + input: input, + output: '@0@-client-protocol.h'.format(output_base), + command: [ + wayland_scanner, + 'client-header', + '@INPUT@', '@OUTPUT@', + ]) - gtk_shell_h = custom_target( - 'gtk shell protocol header', - input : 'protocol/gtk-shell.xml', - output : 'gtk-shell-client-protocol.h', - command: [genprotocols, wayland_scanner, '@INPUT@', '@OUTPUT@', 'client-header'] - ) + gdk_wayland_sources += custom_target('@0@ source'.format(output_base), + input: input, + output: '@0@-protocol.c'.format(output_base), + command: [ + wayland_scanner, + 'private-code', + '@INPUT@', '@OUTPUT@', + ]) +endforeach - gtk_shell_c = custom_target( - 'gtk shell protocol source', - input : 'protocol/gtk-shell.xml', - output : 'gtk-shell-protocol.c', - command: [genprotocols, wayland_scanner, '@INPUT@', '@OUTPUT@', 'code'] - ) - - pointer_gestures_h = custom_target( - 'pointer gestures header', - input : wayland_protocols_datadir + 'unstable/pointer-gestures/pointer-gestures-unstable-v1.xml', - output : 'pointer-gestures-unstable-v1-client-protocol.h', - command: [genprotocols, wayland_scanner, '@INPUT@', '@OUTPUT@', 'client-header'] - ) - - pointer_gestures_c = custom_target( - 'pointer gestures source', - input : wayland_protocols_datadir + 'unstable/pointer-gestures/pointer-gestures-unstable-v1.xml', - output : 'pointer-gestures-unstable-v1-protocol.c', - command: [genprotocols, wayland_scanner, '@INPUT@', '@OUTPUT@', 'code'] - ) - - primary_selection_h = custom_target( - 'primary selection header', - input : 'protocol/gtk-primary-selection.xml', - output : 'gtk-primary-selection-client-protocol.h', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'client-header'] - ) - - primary_selection_c = custom_target( - 'primary selection source', - input : 'protocol/gtk-primary-selection.xml', - output : 'gtk-primary-selection-protocol.c', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'code'] - ) - - xdg_shell_h = custom_target( - 'xdg shell v6 header', - input : wayland_protocols_datadir + 'unstable/xdg-shell/xdg-shell-unstable-v6.xml', - output : 'xdg-shell-unstable-v6-client-protocol.h', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'client-header'] - ) - - xdg_shell_c = custom_target( - 'xdg shell v6 source', - input : wayland_protocols_datadir + 'unstable/xdg-shell/xdg-shell-unstable-v6.xml', - output : 'xdg-shell-unstable-v6-protocol.c', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'code'] - ) - - xdg_foreign_h = custom_target( - 'xdg foreign v1 header', - input : wayland_protocols_datadir + 'unstable/xdg-foreign/xdg-foreign-unstable-v1.xml', - output : 'xdg-foreign-unstable-v1-client-protocol.h', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'client-header'] - ) - - xdg_foreign_c = custom_target( - 'xdg foreign v1 source', - input : wayland_protocols_datadir + 'unstable/xdg-foreign/xdg-foreign-unstable-v1.xml', - output : 'xdg-foreign-unstable-v1-protocol.c', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'code'] - ) - - tablet_h = custom_target( - 'tablet v2 header', - input : wayland_protocols_datadir + 'unstable/tablet/tablet-unstable-v2.xml', - output : 'tablet-unstable-v2-client-protocol.h', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'client-header'] - ) - - tablet_c = custom_target( - 'tablet v2 source', - input : wayland_protocols_datadir + 'unstable/tablet/tablet-unstable-v2.xml', - output : 'tablet-unstable-v2-protocol.c', - command: [genprotocols, wayland_scanner,'@INPUT@', '@OUTPUT@', 'code'] - ) - - - - gdk_sources += [ - gtk_shell_c, - gtk_shell_h, - pointer_gestures_h, - pointer_gestures_c, - primary_selection_h, - primary_selection_c, - xdg_shell_h, - xdg_shell_c, - xdg_foreign_h, - xdg_foreign_c, - tablet_h, - tablet_c - ] - -endif +libgdk_wayland = static_library('gdk-wayland', + gdk_wayland_sources, gdk_wayland_gen_headers, gdkconfig, gdkenum_h, + include_directories: [ confinc, gdkinc, ], + c_args: [ + '-DGDK_COMPILATION', + '-DG_LOG_DOMAIN="Gdk"', + ] + common_cflags, + link_args: common_ldflags, + dependencies: [ gdk_deps, gdk_wayland_deps, ]) diff --git a/gdk/win32/meson.build b/gdk/win32/meson.build new file mode 100644 index 0000000000..343a9ff402 --- /dev/null +++ b/gdk/win32/meson.build @@ -0,0 +1,48 @@ +gdk_win32_sources = files( + 'gdkcursor-win32.c', + 'gdkdevicemanager-win32.c', + 'gdkdevice-virtual.c', + 'gdkdevice-win32.c', + 'gdkdevice-wintab.c', + 'gdkdisplay-win32.c', + 'gdkdisplaymanager-win32.c', + 'gdkdnd-win32.c', + 'gdkevents-win32.c', + 'gdkgeometry-win32.c', + 'gdkglcontext-win32.c', + 'gdkglobals-win32.c', + 'gdkkeys-win32.c', + 'gdkmain-win32.c', + 'gdkmonitor-win32.c', + 'gdkproperty-win32.c', + 'gdkscreen-win32.c', + 'gdkselection-win32.c', + 'gdktestutils-win32.c', + 'gdkwin32id.c', + 'gdkwindow-win32.c', +) + +gdk_win32_public_headers = files( + 'gdkwin32cursor.h', + 'gdkwin32display.h', + 'gdkwin32displaymanager.h', + 'gdkwin32dnd.h', + 'gdkwin32glcontext.h', + 'gdkwin32keys.h', + 'gdkwin32misc.h', + 'gdkwin32monitor.h', + 'gdkwin32screen.h', + 'gdkwin32window.h', +) + +install_headers(gdk_win32_public_headers, subdir: 'gtk-3.0/gdk/win32') +install_headers('gdkwin32.h', subdir: 'gtk-3.0/gdk') + +gdk_win32_deps = [ # FIXME +] + +libgdk_win32 = static_library('gdk-win32', + gdk_win32_sources, gdkconfig, gdkenum_h, + include_directories: [confinc, gdkinc], + c_args: ['-DGDK_COMPILATION', '-DG_LOG_DOMAIN="Gdk"', '-DINSIDE_GDK_WIN32'], + dependencies: [gdk_deps, gdk_win32_deps]) diff --git a/gdk/x11/meson.build b/gdk/x11/meson.build new file mode 100644 index 0000000000..c31a682d69 --- /dev/null +++ b/gdk/x11/meson.build @@ -0,0 +1,81 @@ +# Note: gdksettings.c gets included from xsettings-client.c, do not add here +gdk_x11_sources = files( + 'gdkapplaunchcontext-x11.c', + 'gdkasync.c', + 'gdkcursor-x11.c', + 'gdkdevice-core-x11.c', + 'gdkdevice-xi2.c', + 'gdkdevicemanager-core-x11.c', + 'gdkdevicemanager-x11.c', + 'gdkdevicemanager-xi2.c', + 'gdkdisplaymanager-x11.c', + 'gdkdisplay-x11.c', + 'gdkdnd-x11.c', + 'gdkeventsource.c', + 'gdkeventtranslator.c', + 'gdkgeometry-x11.c', + 'gdkglcontext-x11.c', + 'gdkkeys-x11.c', + 'gdkmain-x11.c', + 'gdkproperty-x11.c', + 'gdkscreen-x11.c', + 'gdkscreen-x11.h', + 'gdkselection-x11.c', + 'gdktestutils-x11.c', + 'gdkvisual-x11.c', + 'gdkwindow-x11.c', + 'gdkxftdefaults.c', + 'gdkxid.c', + 'xsettings-client.c', + 'gdkmonitor-x11.c', +) + +gdk_x11_public_headers = files( + 'gdkx-autocleanups.h', + 'gdkx11applaunchcontext.h', + 'gdkx11cursor.h', + 'gdkx11device.h', + 'gdkx11device-core.h', + 'gdkx11device-xi2.h', + 'gdkx11devicemanager.h', + 'gdkx11devicemanager-core.h', + 'gdkx11devicemanager-xi2.h', + 'gdkx11display.h', + 'gdkx11displaymanager.h', + 'gdkx11dnd.h', + 'gdkx11glcontext.h', + 'gdkx11keys.h', + 'gdkx11monitor.h', + 'gdkx11property.h', + 'gdkx11screen.h', + 'gdkx11selection.h', + 'gdkx11utils.h', + 'gdkx11visual.h', + 'gdkx11window.h', +) + +install_headers(gdk_x11_public_headers, subdir: 'gtk-3.0/gdk/x11/') +install_headers('gdkx.h', subdir: 'gtk-3.0/gdk/') + +gdk_x11_deps = [ + xrender_dep, + xi_dep, + xext_dep, + x11_dep, + xcursor_dep, + xdamage_dep, + xfixes_dep, + xcomposite_dep, + xrandr_dep, + xinerama_dep, +] + +libgdk_x11 = static_library('gdk-x11', gdkmarshal_h, + gdk_x11_sources, gdkconfig, gdkenum_h, + include_directories: [ confinc, gdkinc, ], + c_args: [ + '-DGDK_COMPILATION', + '-DG_LOG_DOMAIN="Gdk"', + ] + common_cflags, + link_args: common_ldflags, + dependencies: [ gdk_deps, gdk_x11_deps, ]) diff --git a/gtk/Makefile.am b/gtk/Makefile.am index ea2dd5863c..e56ce9ee6c 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -1177,7 +1177,7 @@ MAINTAINERCLEANFILES = \ $(print_portal_built_sources) \ $(stamp_files) -DISTCLEANFILES = gtktypefuncs.c +DISTCLEANFILES = gtktypefuncs.inc if OS_WIN32 DISTCLEANFILES += gtk-win32.rc @@ -1442,7 +1442,7 @@ gtkprivatetypebuiltins.c: $(gtk_private_type_h_sources) gtkprivatetypebuiltins. && rm -f xgen-gptbc -gtktypefuncs.c: stamp-gtktypebuiltins.h stamp-gtkprivatetypebuiltins.h $(top_srcdir)/gtk/*.h $(top_srcdir)/gtk/a11y/*.h $(top_srcdir)/gtk/deprecated/*.h $(top_srcdir)/gdk/*.h Makefile +gtktypefuncs.inc: stamp-gtktypebuiltins.h stamp-gtkprivatetypebuiltins.h $(top_srcdir)/gtk/*.h $(top_srcdir)/gtk/a11y/*.h $(top_srcdir)/gtk/deprecated/*.h $(top_srcdir)/gdk/*.h Makefile $(AM_V_GEN) export LC_ALL=C ; \ (echo '#undef GTK_COMPILATION' && echo '#include ') > xgen-gtfsrc.c && \ echo 'G_GNUC_BEGIN_IGNORE_DEPRECATIONS' > xgen-gtf && \ @@ -1451,7 +1451,7 @@ gtktypefuncs.c: stamp-gtktypebuiltins.h stamp-gtkprivatetypebuiltins.h $(top_src sort | uniq | \ $(SED) '{ s/^/*tp++ = /; s/$$/();/; s/^.*\(gdk_x11\|gtk_plug_\|gtk_socket_\).*$$/#ifdef GDK_WINDOWING_X11\n&\n#endif/; }' >> xgen-gtf \ && cp xgen-gtf $@ && rm -f xgen-gtf -$(srcdir)/gtktestutils.c: gtktypefuncs.c +$(srcdir)/gtktestutils.c: gtktypefuncs.inc # target platform: lib_LTLIBRARIES = libgtk-3.la diff --git a/gtk/a11y/meson.build b/gtk/a11y/meson.build index c53c22abdd..d0359158d0 100644 --- a/gtk/a11y/meson.build +++ b/gtk/a11y/meson.build @@ -45,6 +45,7 @@ a11y_sources = files( 'gtkspinbuttonaccessible.c', 'gtkspinneraccessible.c', 'gtkstatusbaraccessible.c', + 'gtkstackaccessible.c', 'gtkswitchaccessible.c', 'gtktextcellaccessible.c', 'gtktextviewaccessible.c', @@ -53,5 +54,61 @@ a11y_sources = files( 'gtktreeviewaccessible.c', 'gtkwidgetaccessible.c', 'gtkwindowaccessible.c', - 'gtkstackaccessible.c' - ) +) + +a11y_headers = files( + 'gtk-a11y-autocleanups.h', + 'gtkarrowaccessible.h', + 'gtkbooleancellaccessible.h', + 'gtkbuttonaccessible.h', + 'gtkcellaccessible.h', + 'gtkcellaccessibleparent.h', + 'gtkcheckmenuitemaccessible.h', + 'gtkcomboboxaccessible.h', + 'gtkcontaineraccessible.h', + 'gtkcontainercellaccessible.h', + 'gtkentryaccessible.h', + 'gtkexpanderaccessible.h', + 'gtkflowboxaccessible.h', + 'gtkflowboxchildaccessible.h', + 'gtkframeaccessible.h', + 'gtkiconviewaccessible.h', + 'gtkimageaccessible.h', + 'gtkimagecellaccessible.h', + 'gtklabelaccessible.h', + 'gtklevelbaraccessible.h', + 'gtklinkbuttonaccessible.h', + 'gtklistboxaccessible.h', + 'gtklistboxrowaccessible.h', + 'gtklockbuttonaccessible.h', + 'gtkmenuaccessible.h', + 'gtkmenubuttonaccessible.h', + 'gtkmenuitemaccessible.h', + 'gtkmenushellaccessible.h', + 'gtknotebookaccessible.h', + 'gtknotebookpageaccessible.h', + 'gtkpanedaccessible.h', + 'gtkpopoveraccessible.h', + 'gtkprogressbaraccessible.h', + 'gtkradiobuttonaccessible.h', + 'gtkradiomenuitemaccessible.h', + 'gtkrangeaccessible.h', + 'gtkrenderercellaccessible.h', + 'gtkscaleaccessible.h', + 'gtkscalebuttonaccessible.h', + 'gtkscrolledwindowaccessible.h', + 'gtkspinbuttonaccessible.h', + 'gtkspinneraccessible.h', + 'gtkstatusbaraccessible.h', + 'gtkstackaccessible.h', + 'gtkswitchaccessible.h', + 'gtktextcellaccessible.h', + 'gtktextviewaccessible.h', + 'gtktogglebuttonaccessible.h', + 'gtktoplevelaccessible.h', + 'gtktreeviewaccessible.h', + 'gtkwidgetaccessible.h', + 'gtkwindowaccessible.h', +) + +install_headers(a11y_headers, subdir : 'gtk-3.0/gtk/a11y') diff --git a/gtk/deprecated/meson.build b/gtk/deprecated/meson.build index c2cf4757eb..9dfd5f0255 100644 --- a/gtk/deprecated/meson.build +++ b/gtk/deprecated/meson.build @@ -1,4 +1,4 @@ -gtk_deprecated_c_sources = files( +gtk_deprecated_sources = files( 'gtkactivatable.c', 'gtkaction.c', 'gtkactiongroup.c', @@ -40,3 +40,48 @@ gtk_deprecated_c_sources = files( 'gtkvseparator.c', 'gtkvpaned.c', ) + +gtk_deprecated_headers = files( + 'gtkactivatable.h', + 'gtkaction.h', + 'gtkactiongroup.h', + 'gtkalignment.h', + 'gtkarrow.h', + 'gtkcolorsel.h', + 'gtkcolorseldialog.h', + 'gtkfontsel.h', + 'gtkgradient.h', + 'gtkhandlebox.h', + 'gtkhbbox.h', + 'gtkhbox.h', + 'gtkhpaned.h', + 'gtkhscale.h', + 'gtkhscrollbar.h', + 'gtkhseparator.h', + 'gtkhsv.h', + 'gtkiconfactory.h', + 'gtkimagemenuitem.h', + 'gtkmisc.h', + 'gtknumerableicon.h', + 'gtkradioaction.h', + 'gtkrc.h', + 'gtkrecentaction.h', + 'gtkstatusicon.h', + 'gtkstock.h', + 'gtkstyle.h', + 'gtkstyleproperties.h', + 'gtksymboliccolor.h', + 'gtktable.h', + 'gtktearoffmenuitem.h', + 'gtkthemingengine.h', + 'gtktoggleaction.h', + 'gtkuimanager.h', + 'gtkvbbox.h', + 'gtkvbox.h', + 'gtkvscale.h', + 'gtkvscrollbar.h', + 'gtkvseparator.h', + 'gtkvpaned.h', +) + +install_headers(gtk_deprecated_headers, subdir: 'gtk-3.0/gtk/deprecated/') diff --git a/gtk/gen-gtk-gresources-xml.py b/gtk/gen-gtk-gresources-xml.py new file mode 100644 index 0000000000..720d588a4e --- /dev/null +++ b/gtk/gen-gtk-gresources-xml.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# +# Generate gtk.gresources.xml +# +# Usage: gen-gtk-gresources-xml SRCDIR_GTK [OUTPUT-FILE] + +import os, sys + +srcdir = sys.argv[1] + +xml = ''' + + +''' + +def get_files(subdir,extension): + return sorted(filter(lambda x: x.endswith((extension)), os.listdir(os.path.join(srcdir,subdir)))) + +xml += ''' + theme/Adwaita/gtk.css + theme/Adwaita/gtk-dark.css + theme/Adwaita/gtk-contained.css + theme/Adwaita/gtk-contained-dark.css +''' + +for f in get_files('theme/Adwaita/assets', '.png'): + xml += ' theme/Adwaita/assets/{0}\n'.format(f) + +xml += '\n' + +for f in get_files('theme/Adwaita/assets', '.svg'): + xml += ' theme/Adwaita/assets/{0}\n'.format(f) + +xml += ''' + theme/HighContrast/gtk.css + theme/HighContrast/gtk-inverse.css + theme/HighContrast/gtk-contained.css + theme/HighContrast/gtk-contained-inverse.css +''' + +for f in get_files('theme/HighContrast/assets', '.png'): + xml += ' theme/HighContrast/assets/{0}\n'.format(f) + +xml += '\n' + +for f in get_files('theme/HighContrast/assets', '.svg'): + xml += ' theme/HighContrast/assets/{0}\n'.format(f) + +xml += ''' + theme/win32/gtk-win32-base.css + theme/win32/gtk.css +''' + +for f in get_files('cursor', '.png'): + xml += ' cursor/{0}\n'.format(f) + +for f in get_files('gesture', '.symbolic.png'): + xml += ' gesture/{0}\n'.format(f) + +xml += '\n' + +for f in get_files('ui', '.ui'): + xml += ' ui/{0}\n'.format(f) + +xml += '\n' + +for s in ['16x16', '22x22', '24x24', '32x32', '48x48']: + for c in ['actions', 'status', 'categories']: + icons_dir = 'icons/{0}/{1}'.format(s,c) + if os.path.exists(os.path.join(srcdir,icons_dir)): + for f in get_files(icons_dir, '.png'): + xml += ' icons/{0}/{1}/{2}\n'.format(s,c,f) + +for f in get_files('inspector', '.ui'): + xml += ' inspector/{0}\n'.format(f) + +xml += ''' + inspector/logo.png + emoji/emoji.data + +''' + +if len(sys.argv) > 2: + outfile = sys.argv[2] + f = open(outfile, 'w') + f.write(xml) + f.close() +else: + print(xml) diff --git a/gtk/gentypefuncs.py b/gtk/gentypefuncs.py new file mode 100644 index 0000000000..b17b7233a1 --- /dev/null +++ b/gtk/gentypefuncs.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +import re +import os + +debug = os.getenv('GTK_GENTYPEFUNCS_DEBUG') is not None + +out_file = sys.argv[1] +in_files = sys.argv[2:] + +funcs = [] + + +if debug: print ('Output file: ', out_file) + +if debug: print (len(in_files), 'input files') + +def open_file(filename, mode): + if sys.version_info[0] < 3: + return open(filename, mode=mode) + else: + return open(filename, mode=mode, encoding='utf-8') + +for filename in in_files: + if debug: print ('Input file: ', filename) + with open_file(filename, "r") as f: + for line in f: + line = line.rstrip('\n').rstrip('\r') + # print line + match = re.search(r'\bg[tds]k_[a-zA-Z0-9_]*_get_type\b', line) + if match: + func = match.group(0) + if not func in funcs: + funcs.append(func) + if debug: print ('Found ', func) + +file_output = 'G_GNUC_BEGIN_IGNORE_DEPRECATIONS\n' + +funcs = sorted(funcs) + +for f in funcs: + if f.startswith('gdk_x11') or f.startswith('gtk_socket') or f.startswith('gtk_plug'): + file_output += '#ifdef GDK_WINDOWING_X11\n' + file_output += '*tp++ = {0}();\n'.format(f) + file_output += '#endif\n' + else: + file_output += '*tp++ = {0}();\n'.format(f) + +if debug: print (len(funcs), 'functions') + +ofile = open(out_file, "w") +ofile.write(file_output) +ofile.close() diff --git a/gtk/gtktestutils.c b/gtk/gtktestutils.c index 7b78f739fe..5c0a362296 100644 --- a/gtk/gtktestutils.c +++ b/gtk/gtktestutils.c @@ -764,7 +764,7 @@ gtk_test_register_all_types (void) GType *tp; all_registered_types = g_new0 (GType, max_gtk_types); tp = all_registered_types; -#include "gtktypefuncs.c" +#include "gtktypefuncs.inc" n_all_registered_types = tp - all_registered_types; g_assert (n_all_registered_types + 1 < max_gtk_types); *tp = 0; diff --git a/gtk/inspector/meson.build b/gtk/inspector/meson.build index a119a08db8..7ca24ae2ee 100644 --- a/gtk/inspector/meson.build +++ b/gtk/inspector/meson.build @@ -8,6 +8,7 @@ inspector_sources = files( 'general.c', 'gestures.c', 'graphdata.c', + 'gtkstackcombo.c', 'gtktreemodelcssnode.c', 'init.c', 'inspect-button.c', @@ -23,9 +24,8 @@ inspector_sources = files( 'signals-list.c', 'size-groups.c', 'statistics.c', + 'strv-editor.c', 'treewalk.c', 'visual.c', 'window.c', - 'strv-editor.c', - 'gtkstackcombo.c' ) diff --git a/gtk/meson.build b/gtk/meson.build index 46fa1a9a4d..9526c049f7 100644 --- a/gtk/meson.build +++ b/gtk/meson.build @@ -2,7 +2,23 @@ subdir('deprecated') subdir('a11y') subdir('inspector') -gtk_sources = files([ +gtk_cargs = [ + '-DGTK_COMPILATION', + '-DG_LOG_DOMAIN="Gtk"', + # FIXME, support other backends + '-DGTK_PRINT_BACKENDS="file"', + '-DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED', + '-DGTK_BINARY_VERSION="@0@"'.format(gtk_binary_version), + '-DGTK_HOST="@0@"'.format(host_machine.system()), + '-DGTK_DATA_PREFIX="@0@"'.format(gtk_prefix), + '-DGTK_LIBDIR="@0@"'.format(gtk_libdir), + '-DGTK_LOCALEDIR="@0@"'.format(gtk_localedir), + '-DGTK_DATADIR="@0@"'.format(gtk_datadir), + '-DGTK_SYSCONFDIR="@0@"'.format(gtk_sysconfdir), +] + +# List of sources to build the library from +gtk_sources = files( 'gtkactionmuxer.c', 'gtkactionobserver.c', 'gtkactionobservable.c', @@ -28,6 +44,7 @@ gtk_sources = files([ 'gtkappchooserbutton.c', 'gtkappchooserdialog.c', 'gtkapplication.c', + 'gtkapplicationaccels.c', 'gtkapplicationimpl.c', 'gtkapplicationwindow.c', 'gtkaspectframe.c', @@ -38,17 +55,14 @@ gtk_sources = files([ 'gtkbookmarksmanager.c', 'gtkborder.c', 'gtkbox.c', + 'gtkboxgadget.c', 'gtkbuildable.c', 'gtkbuilder.c', - 'gtkicon.c', - 'gtkshortcutswindow.c', - 'gtkshortcutssection.c', 'gtkbuilderparser.c', 'gtkbuilder-menus.c', + 'gtkbuiltinicon.c', 'gtkbutton.c', 'gtkcairoblur.c', - 'gtkcssnode.c', - 'gtkcsscalcvalue.c', 'gtkcalendar.c', 'gtkcellarea.c', 'gtkcellareabox.c', @@ -66,7 +80,6 @@ gtk_sources = files([ 'gtkcellrenderertext.c', 'gtkcellrenderertoggle.c', 'gtkcellview.c', - 'gtkcenterbox.c', 'gtkcheckbutton.c', 'gtkcheckmenuitem.c', 'gtkcolorbutton.c', @@ -74,44 +87,45 @@ gtk_sources = files([ 'gtkcolorchooserwidget.c', 'gtkcolorchooserdialog.c', 'gtkcoloreditor.c', + 'gtkcolorpicker.c', + 'gtkcolorpickerkwin.c', + 'gtkcolorpickerportal.c', + 'gtkcolorpickershell.c', 'gtkcolorplane.c', 'gtkcolorscale.c', 'gtkcolorswatch.c', 'gtkcolorutils.c', 'gtkcombobox.c', 'gtkcomboboxtext.c', + 'gtkcomposetable.c', 'gtkcontainer.c', 'gtkcssanimation.c', - 'gtkcssgadget.c', - 'gtkcsscustomgadget.c', - 'gtkboxgadget.c', - 'gtkimagedefinition.c', - 'gtkprogresstracker.c', - 'gtkcssimageradial.c', - 'gtkcssimagerecolor.c', - 'gtkcssimagefallback.c', - 'gtkbuiltinicon.c', - 'gtkcssstylechange.c', - 'gtkcsspalettevalue.c', 'gtkcssanimatedstyle.c', 'gtkcssarrayvalue.c', 'gtkcssbgsizevalue.c', 'gtkcssbordervalue.c', + 'gtkcsscalcvalue.c', 'gtkcsscolorvalue.c', 'gtkcsscornervalue.c', + 'gtkcsscustomgadget.c', 'gtkcsscustomproperty.c', + 'gtkcssdimensionvalue.c', 'gtkcsseasevalue.c', 'gtkcssenumvalue.c', 'gtkcssenginevalue.c', + 'gtkcssgadget.c', 'gtkcssiconthemevalue.c', 'gtkcssimage.c', 'gtkcssimagebuiltin.c', 'gtkcssimagecrossfade.c', + 'gtkcssimagefallback.c', 'gtkcssimagegradient.c', 'gtkcssimageicontheme.c', 'gtkcssimagelinear.c', + 'gtkcssimageradial.c', 'gtkcssimagesurface.c', 'gtkcssimageurl.c', + 'gtkcssimagerecolor.c', 'gtkcssimagescaled.c', 'gtkcssimagevalue.c', 'gtkcssimagewin32.c', @@ -122,7 +136,9 @@ gtk_sources = files([ 'gtkcssmatcher.c', 'gtkcssnode.c', 'gtkcssnodedeclaration.c', + 'gtkcssnodestylecache.c', 'gtkcssnumbervalue.c', + 'gtkcsspalettevalue.c', 'gtkcssparser.c', 'gtkcsspathnode.c', 'gtkcsspositionvalue.c', @@ -133,12 +149,10 @@ gtk_sources = files([ 'gtkcssselector.c', 'gtkcssstringvalue.c', 'gtkcssstyle.c', + 'gtkcssstylechange.c', 'gtkcssshadowsvalue.c', 'gtkcssshadowvalue.c', 'gtkcssshorthandproperty.c', - 'gtkshortcutlabel.c', - 'gtkfilechoosernativeportal.c', - 'gtkdragsource.c', 'gtkcssshorthandpropertyimpl.c', 'gtkcssstaticstyle.c', 'gtkcssstylefuncs.c', @@ -152,29 +166,29 @@ gtk_sources = files([ 'gtkcsstypes.c', 'gtkcssvalue.c', 'gtkcsswidgetnode.c', - 'gtkcssnodestylecache.c', - 'gtkapplicationaccels.c', - 'gtkcssdimensionvalue.c', - 'gtkshortcutsgroup.c', - 'gtkshortcutsshortcut.c', - 'gtkfilechoosernative.c', - 'gtknativedialog.c', + 'gtkcsswin32sizevalue.c', 'gtkdialog.c', + 'gtkdragsource.c', 'gtkdrawingarea.c', - 'gtkutils.c', - 'gtktooltipwindow.c', 'gtkeditable.c', + 'gtkemojichooser.c', + 'gtkemojicompletion.c', 'gtkentry.c', 'gtkentrybuffer.c', 'gtkentrycompletion.c', 'gtkeventbox.c', 'gtkeventcontroller.c', + 'gtkeventcontrollerkey.c', + 'gtkeventcontrollermotion.c', + 'gtkeventcontrollerscroll.c', 'gtkexpander.c', 'gtkfilechooser.c', 'gtkfilechooserbutton.c', 'gtkfilechooserdialog.c', 'gtkfilechooserembed.c', 'gtkfilechooserentry.c', + 'gtkfilechoosernative.c', + 'gtkfilechoosernativeportal.c', 'gtkfilechooserutils.c', 'gtkfilechooserwidget.c', 'gtkfilefilter.c', @@ -185,15 +199,9 @@ gtk_sources = files([ 'gtkfontbutton.c', 'gtkfontchooser.c', 'gtkfontchooserdialog.c', - 'gtkcsswin32sizevalue.c', 'gtkfontchooserutils.c', - 'gtkwin32theme.c', - 'gtkwin32draw.c', - 'gtkcomposetable.c', - 'gdkpixbufutils.c', 'gtkfontchooserwidget.c', 'gtkframe.c', - 'gtkprintoperation-portal.c', 'gtkgladecatalog.c', 'gtkgesture.c', 'gtkgesturedrag.c', @@ -202,21 +210,21 @@ gtk_sources = files([ 'gtkgesturepan.c', 'gtkgesturerotate.c', 'gtkgesturesingle.c', + 'gtkgesturestylus.c', 'gtkgestureswipe.c', 'gtkgesturezoom.c', - 'gtkgizmo.c', - 'gtkgladecatalog.c', 'gtkglarea.c', 'gtkgrid.c', 'gtkheaderbar.c', - 'gtkdragdest.c', 'gtkhsla.c', + 'gtkicon.c', 'gtkiconcache.c', 'gtkiconcachevalidator.c', 'gtkiconhelper.c', 'gtkicontheme.c', 'gtkiconview.c', 'gtkimage.c', + 'gtkimagedefinition.c', 'gtkimcontext.c', 'gtkimcontextsimple.c', 'gtkimmodule.c', @@ -250,6 +258,7 @@ gtk_sources = files([ 'gtkmodifierstyle.c', 'gtkmodules.c', 'gtkmountoperation.c', + 'gtknativedialog.c', 'gtknotebook.c', 'gtkoffscreenwindow.c', 'gtkorientable.c', @@ -270,6 +279,7 @@ gtk_sources = files([ 'gtkprintutils.c', 'gtkprivate.c', 'gtkprogressbar.c', + 'gtkprogresstracker.c', 'gtkpixelcache.c', 'gtkpopover.c', 'gtkpopovermenu.c', @@ -302,6 +312,11 @@ gtk_sources = files([ 'gtkseparatormenuitem.c', 'gtkseparatortoolitem.c', 'gtksettings.c', + 'gtkshortcutsgroup.c', + 'gtkshortcutlabel.c', + 'gtkshortcutsshortcut.c', + 'gtkshortcutssection.c', + 'gtkshortcutswindow.c', 'gtksidebarrow.c', 'gtksizegroup.c', 'gtksizerequest.c', @@ -347,6 +362,7 @@ gtk_sources = files([ 'gtktoolpalette.c', 'gtktoolshell.c', 'gtktooltip.c', + 'gtktooltipwindow.c', 'gtktrashmonitor.c', 'gtktreedatalist.c', 'gtktreednd.c', @@ -359,28 +375,26 @@ gtk_sources = files([ 'gtktreestore.c', 'gtktreeview.c', 'gtktreeviewcolumn.c', + 'gtkutils.c', 'gtkvolumebutton.c', 'gtkviewport.c', 'gtkwidget.c', - 'gtkwidgetfocus.c', 'gtkwidgetpath.c', 'gtkwindow.c', 'gtkwindowgroup.c', + 'gtkwin32draw.c', 'gtkwin32theme.c', - 'fallback-c89.c' -]) + 'gdkpixbufutils.c', + 'language-names.c', + 'script-names.c', +) -gtk_private_type_headers = files([ +gtk_private_type_headers = files( 'gtkcsstypesprivate.h', 'gtktexthandleprivate.h', -]) +) -gtk_private_h_sources = gtk_private_type_headers + files([ - 'gtkrecentchooserutils.h', - 'gtkrbtree.h', -]) - -gtk_public_h_sources = files([ +gtk_public_headers = files( 'gtk.h', 'gtk-autocleanups.h', 'gtkx.h', @@ -452,6 +466,9 @@ gtk_public_h_sources = files([ 'gtkenums.h', 'gtkeventbox.h', 'gtkeventcontroller.h', + 'gtkeventcontrollerkey.h', + 'gtkeventcontrollermotion.h', + 'gtkeventcontrollerscroll.h', 'gtkexpander.h', 'gtkfilechooser.h', 'gtkfilechooserbutton.h', @@ -473,6 +490,7 @@ gtk_public_h_sources = files([ 'gtkgesturepan.h', 'gtkgesturerotate.h', 'gtkgesturesingle.h', + 'gtkgesturestylus.h', 'gtkgestureswipe.h', 'gtkgesturezoom.h', 'gtkglarea.h', @@ -602,52 +620,14 @@ gtk_public_h_sources = files([ 'gtkwidgetpath.h', 'gtkwindow.h', 'gtkwindowgroup.h', -]) +) -gtk_deprecated_type_headers = files([ - 'deprecated/gtkactivatable.h', - 'deprecated/gtkaction.h', - 'deprecated/gtkactiongroup.h', - 'deprecated/gtkalignment.h', - 'deprecated/gtkarrow.h', - 'deprecated/gtkcolorsel.h', - 'deprecated/gtkcolorseldialog.h', - 'deprecated/gtkfontsel.h', - 'deprecated/gtkgradient.h', - 'deprecated/gtkhandlebox.h', - 'deprecated/gtkhbbox.h', - 'deprecated/gtkhbox.h', - 'deprecated/gtkhpaned.h', - 'deprecated/gtkhscale.h', - 'deprecated/gtkhscrollbar.h', - 'deprecated/gtkhseparator.h', - 'deprecated/gtkhsv.h', - 'deprecated/gtkiconfactory.h', - 'deprecated/gtkimagemenuitem.h', - 'deprecated/gtkmisc.h', - 'deprecated/gtknumerableicon.h', - 'deprecated/gtkradioaction.h', - 'deprecated/gtkrc.h', - 'deprecated/gtkrecentaction.h', - 'deprecated/gtkstatusicon.h', - 'deprecated/gtkstock.h', - 'deprecated/gtkstyle.h', - 'deprecated/gtkstyleproperties.h', - 'deprecated/gtksymboliccolor.h', - 'deprecated/gtktable.h', - 'deprecated/gtktearoffmenuitem.h', - 'deprecated/gtkthemingengine.h', - 'deprecated/gtktoggleaction.h', - 'deprecated/gtkuimanager.h', - 'deprecated/gtkvbbox.h', - 'deprecated/gtkvbox.h', - 'deprecated/gtkvscale.h', - 'deprecated/gtkvscrollbar.h', - 'deprecated/gtkvseparator.h', - 'deprecated/gtkvpaned.h', -]) +# Installed headers without compatibility guarantees that are not included in gtk/gtk.h +gtk_semi_private_headers = files('gtktextlayout.h') -gtk_unix_sources = files([ +install_headers(gtk_public_headers + gtk_semi_private_headers, subdir: 'gtk-3.0/gtk') + +gtk_unix_sources = files( 'gtkcustompaperunixdialog.c', 'gtkpagesetupunixdialog.c', 'gtkprinter.c', @@ -656,20 +636,57 @@ gtk_unix_sources = files([ 'gtkprinteroptionwidget.c', 'gtkprintjob.c', 'gtkprintoperation-unix.c', + 'gtkprintoperation-portal.c', 'gtkprintunixdialog.c', 'gtkprintbackend.c', 'gtksearchenginetracker.c', -]) - -gtkresources = gnome.compile_resources( - 'gtkresources', - 'gtk.gresource.xml', - source_dir: '.', - c_name: '_gtk', - extra_args: '--manual-register' ) -gtk_x11_sources = files([ +if os_unix + gtk_sources += gtk_unix_sources +endif + +gtk_win32_sources = files( + 'gtkprint-win32.c', + 'gtkprintoperation-win32.c', + 'gtkfilechoosernativewin32.c', + 'gtkwin32.c', +) + +if os_win32 + gtk_sources += gtk_win32_sources +endif + +gen_gtk_gresources_xml = find_program('gen-gtk-gresources-xml.py') +gtk_gresources_xml = configure_file(output: 'gtk.gresources.xml', + command: [ + gen_gtk_gresources_xml, + meson.current_source_dir(), + '@OUTPUT@' + ]) + +# Re-build the theme files if sassc is available +theme_deps = [] +sassc = find_program('sassc', required: false) +if sassc.found() + sassc_opts = [ '-a', '-M', '-t', 'compact' ] + + subdir('theme/Adwaita') + subdir('theme/HighContrast') +endif + +gtkresources = gnome.compile_resources('gtkresources', + gtk_gresources_xml, + dependencies: theme_deps, + source_dir: [ + # List in order of preference + meson.current_build_dir(), + meson.current_source_dir(), + ], + c_name: '_gtk', + extra_args: '--manual-register') + +gtk_use_x11_sources = files([ 'gtkplug.c', 'gtksocket.c', 'gtkxembed.c', @@ -678,122 +695,120 @@ gtk_x11_sources = files([ 'gtkmountoperation-x11.c', ]) -gtk_wayland_sources = files([ +gtk_use_wayland_sources = files([ 'gtkapplication-wayland.c' ]) -dnd_sources = files([ - 'gtkclipboard.c', - 'gtkdnd.c' -]) +if quartz_enabled + gtk_sources += files( + 'gtkclipboard-quartz.c', + 'gtkdnd-quartz.c', + ) +else + gtk_sources += files( + 'gtkclipboard.c', + 'gtkdnd.c', + 'gtkdragdest.c', + ) +endif -gtk_use_wayland_or_x11_c_sources = files([ - 'gtkapplication-dbus.c' -]) +gtk_use_wayland_or_x11_sources = files( 'gtkapplication-dbus.c') + +gtk_use_win32_sources = files( + 'gtkwin32embed.c', + 'gtkwin32embedwidget.c', + 'gtkmountoperation-stub.c', +) + +gtk_use_quartz_sources = files( + 'gtksearchenginequartz.c', + 'gtkmountoperation-stub.c', + 'gtkapplication-quartz.c', + 'gtkapplication-quartz-menu.c', + 'gtkfilechoosernativequartz.c', + 'gtkquartz.c', +) + +gtk_stub_sources = files('gtkmountoperation-stub.c') gtk_dbus_src = gnome.gdbus_codegen('gtkdbusgenerated', 'gtkdbusinterfaces.xml', interface_prefix: 'org.Gtk.', namespace: '_Gtk') -gtkmarshal_h = custom_target( - 'gtkmarshal_h', - output : 'gtkmarshalers.h', - input : 'gtkmarshalers.list', - command : [mkmarshal, glib_marshal, '_gtk_marshal', '@INPUT@', '@OUTPUT@'] -) +gtkmarshalers = gnome.genmarshal('gtkmarshalers', + sources: 'gtkmarshalers.list', + prefix: '_gtk_marshal', + valist_marshallers: true) -gtkmarshal_c = custom_target( - 'gtkmarshal_c', - output : 'gtkmarshalers.c', - input : 'gtkmarshalers.list', - command : [mkmarshal, glib_marshal, '_gtk_marshal', '@INPUT@', '@OUTPUT@'] -) +gtkmarshal_h = gtkmarshalers[1] + +gtktypebuiltins = gnome.mkenums('gtktypebuiltins', + sources: gtk_public_headers + gtk_deprecated_headers + a11y_headers, + c_template: 'gtktypebuiltins.c.template', + h_template: 'gtktypebuiltins.h.template', + install_dir: join_paths(gtk_includedir, 'gtk-3.0/gtk'), + install_header: true) + +gtktypebuiltins_h = gtktypebuiltins[1] + +gtkprivatetypebuiltins = gnome.mkenums('gtkprivatetypebuiltins', + sources: gtk_private_type_headers, + c_template: 'gtkprivatetypebuiltins.c.template', + h_template: 'gtkprivatetypebuiltins.h.template') + +gtkprivatetypebuiltins_h = gtkprivatetypebuiltins[1] + +# Generate gtktypefuncs.inc +typefuncs = custom_target('gtktypefuncs.inc', + depends: [ gdkenum_h ], + output: 'gtktypefuncs.inc', + input: gdk_headers + + gtk_public_headers + + gtk_deprecated_headers + + [ gtktypebuiltins_h, gdkenum_h ], + command: [ + find_program('gentypefuncs.py'), + '@OUTPUT@', + '@INPUT@', + ], + install: false) +gtkversion_cdata = configuration_data() +gtkversion_cdata.set('GTK_MAJOR_VERSION', gtk_major_version) +gtkversion_cdata.set('GTK_MINOR_VERSION', gtk_minor_version) +gtkversion_cdata.set('GTK_MICRO_VERSION', gtk_micro_version) +gtkversion_cdata.set('GTK_BINARY_AGE', gtk_binary_age) +gtkversion_cdata.set('GTK_INTERFACE_AGE', gtk_interface_age) -gtktypebuiltins_h = custom_target( - 'gtkypebuiltins_h', - output : 'gtktypebuiltins.h', - input : gtk_public_h_sources + gtk_deprecated_type_headers, - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gtktypebuiltins.h.template', '@OUTPUT@', '@INPUT@'] -) +gtkversion = configure_file(input: 'gtkversion.h.in', + output: 'gtkversion.h', + configuration: gtkversion_cdata, + install_dir: join_paths(gtk_includedir, 'gtk-3.0/gtk')) -gtktypebuiltins_c = custom_target( - 'gtkypebuiltins_c', - output : 'gtktypebuiltins.c', - input : gtk_public_h_sources + gtk_deprecated_type_headers, - depends : gtktypebuiltins_h, - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gtktypebuiltins.c.template', '@OUTPUT@', '@INPUT@'] -) - -gtkprivatetypebuiltins_h = custom_target( - 'gtkprivateypebuiltins_h', - output : 'gtkprivatetypebuiltins.h', - input : gtk_private_type_headers, - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gtkprivatetypebuiltins.h.template', '@OUTPUT@', '@INPUT@'] -) - -gtkprivatetypebuiltins_c = custom_target( - 'gtkprivateypebuiltins_c', - output : 'gtkprivatetypebuiltins.c', - input : gtk_private_type_headers, - depends : [gtkprivatetypebuiltins_h, gtktypebuiltins_h], - command : [mkenum, perl, glib_mkenums, meson.current_source_dir() + '/gtkprivatetypebuiltins.c.template', '@OUTPUT@', '@INPUT@'] -) - -gentypefuncs_prog = find_program('gentypefuncs.py') -# Generate gtktypefuncs.c -typefuncs = custom_target( - 'typefuncs', - depends: gdkenum_h, - output : 'gtktypefuncs.c', - input : gdk_headers + gtk_public_h_sources + gtk_deprecated_type_headers + gtk_private_h_sources + [gtktypebuiltins_h] + [gdkenum_h], - command: [gentypefuncs_prog, '@OUTPUT@', '@INPUT@'], - install: false, -) - -cdata = configuration_data() -cdata.set('GTK_MAJOR_VERSION', gtk_major_version) -cdata.set('GTK_MINOR_VERSION', gtk_minor_version) -cdata.set('GTK_MICRO_VERSION', gtk_micro_version) -cdata.set('GTK_BINARY_AGE', gtk_binary_age) -cdata.set('GTK_INTERFACE_AGE', gtk_interface_age) - -gtkversion = configure_file( - input : 'gtkversion.h.in', - output : 'gtkversion.h', - configuration: cdata -) - -gtk_cargs = [ - '-DGTK_COMPILATION', - '-DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED', - '-DGTK_BINARY_VERSION="' + gtk_binary_version + '"', - '-DGTK_HOST="' + host_machine.system() + '"', - '-DGTK_SYSCONFDIR="' + get_option('prefix') + '/etc"', - '-DGTK_DATADIR="' + get_option('datadir') + '"', - '-DGTK_DATA_PREFIX="'+ get_option('prefix') + '"', - '-DGTK_PRINT_BACKENDS="null"', +gtk_gen_headers = [ + gtkmarshalers, + gtkprivatetypebuiltins, + gtktypebuiltins, + gtkversion, ] gtk_sources += [ gtk_dbus_src, - gtk_unix_sources, - gtk_deprecated_c_sources, - dnd_sources, + gtk_deprecated_sources, inspector_sources, a11y_sources, gtkresources, - gtkmarshal_c, - gtkprivatetypebuiltins_c, - gtktypebuiltins_c, + gtkmarshalers, + gtkprivatetypebuiltins, + gtktypebuiltins, ] gtk_deps = [ gmodule_dep, - giounix_dep, glib_dep, - atkbridge_dep, + gobject_dep, + platform_gio_dep, pangocairo_dep, pango_dep, cairogobj_dep, @@ -802,68 +817,194 @@ gtk_deps = [ pixbuf_dep, atk_dep, epoxy_dep, - mlib, + libm, ] if x11_enabled - runcmd = run_command('pkg-config', '--variable=prefix', 'x11') - if runcmd.returncode() == 0 - gtk_cargs += '-DX11_DATA_PREFIX="' + runcmd.stdout().strip() + '"' - else - error('Could not get x11 data prefix via pkg-config.') - endif + x11_data_prefix = dependency('x11').get_pkgconfig_variable('prefix') - gtk_sources += [ - gtk_x11_sources, - gtk_use_wayland_or_x11_c_sources - ] - gtk_deps += [ - xi_dep, - x11_dep, - pangoft_dep - ] + gtk_cargs += [ '-DX11_DATA_PREFIX="@0@"'.format(x11_data_prefix), ] + gtk_sources += gtk_use_x11_sources + gtk_deps += [ xi_dep, x11_dep, ] endif if wayland_enabled - gtk_sources += [ - gtk_wayland_sources, - gtk_use_wayland_or_x11_c_sources - ] - gtk_deps += [ - pangoft_dep - ] + gtk_sources += gtk_use_wayland_sources endif -gnome.compile_schemas() +if broadway_enabled + gtk_sources += ['gtkimcontextbroadway.c'] +endif -libgtk = shared_library('gtk', - gtk_sources, - gtkmarshal_h, - c_args: gtk_cargs, - include_directories: [confinc, gdkinc, gtkinc], - dependencies: [gtk_deps, libgdk_dep], - install: true -) +if win32_enabled + gtk_cargs += [] + gtk_sources += gtk_use_win32_sources + gtk_deps += [ giowin32_dep, pangowin32_dep ] +else + gtk_deps += [ atkbridge_dep, ] +endif -libgtk_dep = declare_dependency( - sources: [ - 'gtk.h', - gtkversion, - gtktypebuiltins_c, +if quartz_enabled + gtk_sources += gtk_use_quartz_sources + gtk_cargs += ['-xobjective-c'] # FIXME? maybe add_languages() instead? +endif + +# So we don't add these twice +if x11_enabled or wayland_enabled + gtk_sources += gtk_use_wayland_or_x11_sources + gtk_deps += pangoft_dep +endif + +if not (x11_enabled or win32_enabled or quartz_enabled) + gtk_sources += gtk_stub_sources +endif + +if cloudproviders_enabled + gtk_deps += cloudproviders_dep +endif + +# Unconditional. If libintl isn't found, +# the object just does nothing being in the deplist +gtk_deps += libintl_dep + +gtk_settings_schemas = [ + 'org.gtk.Settings.FileChooser.gschema.xml', + 'org.gtk.Settings.ColorChooser.gschema.xml', + 'org.gtk.Settings.EmojiChooser.gschema.xml', + 'org.gtk.Settings.Debug.gschema.xml', +] +install_data(gtk_settings_schemas, install_dir: gtk_schemasdir) +gnome.compile_schemas(depend_files: files(gtk_settings_schemas), + build_by_default: true) +gtk_schema_build_dir = meson.current_build_dir() + +# Check for more things +if cc.has_header('langinfo.h') + foreach nl_enum: [ '_NL_MEASUREMENT_MEASUREMENT', + '_NL_PAPER_HEIGHT', + '_NL_PAPER_WIDTH', + '_NL_TIME_FIRST_WEEKDAY', ] + cdata.set('HAVE_' + nl_enum, cc.has_header_symbol('langinfo.h', nl_enum)) + endforeach +endif + +# Library +libgtk = shared_library('gtk-3', + soversion: gtk_soversion, + sources: [typefuncs, gtk_sources, gtkmarshal_h, gtkprivatetypebuiltins_h], + c_args: gtk_cargs + common_cflags, + include_directories: [confinc, gdkinc, gtkinc], + dependencies: gtk_deps + [libgdk_dep], + link_with: libgdk, + link_args: common_ldflags, + install: true) + +gtk_dep_sources = [gtkversion, gtktypebuiltins_h] +# Introspection +build_gir = get_option('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 = gnome.generate_gir(libgtk, + sources: gdk_public_headers + gdk_sources + [ gdkenum_h ], + namespace: 'Gdk', + nsversion: gtk_api_version, + identifier_prefix: 'Gdk', + symbol_prefix: 'gdk', + export_packages: 'gtk+-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) + gtk_dep_sources += gdk_gir + + if x11_enabled + gdk_x11_gir = gnome.generate_gir(libgtk, + sources: gdk_x11_public_headers + gdk_x11_sources, + namespace: 'GdkX11', + nsversion: gtk_api_version, + identifier_prefix: 'Gdk', + symbol_prefix: 'gdk', + export_packages: 'gtk+-x11-3.0', + includes: [ gdk_gir[0], 'xlib-2.0', ], + install: true, + dependencies: gdk_gir_dep, + header: 'gdk/gdkx.h', + extra_args: gir_args + [ + '-DGDK_COMPILATION', + ]) + gtk_dep_sources += gdk_x11_gir + endif + + gtk_introspection_sources = [ + gtk_public_headers, + gtk_sources, + a11y_headers, + a11y_sources, gtktypebuiltins_h, - ], - dependencies: gtk_deps, - link_with: [libgtk, libgdk], - link_args: ['-Bsymbolic'], - include_directories: [confinc, gtkinc] -) + gtkversion, + ] + gtk_gir = gnome.generate_gir(libgtk, + sources: gtk_introspection_sources, + namespace: 'Gtk', + nsversion: gtk_api_version, + identifier_prefix: 'Gtk', + symbol_prefix: 'gtk', + export_packages: 'gtk+-3.0', + includes: [ gdk_gir[0], 'Atk-1.0', ], + header: 'gtk/gtk.h', + install: true, + dependencies: gdk_gir_dep, + extra_args: gir_args + [ + '-DGTK_COMPILATION', + '--c-include=gtk/gtk-a11y.h', + ]) + gtk_dep_sources += gtk_gir +endif +libgtk_dep = declare_dependency(sources: gtk_dep_sources, + include_directories: [confinc, gtkinc], + dependencies: gtk_deps + [libgdk_dep], + link_with: libgtk, + link_args: common_ldflags) + +if quartz_enabled + # HACK: install_data() doesn't allow installing under a different name (#1487) + # FIXME: or maybe just rename it to gtk-keys.css in the src tree? + configure_file(input: 'gtk-keys.css.mac', + output: 'gtk-keys.css', + copy: true, + install_dir: join_paths(get_option('datadir'), 'themes/Mac/gtk-4.0')) +endif ####### Utils ###### gtk_query_settings = executable( 'gtk-query-settings', 'gtk-query-settings.c', + c_args: gtk_cargs, dependencies: libgtk_dep, install: true ) @@ -871,6 +1012,7 @@ gtk_query_settings = executable( gtk_builder_tool = executable( 'gtk-builder-tool', 'gtk-builder-tool.c', + c_args: gtk_cargs, dependencies: libgtk_dep, install: true ) @@ -878,21 +1020,24 @@ gtk_builder_tool = executable( gtk_update_icon_cache = executable( 'gtk-update-icon-cache', 'updateiconcache.c', + c_args: gtk_cargs, dependencies: libgtk_dep, install: true ) -# gtk_query_immodules = executable( - # 'gtk-query-immodules-3.0', - # 'queryimmodules.c', - # 'gtkutils.c', - # dependencies: libgtk_dep, - # install: true -# ) + gtk_query_immodules = executable( + 'gtk-query-immodules-3.0', + 'queryimmodules.c', + 'gtkutils.c', + c_args: gtk_cargs, + dependencies: libgtk_dep, + install: true +) gtk_encode_symbolic_svg = executable( 'gtk-encode-symbolic-svg', 'encodesymbolic.c', + c_args: gtk_cargs, dependencies: libgtk_dep, install: true ) @@ -900,6 +1045,7 @@ gtk_encode_symbolic_svg = executable( gtk_launch = executable( 'gtk-launch', 'gtk-launch.c', + c_args: gtk_cargs, dependencies: libgtk_dep, install: true ) diff --git a/gtk/theme/Adwaita/meson.build b/gtk/theme/Adwaita/meson.build new file mode 100644 index 0000000000..7a799f947d --- /dev/null +++ b/gtk/theme/Adwaita/meson.build @@ -0,0 +1,30 @@ +scss_files = files([ + '_colors-public.scss', + '_colors.scss', + '_common.scss', + '_drawing.scss', +]) + +theme_variants = [ + 'dark', +] + +theme_deps += custom_target('Adwaita', + input: 'gtk-contained.scss', + output: 'gtk-contained.css', + command: [ + sassc, sassc_opts, '@INPUT@', '@OUTPUT@', + ], + depend_files: scss_files, + build_by_default: true) + +foreach variant: theme_variants + theme_deps += custom_target('Adwaita-' + variant, + input: 'gtk-contained-@0@.scss'.format(variant), + output: 'gtk-contained-@0@.css'.format(variant), + command: [ + sassc, sassc_opts, '@INPUT@', '@OUTPUT@', + ], + depend_files: scss_files, + build_by_default: true) +endforeach diff --git a/gtk/theme/HighContrast/meson.build b/gtk/theme/HighContrast/meson.build new file mode 100644 index 0000000000..f3230353ef --- /dev/null +++ b/gtk/theme/HighContrast/meson.build @@ -0,0 +1,29 @@ +scss_files = files([ + '_colors.scss', + '_common.scss', + '_drawing.scss', +]) + +theme_variants = [ + 'inverse', +] + +theme_deps += custom_target('HighContrast', + input: 'gtk-contained.scss', + output: 'gtk-contained.css', + command: [ + sassc, sassc_opts, '@INPUT@', '@OUTPUT@', + ], + depend_files: scss_files, + build_by_default: true) + +foreach variant: theme_variants + theme_deps += custom_target('HighContrast-' + variant, + input: 'gtk-contained-@0@.scss'.format(variant), + output: 'gtk-contained-@0@.css'.format(variant), + command: [ + sassc, sassc_opts, '@INPUT@', '@OUTPUT@', + ], + depend_files: scss_files, + build_by_default: true) +endforeach diff --git a/meson.build b/meson.build index e3d9ec4eca..a78876f884 100644 --- a/meson.build +++ b/meson.build @@ -1,24 +1,73 @@ project('gtk+-3.0', 'c', - version: '3.22.0', + version: '3.24.1', default_options: [ 'buildtype=debugoptimized', 'c_std=gnu89', 'warning_level=1' ], + meson_version : '>= 0.43.0', license: 'LGPLv2.1+') +glib_major_req = 2 +glib_minor_req = 53 +glib_micro_req = 4 + +if glib_minor_req.is_odd() + glib_min_required = 'GLIB_VERSION_@0@_@1@'.format(glib_major_req, glib_minor_req - 1) +else + glib_min_required = 'GLIB_VERSION_@0@_@1@'.format(glib_major_req, glib_minor_req) +endif + +if glib_minor_req.is_odd() + glib_max_allowed = 'GLIB_VERSION_@0@_@1@'.format(glib_major_req, glib_minor_req + 1) +else + glib_max_allowed = 'GLIB_VERSION_@0@_@1@'.format(glib_major_req, glib_minor_req) +endif + +glib_req = '>= @0@.@1@.@2@'.format(glib_major_req, glib_minor_req, glib_micro_req) +pango_req = '>= 1.41.0' +atk_req = '>= 2.15.1' +cairo_req = '>= 1.14.0' +gdk_pixbuf_req = '>= 2.30.0' +introspection_req = '>= 1.39.0' +wayland_proto_req = '>= 1.12' +wayland_req = '>= 1.9.91' +epoxy_req = '>= 1.4' +cloudproviders_req = '>= 0.2.5' +xkbcommon_req = '>= 0.2.0' + gnome = import('gnome') -add_global_arguments('-DG_LOG_USE_STRUCTURED=1', language: 'c') -add_global_arguments('-DG_ENABLE_DEBUG', language: 'c') -add_global_arguments('-DG_ENABLE_CONSISTENCY_CHECKS', language: 'c') +add_project_arguments('-DG_LOG_USE_STRUCTURED=1', language: 'c') +add_project_arguments('-DGLIB_MIN_REQUIRED_VERSION=' + glib_min_required, language: 'c') +add_project_arguments('-DGLIB_MAX_ALLOWED_VERSION=' + glib_max_allowed, language: 'c') -gtk_version = meson.project_version().split('.') -gtk_major_version = gtk_version[0].to_int() -gtk_minor_version = gtk_version[1].to_int() -gtk_micro_version = gtk_version[2].to_int() +# Making releases: +# 1. gtk_micro_version += 1; +# 2. gtk_interface_age += 1; +# 3. if any functions have been added, set gtk_interface_age to 0. +# 4. if backwards compatibility has been broken, we're in trouble +gtk_version = meson.project_version() +gtk_major_version = gtk_version.split('.')[0].to_int() +gtk_minor_version = gtk_version.split('.')[1].to_int() +gtk_micro_version = gtk_version.split('.')[2].to_int() gtk_interface_age = 0 -add_global_arguments('-DGTK_VERSION="' + meson.project_version() + '"', language: 'c') +add_project_arguments('-DGTK_VERSION="@0@"'.format(meson.project_version()), language: 'c') + +add_project_arguments('-D_GNU_SOURCE', language: 'c') + +gtk_debug_cflags = [] +buildtype = get_option('buildtype') +if buildtype.startswith('debug') + gtk_debug_cflags += '-DG_ENABLE_DEBUG' + if buildtype == 'debug' + gtk_debug_cflags += '-DG_ENABLE_CONSISTENCY_CHECKS' + endif +elif buildtype == 'release' + gtk_debug_cflags += '-DG_DISABLE_CAST_CHECKS' +endif + +add_project_arguments(gtk_debug_cflags, language: 'c') # Define a string for the earliest version that this release has # backwards binary compatibility with for all interfaces a module @@ -28,167 +77,344 @@ add_global_arguments('-DGTK_VERSION="' + meson.project_version() + '"', language gtk_binary_version = '3.0.0' gtk_binary_age = 100 * gtk_minor_version + gtk_micro_version + +gtk_soversion = '0.@0@.@1@'.format(gtk_binary_age - gtk_interface_age, gtk_interface_age) + gtk_api_version = '@0@.0'.format(gtk_major_version) -x11_enabled = get_option('enable-x11-backend') -wayland_enabled = get_option('enable-wayland-backend') -broadway_enabled = get_option('enable-broadway-backend') - - -mkmarshal = find_program('build_marshal.py') -glib_marshal = find_program('glib-genmarshal') -mkenum = find_program('build_enum.py') -perl = find_program('perl') -glib_mkenums = find_program('glib-mkenums') +x11_enabled = get_option('x11-backend') +wayland_enabled = get_option('wayland-backend') +broadway_enabled = get_option('broadway-backend') +quartz_enabled = get_option('quartz-backend') +win32_enabled = get_option('win32-backend') os_unix = false os_linux = false os_win32 = false os_darwin = false -if host_machine.system().contains('darwin') +# Some windowing system backends depend on the platform we're +# building for, so we need to ensure they are disabled; in other +# cases, they are the only windowing system available, so we need +# to ensure they are enabled +if host_machine.system() == 'darwin' os_darwin = true -elif host_machine.system().contains('mingw') +elif host_machine.system() == 'windows' os_win32 = true -elif host_machine.system().contains('linux') +elif host_machine.system() == 'linux' os_linux = true endif - os_unix = not os_win32 +if os_darwin + wayland_enabled = false +else + quartz_enabled = false +endif + +if os_win32 + wayland_enabled = false + x11_enabled = false +else + win32_enabled = false +endif + +gtk_prefix = get_option('prefix') +gtk_includedir = join_paths(gtk_prefix, get_option('includedir')) +gtk_libdir = join_paths(gtk_prefix, get_option('libdir')) +gtk_datadir = join_paths(gtk_prefix, get_option('datadir')) +gtk_localedir = join_paths(gtk_prefix, get_option('localedir')) +gtk_sysconfdir = join_paths(gtk_prefix, get_option('sysconfdir')) +gtk_applicationsdir = join_paths(gtk_datadir, 'applications') +gtk_schemasdir = join_paths(gtk_datadir, 'glib-2.0/schemas') +gtk_appdatadir = join_paths(gtk_datadir, 'metainfo') cc = meson.get_compiler('c') + cdata = configuration_data() -cdata.set('PACKAGE_VERSION', '"'+meson.project_version()+'"') -cdata.set('GTK_LOCALEDIR', '"'+get_option('localedir')+'"') -cdata.set('GTK_DATADIR', '"'+get_option('datadir')+'"') -cdata.set('GTK_LIBDIR', '"'+get_option('libdir')+'"') -cdata.set('GETTEXT_PACKAGE', '"gtk30"') +cdata.set_quoted('PACKAGE_VERSION', meson.project_version()) +cdata.set_quoted('GTK_LOCALEDIR', gtk_localedir) +cdata.set_quoted('GTK_DATADIR', gtk_datadir) +cdata.set_quoted('GTK_LIBDIR', gtk_libdir) +cdata.set_quoted('GTK_SYSCONFDIR', gtk_sysconfdir) +cdata.set_quoted('GETTEXT_PACKAGE', 'gtk30') cdata.set('GTK_MAJOR_VERSION', gtk_major_version) cdata.set('GTK_MINOR_VERSION', gtk_minor_version) cdata.set('GTK_MICRO_VERSION', gtk_micro_version) cdata.set('GTK_BINARY_AGE', gtk_binary_age) cdata.set('GTK_INTERFACE_AGE', gtk_interface_age) + check_headers = [ - ['HAVE_CRT_EXTERNS_H', 'crt/externs.h'], - ['HAVE_DLFCN_H', 'dlfcn.h'], - ['HAVE_FTW_H', 'ftw.h'], - ['HAVE_INTTYPES_H', 'inttypes.h'], - ['HAVE_LOCALE_H', 'locale.h'], - ['HAVE_MEMORY_H', 'memory.h'], - ['HAVE_STDINT_H', 'stdint.h'], - ['HAVE_STDLIB_H', 'stdlib.h'], - ['HAVE_STRINGS_H', 'strings.h'], - ['HAVE_STRING_H', 'string.h'], - ['HAVE_SYS_MMAN_H', 'sys/mman.h'], - ['HAVE_SYS_PARAM_H', 'sys/param.h'], - ['HAVE_SYS_STAT_H', 'sys/stat.h'], - ['HAVE_SYS_SYSINFO_H', 'sys/sysinfo.h'], - ['HAVE_SYS_SYSTEMINFO_H', 'sys/systeminfo.h'], - ['HAVE_SYS_TIME_H', 'sys/time.h'], - ['HAVE_SYS_TYPES_H', 'sys/types.h'], - ['HAVE_UNISTD_H', 'unistd.h'], - ['HAVE_LINUX_MEMFD_H', 'linux/memfd.h'], + 'crt/externs.h', + 'dlfcn.h', + 'ftw.h', + 'inttypes.h', + 'linux/memfd.h', + 'linux/input.h', + 'dev/evdev/input.h', + 'locale.h', + 'memory.h', + 'stdint.h', + 'stdlib.h', + 'string.h', + 'strings.h', + 'sys/mman.h', + 'sys/param.h', + 'sys/stat.h', + 'sys/sysinfo.h', + 'sys/systeminfo.h', + 'sys/time.h', + 'sys/types.h', + 'unistd.h', ] foreach h : check_headers - if cc.has_header(h.get(1)) - cdata.set(h.get(0), 1) + if cc.has_header(h) + cdata.set('HAVE_' + h.underscorify().to_upper(), 1) endif endforeach +# Maths functions might be implemented in libm +libm = cc.find_library('m', required: false) + check_functions = [ -# check token HAVE_BIND_TEXTDOMAIN_CODESET -# check token HAVE_CUPS_API_1_6 - ['HAVE_DCGETTEXT', 'dcgettext', '#include'], - ['HAVE_DECL_ISINF', 'isinf', '#include'], - ['HAVE_DECL_ISNAN', 'isnan', '#include'], - ['HAVE_GETPAGESIZE', 'getpagesize', '#include'], - ['HAVE_GETRESUID', 'getresuid', '#include'], -# check token HAVE_GETTEXT -# check token HAVE_GIO_UNIX -# check token HAVE_GNU_FTW -# check token HAVE_HTTPGETAUTHSTRING -# check token HAVE_HTTP_AUTHSTRING -# check token HAVE_IPRINTDIALOGCALLBACK -# check token HAVE_LC_MESSAGES -# check token HAVE_LOCALTIME_R - ['HAVE_LSTAT', 'lstat', '#include'], - ['HAVE_MMAP', 'mmap', '#include'], - ['HAVE_NEARBYINT', 'nearbyint', '#include'], - ['HAVE_POSIX_FALLOCATE', 'posix_fallocate', '#include'], - ['HAVE__LOCK_FILE', '_lock_file', '#include'], - ['HAVE_FLOCKFILE', 'flockfile', '#include'], - ['HAVE_MKSTEMP', 'mkstemp', '#include'], - ['HAVE_MALLINFO', 'mallinfo', '#include'], - ['HAVE_ROUND', 'round', '#include'], - ['HAVE_RINT', 'rint', '#include'], - ['HAVE_LOG2', 'log2', '#include'], - ['HAVE_EXP2', 'exp2', '#include'], - ['HAVE_SINCOS', 'sincos', '#include'], - ['HAVE_XKB', 'XkbQueryExtension', '#include'], -# check token HAVE_SOCKADDR_UN_SUN_LEN -# check token HAVE_SOLARIS_XINERAMA -# check token HAVE_XFREE_XINERAMA -# check token HAVE_XINERAMA -# check token HAVE__NL_MEASUREMENT_MEASUREMENT -# check token HAVE__NL_PAPER_HEIGHT -# check token HAVE__NL_PAPER_WIDTH -# check token HAVE__NL_TIME_FIRST_WEEKDAY -# check token HAVE__NSGETENVIRON + 'dcgettext', + 'getpagesize', + 'getresuid', + 'lstat', + 'mmap', + 'nearbyint', + 'posix_fallocate', + '_lock_file', + 'flockfile', + 'mkstemp', + 'mallinfo', + 'round', + 'rint', + 'log2', + 'exp2', + 'sincos', + 'trunc', ] -if x11_enabled -check_functions += [ - ['HAVE_XGENERICEVENTS', 'XGetEventData', '#include'], - ['HAVE_XSYNC', 'XSyncQueryExtension', '#include\n#include'] -] -endif -foreach f : check_functions - if cc.has_function(f.get(1), prefix : f.get(2)) - cdata.set(f.get(0), 1) +foreach func : check_functions + if cc.has_function(func, dependencies: libm) + cdata.set('HAVE_' + func.underscorify().to_upper(), 1) endif endforeach -# +cdata.set('HAVE_DECL_ISINF', cc.has_header_symbol('math.h', 'isinf')) +cdata.set('HAVE_DECL_ISNAN', cc.has_header_symbol('math.h', 'isnan')) + # Disable deprecation checks for all libraries we depend on on stable branches. # This is so newer versions of those libraries don't cause more warnings with # a stable GTK version. # We don't ever want to turn off deprecation warnings for master however, because # that's where we get rid of deprecated API we use. -if gtk_minor_version % 2 == 0 +if gtk_minor_version.is_even() cdata.set('GLIB_DISABLE_DEPRECATION_WARNINGS', 1) endif +# Compiler flags +if cc.get_id() == 'msvc' + # Compiler options taken from msvc_recommended_pragmas.h + # in GLib, based on _Win32_Programming_ by Rector and Newcomer + test_cflags = [] + add_project_arguments('-FImsvc_recommended_pragmas.h', language: 'c') + add_project_arguments('-D_USE_MATH_DEFINES', language: 'c') +elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + test_cflags = [ + '-fno-strict-aliasing', + '-Wpointer-arith', + '-Wimplicit-function-declaration', + '-Wformat=2', + '-Wformat-security', + '-Wnested-externs', + '-Wold-style-definition', + '-Wundef', + '-Wunused', + '-Wcast-align', + '-Wmissing-noreturn', + '-Wmissing-format-attribute', + '-Wmissing-include-dirs', + '-Wlogical-op', + '-Wignored-qualifiers', + '-Werror=implicit', + '-Werror=nonnull', + '-Werror=init-self', + '-Werror=main', + '-Werror=missing-braces', + '-Werror=sequence-point', + '-Werror=return-type', + '-Werror=trigraphs', + '-Werror=array-bounds', + '-Werror=write-strings', + '-Werror=address', + '-Werror=int-to-pointer-cast', + '-Werror=pointer-to-int-cast', + '-Werror=empty-body', + '-Werror=write-strings', + ] +else + test_cflags = [] +endif + +common_cflags = cc.get_supported_arguments(test_cflags) + +# Symbol visibility +if get_option('default_library') != 'static' + if os_win32 + cdata.set('DLL_EXPORT', true) + cdata.set('_GDK_EXTERN', '__declspec(dllexport) extern') + if cc.get_id() != 'msvc' + common_cflags += ['-fvisibility=hidden'] + endif + else + cdata.set('_GDK_EXTERN', '__attribute__((visibility("default"))) extern') + common_cflags += ['-fvisibility=hidden'] + endif +endif + +common_ldflags = [] + +if os_unix and not os_darwin + foreach ldflag: [ '-Wl,-Bsymbolic', '-Wl,-z,relro', '-Wl,-z,now', ] + if cc.links('int main () { return 0; }', name: ldflag, args: ldflag) + common_ldflags += [ ldflag ] + endif + endforeach +endif + +# Maintain compatibility with autotools +if os_darwin + common_ldflags += [ '-compatibility_version 1', '-current_version 1.0', ] +endif + confinc = include_directories('.') gdkinc = include_directories('gdk') gtkinc = include_directories('gtk') +testinc = include_directories('tests') -glib_dep = dependency('glib-2.0', version: '>= 2.49.4') -giounix_dep = dependency('gio-unix-2.0', required : false) -pango_dep = dependency('pango', version: '>=1.37.3') -pangoft_dep = dependency('pangoft2', required: wayland_enabled or x11_enabled) -cairo_dep = dependency('cairo', version: '>= 1.14.0') -pangocairo_dep = dependency('pangocairo') -cairogobj_dep = dependency('cairo-gobject') -pixbuf_dep = dependency('gdk-pixbuf-2.0', version: '>= 2.30.0') -epoxy_dep = dependency('epoxy', version: '>= 1.0') -atk_dep = dependency('atk', version: '>= 2.15.1') -atkbridge_dep = dependency('atk-bridge-2.0') -gmodule_dep = dependency('gmodule-2.0') -colord_dep = dependency('colord', version: '>= 0.1.9', required: false) -fontconfig_dep = dependency('fontconfig') -harfbuzz_dep = dependency('harfbuzz', version: '>= 0.9', required: false) -xkbdep = dependency('xkbcommon', version: '>= 0.2.0') +# Dependencies +glib_dep = dependency('glib-2.0', version: glib_req, + fallback : ['glib', 'libglib_dep']) +gobject_dep = dependency('gobject-2.0', version: glib_req, + fallback : ['glib', 'libgobject_dep']) +if os_win32 + giowin32_dep = dependency('gio-windows-2.0', version: glib_req, required: win32_enabled, + fallback : ['glib', 'libgio_dep']) +endif +if os_unix + giounix_dep = dependency('gio-unix-2.0', version: glib_req, required: false, + fallback : ['glib', 'libgio_dep']) +endif +gmodule_dep = dependency('gmodule-2.0', version: glib_req, + fallback : ['glib', 'libgmodule_dep']) +cairo_dep = dependency('cairo', version: cairo_req, required : cc.get_id() != 'msvc') +cairogobj_dep = dependency('cairo-gobject', version: cairo_req, required : cc.get_id() != 'msvc') +pango_dep = dependency('pango', version: pango_req, + fallback : ['pango', 'libpango_dep']) -if wayland_enabled - wlclientdep = dependency('wayland-client', version: '>= 1.9.91') - wlprotocolsdep = dependency('wayland-protocols', version: '>= 1.7') - wlcursordep = dependency('wayland-cursor', version: '>= 1.9.91') - wlegldep = dependency('wayland-egl') +# Require PangoFT2 if on X11 or wayland +require_pangoft2 = wayland_enabled or x11_enabled +pangoft_dep = dependency('pangoft2', required: require_pangoft2, + fallback : ['pango', 'libpangoft2_dep']) + +if pangoft_dep.found() + # Need at least 2.7.1 for FT_Get_Var_Design_Coordinates() + # We get the dependency itself from pango, but pango doesn't care + # about ft2 version, so an extra check is needed. + ft2_dep = dependency('freetype2', version: '>= 2.7.1', required: require_pangoft2) endif +if win32_enabled + # for GTK_IM_CONTEXT_IME + pangowin32_dep = dependency('pangowin32') +endif + +pangocairo_dep = dependency('pangocairo', version: cairo_req, + fallback : ['pango', 'libpangocairo_dep']) +pixbuf_dep = dependency('gdk-pixbuf-2.0', version: gdk_pixbuf_req, + fallback : ['gdk-pixbuf', 'gdkpixbuf_dep']) +epoxy_dep = dependency('epoxy', version: epoxy_req, + fallback: ['libepoxy', 'libepoxy_dep']) +atk_dep = dependency('atk', version: atk_req) +harfbuzz_dep = dependency('harfbuzz', version: '>= 0.9', required: false, + fallback: ['harfbuzz', 'libharfbuzz_dep']) +xkbdep = dependency('xkbcommon', version: xkbcommon_req, required: wayland_enabled) +iso_codes_dep = dependency('iso-codes', required: false) + +fontconfig_dep = [] # only used in x11 backend +atkbridge_dep = [] # only used in x11 backend + +if os_win32 + platform_gio_dep = giowin32_dep +endif +if os_unix + platform_gio_dep = giounix_dep +endif + +if iso_codes_dep.found() + cdata.set_quoted('ISO_CODES_PREFIX', iso_codes_dep.get_pkgconfig_variable('prefix')) +else + cdata.set_quoted('ISO_CODES_PREFIX', '/usr') +endif + +backend_immodules = [] + +pc_gdk_extra_libs = [] + +cairo_backends = [] +foreach backend: [ ['cairo-xlib', cairo_req, x11_enabled], + ['cairo-win32', cairo_req, win32_enabled], + ['cairo-quartz', cairo_req, quartz_enabled], + ['cairo', cairo_req, broadway_enabled or wayland_enabled], ] + backend_enabled = backend.get(2) + cairo_backend_req = backend.get(1) + cairo_backend = backend.get(0) + if backend_enabled + if dependency(cairo_backend, version: cairo_backend_req, required : cc.get_id() != 'msvc').found() + cairo_backends += [ cairo_backend ] + endif + endif +endforeach + +cairo_pkg_found = false +cairogobj_pkg_found = false + +if cairo_dep.found() + cairo_pkg_found = true +endif +if cairogobj_dep.found() + cairogobj_pkg_found = true +endif + +cairo_libs = [] + +cdata.set('HAVE_HARFBUZZ', harfbuzz_dep.found()) +cdata.set('HAVE_PANGOFT', pangoft_dep.found()) + +atk_pkgs = ['atk'] + +wayland_pkgs = [] +if wayland_enabled + wlclientdep = dependency('wayland-client', version: wayland_req) + wlprotocolsdep = dependency('wayland-protocols', version: wayland_proto_req) + wlcursordep = dependency('wayland-cursor', version: wayland_req) + wlegldep = dependency('wayland-egl') + backend_immodules += ['wayland'] + + wayland_pkgs = [ + 'wayland-client', wayland_req, + 'wayland-protocols', wayland_proto_req, + 'xkbcommon', xkbcommon_req, + 'wayland-cursor', wayland_req, + 'wayland-egl', + ] +endif + +x11_pkgs = [] if x11_enabled xrandr_dep = dependency('xrandr', version: '>= 1.2.99') xrandr15_dep = dependency('xrandr', version: '>= 1.5', required: false) @@ -200,67 +426,275 @@ if x11_enabled xdamage_dep = dependency('xdamage', required: false) xfixes_dep = dependency('xfixes', required: false) xcomposite_dep = dependency('xcomposite', required: false) + fontconfig_dep = dependency('fontconfig') + atkbridge_dep = dependency('atk-bridge-2.0', version: atk_req) + backend_immodules += ['xim'] - if xdamage_dep.found() - cdata.set('HAVE_XDAMAGE', 1) - endif + x11_pkgs = ['fontconfig', 'x11', 'xext', 'xi', 'xrandr'] if xcursor_dep.found() - cdata.set('HAVE_XCURSOR', 1) + x11_pkgs += ['xcursor'] endif - - if xcomposite_dep.found() - cdata.set('HAVE_XCOMPOSITE', 1) - endif - if xfixes_dep.found() - cdata.set('HAVE_XFIXES', 1) + x11_pkgs += ['xfixes'] + endif + if xcomposite_dep.found() + x11_pkgs += ['xcomposite'] + endif + if xdamage_dep.found() + x11_pkgs += ['xdamage'] endif + atk_pkgs += ['atk-bridge-2.0'] + cdata.set('HAVE_XDAMAGE', xdamage_dep.found()) + cdata.set('HAVE_XCURSOR', xcursor_dep.found()) + cdata.set('HAVE_XCOMPOSITE', xcomposite_dep.found()) + cdata.set('HAVE_XFIXES', xfixes_dep.found()) - if xi_dep.found() and cc.has_header('X11/extensions/XInput2.h') + if cc.has_function('XkbQueryExtension', dependencies: x11_dep, + prefix : '#include ') + cdata.set('HAVE_XKB', 1) + endif + + if cc.has_function('XSyncQueryExtension', dependencies: xext_dep, + prefix: '''#include + #include ''') + cdata.set('HAVE_XSYNC', 1) + endif + + if cc.has_function('XGetEventData', dependencies: x11_dep) + cdata.set('HAVE_XGENERICEVENTS', 1) + endif + + if xi_dep.found() and cc.has_header('X11/extensions/XInput2.h', dependencies: xi_dep) cdata.set('XINPUT_2', 1) - prefix = '#include\n#include' - if cc.has_function('XIAllowTouchEvents', prefix: prefix) and cc.has_member('XIScrollClassInfo', 'number', prefix: prefix) + # Note that we also check that the XIScrollClassInfo struct is defined, + # because at least Ubuntu Oneiric seems to have XIAllowTouchEvents(), + # but not the XIScrollClassInfo struct + has_allow_touch_evens = cc.has_function('XIAllowTouchEvents', dependencies: xi_dep) + has_scroll_class_info = cc.has_member('XIScrollClassInfo', 'number', dependencies: xi_dep, + prefix: '''#include + #include ''') + if has_allow_touch_evens and has_scroll_class_info cdata.set('XINPUT_2_2', 1) endif endif - if xrandr_dep.found() - cdata.set('HAVE_RANDR', 1) + enable_xinerama = get_option('xinerama') + if enable_xinerama != 'no' + want_xinerama = enable_xinerama == 'yes' + xinerama_dep = dependency('xinerama', required: want_xinerama) + if xinerama_dep.found() and cc.has_header_symbol('X11/extensions/Xinerama.h', 'XineramaQueryExtension', dependencies: xinerama_dep) + cdata.set('HAVE_XFREE_XINERAMA', 1) + x11_pkgs += ['xinerama'] + endif + else + xinerama_dep = [] + endif - if xrandr15_dep.found() - cdata.set('HAVE_RANDR15', 1) + cdata.set('HAVE_RANDR', xrandr_dep.found()) + cdata.set('HAVE_RANDR15', xrandr15_dep.found()) +endif + +if broadway_enabled + pc_gdk_extra_libs += ['-lz'] + backend_immodules += ['broadway'] +endif + +if quartz_enabled + pc_gdk_extra_libs += ['-framework Cocoa', '-framework Carbon'] + backend_immodules += ['quartz'] +endif + +extra_demo_ldflags = [] +if win32_enabled + pc_gdk_extra_libs += ['-lgdi32', '-limm32', '-lshell32', '-lole32'] + if cc.get_id() == 'msvc' + # Since the demo programs are now built as pure GUI programs, we + # need to pass in /entry:mainCRTStartup so that they will properly + # link on Visual Studio builds + extra_demo_ldflags = ['/entry:mainCRTStartup'] + else + pc_gdk_extra_libs += ['-Wl,-luuid'] + endif + pc_gdk_extra_libs += ['-lwinmm', '-ldwmapi', '-lsetupapi', '-lcfgmgr32'] + backend_immodules += ['ime'] +endif + +# Check for bind_textdomain_codeset, including -lintl if GLib brings it in by +# doing the same check as glib. We can't check that by linking to glib because +# it might be a subproject and hence not built yet. +if cc.has_function('ngettext') + libintl_dep = [] + cdata.set('HAVE_BIND_TEXTDOMAIN_CODESET', 1) +else + libintl_dep = cc.find_library('intl', required : false) + if cc.has_function('bind_textdomain_codeset', dependencies: libintl_dep) + cdata.set('HAVE_BIND_TEXTDOMAIN_CODESET', 1) + else + # Don't use subproject('proxy-libintl').get_variable('intl_dep') because that + # makes the dependency unconditional. This way, people have the option of + # either not providing the subproject or disabling it entirely with + # --wrap-mode=nodownload or nofallback. + libintl_dep = dependency('', required : false, + fallback: ['proxy-libintl', 'intl_dep']) + if libintl_dep.found() + cdata.set('HAVE_BIND_TEXTDOMAIN_CODESET', 1) endif endif endif -mlib = cc.find_library('m', required: false) -shmlib = cc.find_library('rt') - -if giounix_dep.found() - cdata.set('HAVE_GIO_UNIX', 1) +if os_unix + cdata.set('HAVE_GIO_UNIX', giounix_dep.found()) endif -if colord_dep.found() - cdata.set('HAVE_COLORD', 1) +cloudproviders_enabled = get_option('cloudproviders') +if cloudproviders_enabled + cloudproviders_dep = dependency('cloudproviders', required: true) + if cloudproviders_dep.found() + cdata.set('HAVE_CLOUDPROVIDERS', cloudproviders_dep.found()) + else + error('Cloudproviders support not found, but was explicitly requested.') + endif endif -if mlib.found() - cdata.set('HAVE_LIBM', 1) -endif - -configure_file( - input : 'config.h.meson', - output: 'config.h', - configuration: cdata -) - subdir('gdk') subdir('gtk') -subdir('demos') -subdir('tests') -subdir('testsuite') -subdir('examples') +subdir('modules') +if get_option('demos') + subdir('demos') +endif +if get_option('build-tests') + subdir('tests') + subdir('testsuite') +endif +if get_option('build-examples') + subdir('examples') +endif + +# config.h +configure_file(input: 'config.h.meson', + output: 'config.h', + configuration: cdata) + +# pkg-config files - bit of a mess all of this +pkgconf = configuration_data() + +pkgconf.set('prefix', get_option('prefix')) +pkgconf.set('exec_prefix', '${prefix}') +pkgconf.set('libdir', '${prefix}/@0@'.format(get_option('libdir'))) +pkgconf.set('includedir', '${prefix}/@0@'.format(get_option('includedir'))) +pkgconf.set('GTK_API_VERSION', gtk_api_version) +pkgconf.set('VERSION', meson.project_version()) +pkgconf.set('GTK_BINARY_VERSION', gtk_binary_version) +pkgconf.set('host', '@0@-@1@'.format(host_machine.cpu_family(), host_machine.system())) # FIXME + +# Requires +pango_pkgname = win32_enabled ? 'pangowin32' : 'pango' +gdk_packages = ' '.join([ pango_pkgname, pango_req, + 'pangocairo', pango_req, + 'gdk-pixbuf-2.0', gdk_pixbuf_req ]) + +if cairo_pkg_found + gdk_packages += ' '.join([ ' cairo', cairo_req ]) +endif +if cairogobj_pkg_found + gdk_packages += ' '.join([ ' cairo-gobject', cairo_req ]) +endif + +pkgconf.set('GDK_PACKAGES', gdk_packages) +pkgconf.set('GTK_PACKAGES', + ' '.join([ 'atk', atk_req, + 'gio-2.0', glib_req ])) + +# Requires.private +pc_gdk_extra_libs += cairo_libs + +gio_pkgname = os_unix ? 'gio-unix-2.0' : 'gio-2.0' +pkgconf.set('GDK_PRIVATE_PACKAGES', + ' '.join([ gio_pkgname, glib_req, + 'epoxy', epoxy_req ] + x11_pkgs + wayland_pkgs + cairo_backends)) +pangoft2_pkgs = (wayland_enabled or x11_enabled) ? ['pangoft2'] : [] +pkgconf.set('GTK_PRIVATE_PACKAGES', ' '.join(atk_pkgs + pangoft2_pkgs)) + +pkgconf.set('GDK_EXTRA_LIBS', ' '.join(pc_gdk_extra_libs)) +pkgconf.set('GSK_EXTRA_LIBS', '') +pkgconf.set('GTK_EXTRA_LIBS', '') + +pkgconf.set('GDK_EXTRA_CFLAGS', '') +pkgconf.set('GSK_EXTRA_CFLAGS', '') +pkgconf.set('GTK_EXTRA_CFLAGS', '') + +pkg_install_dir = join_paths(get_option('libdir'), 'pkgconfig') + +pkgs = [ 'gtk+-3.0.pc' ] + +pkg_targets = '' +foreach backend: [ 'broadway', 'quartz', 'wayland', 'win32', 'x11', ] + if get_variable('@0@_enabled'.format(backend)) + pkgs += ['gtk+-@0@-3.0.pc'.format(backend)] + pkg_targets += ' ' + backend + endif +endforeach +pkgconf.set('GDK_BACKENDS', pkg_targets.strip()) + +configure_file(input: 'gdk-3.0.pc.in', + output: 'gdk-3.0.pc', + configuration: pkgconf, + install_dir: pkg_install_dir) + +foreach pkg: pkgs + configure_file(input: 'gtk+-3.0.pc.in', + output: pkg, + configuration: pkgconf, + install_dir: pkg_install_dir) +endforeach + +if os_unix + configure_file(input: 'gtk+-unix-print-3.0.pc.in', + output: 'gtk+-unix-print-3.0.pc', + configuration: pkgconf, + install_dir: pkg_install_dir) +endif + +# TODO +#subdir('po') +#subdir('po-properties') +#if get_option('documentation') +# subdir('docs/tools') +# subdir('docs/reference') +#endif + +# Keep this in sync with post-install.sh expected arguments +meson.add_install_script('build-aux/meson/post-install.sh', + gtk_api_version, + gtk_binary_version, + gtk_libdir, + gtk_datadir) + +summary = [ + '', + '------', + 'GTK+ @0@ (@1@)'.format(gtk_version, gtk_api_version), + '', + ' Display backends: @0@'.format(pkg_targets.strip()), + ' Print backends: @0@'.format(' '.join(print_backends)), + ' Cloud support: @0@'.format(get_option('cloudproviders')), + ' Colord support: @0@'.format(get_option('colord')), + ' Introspection: @0@'.format(get_option('introspection')), + ' Documentation: @0@'.format(get_option('documentation')), + ' Build tests: @0@'.format(get_option('build-tests')), + ' Demos: @0@'.format(get_option('demos')), + ' Examples: @0@'.format(get_option('build-examples')), + 'Directories:', + ' prefix: @0@'.format(gtk_prefix), + ' includedir: @0@'.format(gtk_includedir), + ' libdir: @0@'.format(gtk_libdir), + ' datadir: @0@'.format(gtk_datadir), + '------', + '' +] + +message('\n'.join(summary)) diff --git a/meson_options.txt b/meson_options.txt index e8f8ee60e9..79aca2aa66 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,3 +1,39 @@ -option('enable-x11-backend', type: 'boolean', value: 'true') -option('enable-wayland-backend', type: 'boolean', value: 'true') -option('enable-broadway-backend', type: 'boolean', value: 'false') +# GDK backends +option('x11-backend', type: 'boolean', value: true, + description : 'Enable the X11 gdk backend (only when building on Unix)') +option('wayland-backend', type: 'boolean', value: true, + description : 'Enable the wayland gdk backend (only when building on Unix except for macOS)') +option('broadway-backend', type: 'boolean', value: false, + description : 'Enable the broadway (HTML5) gdk backend') +option('win32-backend', type: 'boolean', value: true, + description : 'Enable the Windows gdk backend (only when building on Windows)') +option('quartz-backend', type: 'boolean', value: true, + description : 'Enable the macOS gdk backend (only when building on macOS)') + +# Optional dependencies +option('xinerama', type: 'combo', choices : ['yes', 'no', 'auto'], value : 'auto', + description : 'Enable support for the Xinerama extension') +option('cloudproviders', type: 'boolean', value: false, + description : 'Enable the cloudproviders support') + +# Print backends +option('print-backends', type : 'string', value : 'cups,file', + description : 'Build the specified print backends (comma-separated list, "all", or "none")') +option('colord', type: 'combo', choices : ['yes', 'no', 'auto'], value : 'auto', + description : 'Build colord support for the CUPS printing backend') + +# Documentation and introspection +option('documentation', type: 'boolean', value: 'false', + description : 'Build API reference and tools documentation') +option('man-pages', type: 'boolean', value: 'false', + description : 'Build man pages for installed tools') +option('introspection', type: 'boolean', value: 'true', + description : 'Build introspection data (requires gobject-introspection)') + +# Demos and binaries +option('demos', type: 'boolean', value: 'true', + description : 'Build demo programs') +option('build-examples', type: 'boolean', value: 'true', + description : 'Build examples') +option('build-tests', type: 'boolean', value: 'true', + description : 'Build tests') diff --git a/modules/meson.build b/modules/meson.build new file mode 100644 index 0000000000..9779ee6ae8 --- /dev/null +++ b/modules/meson.build @@ -0,0 +1,8 @@ +# TODO +#if os_unix +# subdir('printbackends') +#else + print_backends = [] +#endif + +#subdir('input') diff --git a/testsuite/gdk/meson.build b/testsuite/gdk/meson.build index 6c33c5e165..326c6545a8 100644 --- a/testsuite/gdk/meson.build +++ b/testsuite/gdk/meson.build @@ -1,24 +1,24 @@ -test_cairo = executable('cairo', 'cairo.c', dependencies: libgdk_dep) +test_cairo = executable('cairo', 'cairo.c', dependencies: libgtk_dep) test('gdk/cairo', test_cairo) -test_display = executable('display', 'display.c', dependencies: libgdk_dep) +test_display = executable('display', 'display.c', dependencies: libgtk_dep) test('gdk/display', test_display) -test_encoding = executable('encoding', 'encoding.c', dependencies: libgdk_dep) +test_encoding = executable('encoding', 'encoding.c', dependencies: libgtk_dep) test('gdk/encoding', test_encoding) -test_keysyms = executable('keysyms', 'keysyms.c', dependencies: libgdk_dep) +test_keysyms = executable('keysyms', 'keysyms.c', dependencies: libgtk_dep) test('gdk/keysyms', test_keysyms) -test_rectangle = executable('rectangle', 'rectangle.c', dependencies: libgdk_dep) +test_rectangle = executable('rectangle', 'rectangle.c', dependencies: libgtk_dep) test('gdk/rectangle', test_rectangle) -test_rgba = executable('rgba', 'rgba.c', dependencies: libgdk_dep) +test_rgba = executable('rgba', 'rgba.c', dependencies: libgtk_dep) test('gdk/rgba', test_rgba) -test_seat = executable('seat', 'seat.c', dependencies: libgdk_dep) +test_seat = executable('seat', 'seat.c', dependencies: libgtk_dep) test('gdk/seat', test_seat) -test_visual = executable('visual', 'visual.c', dependencies: libgdk_dep) +test_visual = executable('visual', 'visual.c', dependencies: libgtk_dep) test('gdk/visual', test_visual) diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build index a11db7be76..ad1789c48c 100644 --- a/testsuite/gtk/meson.build +++ b/testsuite/gtk/meson.build @@ -1,150 +1,109 @@ -test_accel = executable('accel', 'accel.c', dependencies: libgtk_dep) -test('gtk/accel test', test_accel) +gtk_tests_export_dynamic_ldflag = [] -test_accessible = executable('accessible', 'accessible.c', dependencies: libgtk_dep) -test('gtk/accessible test', test_accessible) +if cc.get_id() != 'msvc' + gtk_tests_export_dynamic_ldflag = ['-Wl,--export-dynamic'] +endif -test_action = executable('action', 'action.c', dependencies: libgtk_dep) -test('gtk/action test', test_action) +tests = [ + ['accel'], + ['accessible'], + ['action'], + ['adjustment'], + ['bitmask', ['../../gtk/gtkallocatedbitmask.c'], ['-DGTK_COMPILATION', '-UG_ENABLE_DEBUG']], + ['builder', [], [], gtk_tests_export_dynamic_ldflag], + ['builderparser'], + ['cellarea'], + ['check-icon-names'], + ['check-cursor-names'], + ['cssprovider'], + ['defaultvalue'], + ['entry'], + ['firefox-stylecontext'], + ['floating'], + ['focus'], + ['gestures'], + ['grid'], + ['gtkmenu'], + ['icontheme'], + ['keyhash', ['../../gtk/gtkkeyhash.c', gtkresources, '../../gtk/gtkprivate.c'], gtk_cargs], + ['listbox'], + ['notify'], + ['no-gtk-init'], + ['object'], + ['papersize'], + ['rbtree', ['../../gtk/gtkrbtree.c'], ['-DGTK_COMPILATION', '-UG_ENABLE_DEBUG']], + ['recentmanager'], + ['regression-tests'], + ['scrolledwindow'], + ['spinbutton'], + ['stylecontext'], + ['templates'], + ['textbuffer'], + ['textiter'], + ['treemodel', ['treemodel.c', 'liststore.c', 'treestore.c', 'filtermodel.c', + 'modelrefcount.c', 'sortmodel.c', 'gtktreemodelrefcount.c']], + ['treepath'], + ['treeview'], + ['typename'], + ['window'], + ['displayclose'], + ['revealer-size'], +] +test_cargs = [] -test_adjustment = executable('adjustment', 'adjustment.c', dependencies: libgtk_dep) -test('gtk/adjustment test', test_adjustment) +if os_unix + # tests += [['defaultvalue']] # disabled in Makefile.am as well + test_cargs += ['-DHAVE_UNIX_PRINT_WIDGETS'] +endif -test_bitmask = executable('bitmask', 'bitmask.c', dependencies: libgtk_dep) -test('gtk/bitmask test', test_bitmask) - -test_builder = executable('builder', 'builder.c', dependencies: libgtk_dep) -test('gtk/builder test', test_builder) - -test_builderparser = executable( - 'builderparser', - 'builderparser.c', - dependencies: libgtk_dep, - link_with: libgtk, - -) -test( - 'gtk/builderparser test', - test_builderparser, - env: [ - 'G_TEST_SRCDIR='+meson.source_root(), - 'G_TEST_BUILDDIR='+meson.build_root() +if x11_enabled + tests += [ + ['clipboard'], + ['objects-finalize', ['../../gdk/x11/gdkdisplaymanager-x11.c'], ['-DGDK_COMPILATION', '-UG_ENABLE_DEBUG']], ] -) +endif -test_cellarea = executable('cellarea', 'cellarea.c', dependencies: libgtk_dep) -test('gtk/cellarea test', test_cellarea) +foreach t : tests + test_name = t.get(0) + test_srcs = ['@0@.c'.format(test_name)] + t.get(1, []) + test_extra_cargs = t.get(2, []) + test_extra_ldflags = t.get(3, []) -test_check_icon_names = executable('check_icon_names', 'check-icon-names.c', dependencies: libgtk_dep) -test('gtk/check_icon_names test', test_check_icon_names) + test_exe = executable(test_name, test_srcs, + c_args : test_cargs + test_extra_cargs, + link_args : test_extra_ldflags, + dependencies : libgtk_dep) -test_check_cursor_names = executable('check_cursor_names', 'check-cursor-names.c', dependencies: libgtk_dep) -test('gtk/check_cursor_names test', test_check_cursor_names) + test(test_name, test_exe, + args: [ '--tap', '-k' ], + env: [ 'GIO_USE_VOLUME_MONITOR=unix', + 'GSETTINGS_BACKEND=memory', + 'GTK_CSD=1', + 'G_ENABLE_DIAGNOSTIC=0', + 'GSK_RENDERER=cairo', + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + 'GSETTINGS_SCHEMA_DIR=@0@'.format(gtk_schema_build_dir), + ], + suite: 'gtk') +endforeach -test_clipboard = executable('clipboard', 'clipboard.c', dependencies: libgtk_dep) -test('gtk/clipboard test', test_clipboard) - -test_cssprovider = executable('cssprovider', 'cssprovider.c', dependencies: libgtk_dep) -test('gtk/cssprovider test', test_cssprovider) - -test_defaultvalue = executable('defaultvalue', 'defaultvalue.c', dependencies: libgtk_dep) -test('gtk/defaultvalue test', test_defaultvalue) - -test_entry = executable('entry', 'entry.c', dependencies: libgtk_dep) -test('gtk/entry test', test_entry) - -test_firefox_stylecontext = executable('firefox_stylecontext', 'firefox-stylecontext.c', dependencies: libgtk_dep) -test('gtk/firefox_stylecontext test', test_firefox_stylecontext) - -test_floating = executable('floating', 'floating.c', dependencies: libgtk_dep) -test('gtk/floating test', test_floating) - -test_focus = executable('focus', 'focus.c', dependencies: libgtk_dep) -test('gtk/focus test', test_focus) - -test_gestures = executable('gestures', 'gestures.c', dependencies: libgtk_dep) -test('gtk/gestures test', test_gestures) - -test_grid = executable('grid', 'grid.c', dependencies: libgtk_dep) -test('gtk/grid test', test_grid) - -test_gtkmenu = executable('gtkmenu', 'gtkmenu.c', dependencies: libgtk_dep) -test('gtk/gtkmenu test', test_gtkmenu) - -test_icontheme = executable('icontheme', 'icontheme.c', dependencies: libgtk_dep) -test('gtk/icontheme test', test_icontheme) - -test_keyhash = executable('keyhash', 'keyhash.c', dependencies: libgtk_dep) -test('gtk/keyhash test', test_keyhash) - -test_listbox = executable('listbox', 'listbox.c', dependencies: libgtk_dep) -test('gtk/listbox test', test_listbox) - -test_notify = executable('notify', 'notify.c', dependencies: libgtk_dep) -test('gtk/notify test', test_notify) - -test_no_gtk_init = executable('no_gtk_init', 'no-gtk-init.c', dependencies: libgtk_dep) -test('gtk/no_gtk_init test', test_no_gtk_init) - -test_object = executable('object', 'object.c', dependencies: libgtk_dep) -test('gtk/object test', test_object) - -test_objects_finalize = executable('objects_finalize', 'objects-finalize.c', dependencies: libgtk_dep) -test('gtk/objects_finalize test', test_objects_finalize) - -test_papersize = executable('papersize', 'papersize.c', dependencies: libgtk_dep) -test('gtk/papersize test', test_papersize) - -test_rbtree = executable('rbtree', 'rbtree.c', dependencies: libgtk_dep) -test('gtk/rbtree test', test_rbtree) - -test_recentmanager = executable('recentmanager', 'recentmanager.c', dependencies: libgtk_dep) -test('gtk/recentmanager test', test_recentmanager) - -test_regression_tests = executable('regression_tests', 'regression-tests.c', dependencies: libgtk_dep) -test('gtk/regression_tests test', test_regression_tests) - -test_scrolledwindow = executable('scrolledwindow', 'scrolledwindow.c', dependencies: libgtk_dep) -test('gtk/scrolledwindow test', test_scrolledwindow) - -test_spinbutton = executable('spinbutton', 'spinbutton.c', dependencies: libgtk_dep) -test('gtk/spinbutton test', test_spinbutton) - -test_stylecontext = executable('stylecontext', 'stylecontext.c', dependencies: libgtk_dep) -test('gtk/stylecontext test', test_stylecontext) - -test_templates = executable('templates', 'templates.c', dependencies: libgtk_dep) -test('gtk/templates test', test_templates) - -test_textbuffer = executable('textbuffer', 'textbuffer.c', dependencies: libgtk_dep) -test('gtk/textbuffer test', test_textbuffer) - -test_textiter = executable('textiter', 'textiter.c', dependencies: libgtk_dep) -test('gtk/textiter test', test_textiter) - -test_treemodel = executable( - 'treemodel', - 'treemodel.c', 'liststore.c', 'treestore.c', 'filtermodel.c', - 'modelrefcount.c', 'sortmodel.c', 'gtktreemodelrefcount.c', - dependencies: libgtk_dep -) -test('gtk/treemodel test', test_treemodel) - -test_treepath = executable('treepath', 'treepath.c', dependencies: libgtk_dep) -test('gtk/treepath test', test_treepath) - -test_treeview = executable('treeview', 'treeview.c', dependencies: libgtk_dep) -test('gtk/treeview test', test_treeview) - -test_typename = executable('typename', 'typename.c', dependencies: libgtk_dep) -test('gtk/typename test', test_typename) - -test_window = executable('window', 'window.c', dependencies: libgtk_dep) -test('gtk/window test', test_window) - -test_displayclose = executable('displayclose', 'displayclose.c', dependencies: libgtk_dep) -test('gtk/displayclose test', test_displayclose) - -test_revealer_size = executable('revealer_size', 'revealer-size.c', dependencies: libgtk_dep) -test('gtk/revealer_size test', test_revealer_size) +# FIXME: if objc autotestkeywords_CPPFLAGS += -DHAVE_OBJC=1 -x objective-c++ +if add_languages('cpp', required: false) + test_exe = executable('autotestkeywords', + 'autotestkeywords.cc', + c_args : test_cargs + ['-Idummy-headers'], + dependencies : libgtk_dep) + test('c++ keywords', test_exe, + args: [ '--tap', '-k' ], + env: [ 'GIO_USE_VOLUME_MONITOR=unix', + 'GSETTINGS_BACKEND=memory', + 'GTK_CSD=1', + 'G_ENABLE_DIAGNOSTIC=0', + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + 'GSETTINGS_SCHEMA_DIR=@0@'.format(gtk_schema_build_dir), + ], + suite: 'gtk') +endif