# SPDX-License-Identifier: GPL-2.0-or-later
cmake_minimum_required(VERSION 3.25)
project(StereoShow VERSION 1.0.0 LANGUAGES C CXX)
include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_AUTOMOC ON)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Quick DBus Test)
find_package(Qt6GuiPrivate REQUIRED)
find_package(KF6IdleTime REQUIRED)
find_package(KF6Config REQUIRED)
find_package(KF6Screen REQUIRED)
find_package(StereoDeclare REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(Wayland REQUIRED IMPORTED_TARGET wayland-client)
set(SAVER_DIRECTORY "/usr/lib/gl-stereo/savers" CACHE PATH "Installed validated producers")
set(SAVER_CATALOGUE "/usr/share/gl-stereo/catalogue.json" CACHE FILEPATH "Package-validated catalogue")
add_custom_command(OUTPUT viewporter-client-protocol.h viewporter-protocol.c
    COMMAND wayland-scanner client-header /usr/share/wayland-protocols/stable/viewporter/viewporter.xml viewporter-client-protocol.h
    COMMAND wayland-scanner private-code /usr/share/wayland-protocols/stable/viewporter/viewporter.xml viewporter-protocol.c)
add_library(stereoshow SHARED frameclient.cpp stereobackground.cpp viewporter-protocol.c)
target_include_directories(stereoshow PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/gl-stereo> PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_compile_definitions(stereoshow PRIVATE SAVER_DIRECTORY="${SAVER_DIRECTORY}" SAVER_CATALOGUE="${SAVER_CATALOGUE}")
target_link_libraries(stereoshow PUBLIC Qt6::Quick Qt6::DBus KF6::ConfigCore KF6::ScreenDpms PRIVATE Qt6::GuiPrivate StereoDeclare::stereo-declare PkgConfig::Wayland)
add_executable(policytest policytest.cpp)
enable_testing()
add_test(NAME show-policy COMMAND policytest)
target_sources(stereoshow PRIVATE showsession.cpp)
target_link_libraries(stereoshow PRIVATE KF6::IdleTime)
export(TARGETS stereoshow FILE ${CMAKE_CURRENT_BINARY_DIR}/StereoShowTargets.cmake NAMESPACE StereoShow::)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/StereoShowConfig.cmake "include(CMakeFindDependencyMacro)\nfind_dependency(Qt6 COMPONENTS Quick DBus)\nfind_dependency(KF6Config)\nfind_dependency(KF6Screen)\ninclude(\"\${CMAKE_CURRENT_LIST_DIR}/StereoShowTargets.cmake\")\n")
add_executable(gl-stereo-show idleshow.cpp)
target_link_libraries(gl-stereo-show PRIVATE stereoshow)
add_executable(capture capture.cpp)
target_link_libraries(capture PRIVATE Qt6::Gui Qt6::DBus)
add_executable(frameclienttest frameclienttest.cpp)
target_link_libraries(frameclienttest PRIVATE stereoshow)
add_test(NAME native-frame-client COMMAND frameclienttest)
set_tests_properties(native-frame-client PROPERTIES TIMEOUT 15 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_PREFIX_PATH}/lib")
target_compile_options(policytest PRIVATE -UNDEBUG)
add_custom_command(OUTPUT fake-input-client-protocol.h fake-input-protocol.c
    COMMAND wayland-scanner client-header /usr/share/plasma-wayland-protocols/fake-input.xml fake-input-client-protocol.h
    COMMAND wayland-scanner private-code /usr/share/plasma-wayland-protocols/fake-input.xml fake-input-protocol.c)
add_executable(rig-input rig-input.c fake-input-protocol.c)
target_include_directories(rig-input PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(rig-input PRIVATE PkgConfig::Wayland)

set_target_properties(stereoshow PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1)
install(TARGETS stereoshow EXPORT StereoShowTargets)
install(TARGETS gl-stereo-show)
install(EXPORT StereoShowTargets NAMESPACE StereoShow:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/StereoShow)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/StereoShowConfig.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/StereoShow)
install(FILES frameclient.h showsession.h showpolicy.h stereobackground.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/gl-stereo)
install(FILES org.sparky.stereoshow.desktop DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/xdg/autostart)
install(FILES stereoshowrc DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/xdg)
install(FILES stereoshow.kcfg DESTINATION ${CMAKE_INSTALL_DATADIR}/config.kcfg)
add_executable(nativeframetest nativeframetest.cpp)
target_link_libraries(nativeframetest PRIVATE stereoshow Qt6::Test)
add_test(NAME native-untrusted-frames COMMAND nativeframetest)
add_custom_command(OUTPUT idle-inhibit-client-protocol.h idle-inhibit-protocol.c
    COMMAND wayland-scanner client-header /usr/share/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml idle-inhibit-client-protocol.h
    COMMAND wayland-scanner private-code /usr/share/wayland-protocols/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml idle-inhibit-protocol.c)
add_executable(rig-inhibit rig-inhibit.cpp idle-inhibit-protocol.c)
target_include_directories(rig-inhibit PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(rig-inhibit PRIVATE Qt6::Quick Qt6::GuiPrivate PkgConfig::Wayland)
