{
    "module": "waylandcompositor",
    "condition": "module.gui",
    "depends": [
        "gui-private"
    ],
    "testDir": "../../config.tests",

    "libraries": {
        "wayland-server": {
            "label": "wayland-server",
            "headers": "wayland-version.h",
            "test": {
                "main": [
                    "#if WAYLAND_VERSION_MAJOR < 1",
                    "# error Wayland 1.8.0 or higher required",
                    "#endif",
                    "#if WAYLAND_VERSION_MAJOR == 1",
                    "# if WAYLAND_VERSION_MINOR < 8",
                    "#  error Wayland 1.8.0 or higher required",
                    "# endif",
                    "# if WAYLAND_VERSION_MINOR == 8",
                    "#  if WAYLAND_VERSION_MICRO < 0",
                    "#   error Wayland 1.8.0 or higher required",
                    "#  endif",
                    "# endif",
                    "#endif"
                 ]
            },
            "sources": [
                { "type": "pkgConfig", "args": "wayland-server" },
                "-lwayland-server"
            ]
        },
        "wayland-egl": {
            "headers": "wayland-egl.h",
            "test": {
                "main": "struct wl_egl_window *window = wl_egl_window_create(0, 100, 100);"
            },
            "sources": [
                { "type": "pkgConfig", "args": "wayland-egl" },
                "-lwayland-egl",
                "-lEGL"
            ]
        },
        "wayland-kms": {
            "label": "wayland-kms",
            "test": {
                "tail": [
                    "extern \"C\" {",
                    "#include <math.h> /* may fail because of 'private:' in c++ type_traits.h */",
                    "#define private priv",
                    "#include <wayland-kms.h>",
                    "#undef private",
                    "}"
                ],
                "main": [
                    "struct wl_resource *buffer = nullptr;",
                    "struct wl_kms_buffer *kmsBuffer = wayland_kms_buffer_get(buffer);"
                ]
            },
            "sources": [
                { "type": "pkgConfig", "args": "wayland-kms" },
                "-lwayland-kms"
            ]
        },
        "xcomposite": {
            "headers": "X11/extensions/Xcomposite.h",
            "test": {
                "main": "XCompositeRedirectWindow((Display *)0,(Window) 0, CompositeRedirectManual);"
            },
            "sources": [
                { "type": "pkgConfig", "args": "xcomposite" },
                "-lxcomposite"
            ]
        },
        "glx": {
            "headers": "GL/glx.h",
            "test": {
                "main": [
                    "Display *dpy = XOpenDisplay(0);",
                    "int items = 0;",
                    "GLXFBConfig *fbc = glXChooseFBConfig(dpy, DefaultScreen(dpy), 0 , &items);"
                ]
            },
            "sources": [
                { "type": "pkgConfig", "args": "x11 gl" },
                "-lX11 -lGl"
            ]
        }
    },

    "tests": {
        "wayland-scanner": {
            "type": "compile",
            "test": "wayland_scanner",
            "use": "wayland-server"
        },
        "drm-egl-server": {
            "type": "compile",
            "test": {
                "include": [
                    "EGL/egl.h",
                    "EGL/eglext.h"
                ],
                "main": [
                    "#ifdef EGL_MESA_drm_image",
                    "return 0;",
                    "#else",
                    "#error Requires EGL_MESA_drm_image to be defined",
                    "return 1;",
                    "#endif"
                ]
            },
            "use": "egl"
        },
        "libhybris-egl-server": {
            "type": "compile",
            "test": {
                "include": [
                    "EGL/egl.h",
                    "EGL/eglext.h",
                    "hybris/eglplatformcommon/hybris_nativebufferext.h"
                ],
                "main": [
                    "#ifdef EGL_HYBRIS_native_buffer",
                    "return 0;",
                    "#else",
                    "#error Requires EGL_HYBRIS_native_buffer to be defined",
                    "return 1;",
                    "#endif"
                ]
            },
            "use": "egl"
        },
        "dmabuf-server-buffer": {
            "label": "Linux dma-buf Buffer Sharing",
            "type": "compile",
            "test": {
                "include": [
                    "EGL/egl.h",
                    "EGL/eglext.h",
                    "drm_fourcc.h"
                ],
                "main": [
                    "#ifdef EGL_LINUX_DMA_BUF_EXT",
                    "return 0;",
                    "#else",
                    "#error Requires EGL_LINUX_DMA_BUF_EXT",
                    "return 1;",
                    "#endif"
                ]
            },
            "use": "egl drm"
        },
        "dmabuf-client-buffer": {
            "label": "Linux Client dma-buf Buffer Sharing",
            "type": "compile",
            "test": {
                "include": [
                    "EGL/egl.h",
                    "EGL/eglext.h",
                    "drm_mode.h",
                    "drm_fourcc.h"
                ],
                "main": [
                    "// test if DMA BUF is supported",
                    "#ifndef EGL_LINUX_DMA_BUF_EXT",
                    "#error DMA BUF Extension not available",
                    "#endif",
                    "// test if DMA BUF import modifier extension is supported",
                    "#ifndef EGL_EXT_image_dma_buf_import_modifiers",
                    "#error DMA BUF Import modifier extension not available",
                    "#endif",
                    "return 0;"
                ]
            },
            "use": "egl drm"
        },
        "vulkan-server-buffer": {
            "label": "Vulkan Buffer Sharing",
            "type": "compile",
            "test": {
                "head": [
                    "#define VK_USE_PLATFORM_WAYLAND_KHR 1"
                ],
                "include": [
                    "vulkan/vulkan.h"
                ],
                "main": [
                    "VkExportMemoryAllocateInfoKHR exportAllocInfo = {};",
                    "exportAllocInfo.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR;",
                    "exportAllocInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;",
                    "return 0;"
                ]
            }
        }
    },

    "features": {
        "wayland-server": {
            "label": "Qt Wayland Compositor",
            "condition": "!config.win32 && libs.wayland-server && tests.wayland-scanner",
            "output": [ "privateFeature" ]
        },
        "wayland-datadevice": {
            "condition": "features.draganddrop || features.clipboard",
            "output": [ "privateFeature" ]
        },
        "wayland-egl": {
            "label": "EGL",
            "condition": "features.wayland-server && features.opengl && features.egl && libs.wayland-egl",
            "output": [ "privateFeature" ]
        },
        "wayland-brcm": {
            "label": "Raspberry Pi",
            "condition": "features.wayland-server && features.eglfs_brcm",
            "output": [ "privateFeature" ]
        },
        "xcomposite-egl": {
            "label": "XComposite EGL",
            "condition": "features.wayland-server && features.egl && features.opengl && libs.xcomposite",
            "output": [ "privateFeature" ]
        },
        "xcomposite-glx": {
            "label": "XComposite EGL",
            "condition": "features.wayland-server && features.opengl && !features.opengles2 && libs.xcomposite && libs.glx",
            "output": [ "privateFeature" ]
        },
        "wayland-drm-egl-server-buffer": {
            "label": "DRM EGL",
            "condition": "features.wayland-server && features.opengl && features.egl && tests.drm-egl-server",
            "output": [ "privateFeature" ]
        },
        "wayland-libhybris-egl-server-buffer": {
            "label": "libhybris EGL",
            "condition": "features.wayland-server && features.opengl && features.egl && tests.libhybris-egl-server",
            "output": [ "privateFeature" ]
        },
        "wayland-dmabuf-server-buffer": {
            "label": "Linux dma-buf server buffer integration",
            "condition": "features.wayland-server && features.opengl && features.egl && tests.dmabuf-server-buffer",
            "output": [ "privateFeature" ]
        },
        "wayland-dmabuf-client-buffer": {
            "label": "Linux dma-buf client buffer integration",
            "condition": "features.wayland-server && features.opengl && features.egl && tests.dmabuf-client-buffer",
            "output": [ "privateFeature" ]
        },
        "wayland-vulkan-server-buffer": {
            "label": "Vulkan-based server buffer integration",
            "condition": "features.wayland-server && features.vulkan && features.opengl && features.egl && tests.vulkan-server-buffer",
            "output": [ "privateFeature" ]
        },
        "wayland-shm-emulation-server-buffer": {
            "label": "Shm emulation server buffer",
            "condition": "features.wayland-server && features.opengl",
            "output": [ "privateFeature" ]
        },
        "wayland-layer-integration-vsp2": {
            "label": "VSP2 hardware layer integration",
            "condition": "features.wayland-server && features.eglfs_vsp2 && libs.wayland-kms",
            "output": [ "privateFeature" ]
        },
        "wayland-compositor-quick": {
            "label": "QtQuick integration for wayland compositor",
            "purpose": "Allows QtWayland compositor types to be used with QtQuick",
            "condition": "features.wayland-server && module.quick",
            "output": [ "publicFeature" ]
        }
    },

    "summary": [
        "wayland-server",
        {
            "section": "Qt Wayland Compositor Layer Plugins",
            "condition": "features.wayland-server",
            "entries": [
                "wayland-layer-integration-vsp2"
            ]
        }
    ]
}
