Initial commit

Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2025-10-04 23:12:01 +03:00
parent fcf3c612a0
commit 6e86ff41db
7 changed files with 645 additions and 294 deletions

View File

@@ -1,32 +1,37 @@
cmake_minimum_required(VERSION 3.16)
project(skia_wayland_nodeco LANGUAGES C CXX)
project(waylight LANGUAGES C CXX)
# --- toolchain & opts ---------------------------------------------------------
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# --- deps (pkg-config) --------------------------------------------------------
find_package(PkgConfig REQUIRED)
pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
pkg_check_modules(WAYLAND_EGL REQUIRED wayland-egl)
pkg_check_modules(EGL REQUIRED egl)
pkg_check_modules(GLES2 REQUIRED glesv2)
# Skia package name varies; this works on many distros. Adjust if needed.
pkg_check_modules(SKIA REQUIRED skia)
# The protocol XMLs live here:
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
pkg_check_modules(WAYLAND_EGL REQUIRED IMPORTED_TARGET wayland-egl)
pkg_check_modules(EGL REQUIRED IMPORTED_TARGET egl)
pkg_check_modules(GLES2 REQUIRED IMPORTED_TARGET glesv2)
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
pkg_check_modules(LIBPORTAL REQUIRED IMPORTED_TARGET libportal)
pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols)
pkg_check_modules(WLR_PROTOCOLS REQUIRED wlr-protocols)
include(FetchContent)
FetchContent_Declare(
raylib
GIT_REPOSITORY https://github.com/slendidev/raylib.git
GIT_TAG "lunar"
GIT_SHALLOW 1
)
set(OPENGL_VERSION "ES 2.0")
set(PLATFORM DRM)
set(BUILD_EXAMPLES OFF)
FetchContent_MakeAvailable(raylib)
# --- scanners -----------------------------------------------------------------
find_program(WAYLAND_SCANNER wayland-scanner REQUIRED)
# waylandpp's generator; provided by the waylandpp package
# (typically installed as 'wayland-scanner++')
find_program(WAYLAND_SCANNER_PP wayland-scanner++ REQUIRED)
# --- protocol XML paths -------------------------------------------------------
pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
# fallback via datarootdir if needed
if(NOT WAYLAND_PROTOCOLS_DIR OR NOT EXISTS "${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml")
pkg_get_variable(_WP_DATAROOT wayland-protocols datarootdir)
if(_WP_DATAROOT AND EXISTS "${_WP_DATAROOT}/wayland-protocols")
@@ -34,7 +39,6 @@ if(NOT WAYLAND_PROTOCOLS_DIR OR NOT EXISTS "${WAYLAND_PROTOCOLS_DIR}/stable/xdg-
endif()
endif()
# last-resort search (covers odd layouts)
if(NOT WAYLAND_PROTOCOLS_DIR OR NOT EXISTS "${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml")
find_path(WAYLAND_PROTOCOLS_DIR
NAMES stable/xdg-shell/xdg-shell.xml
@@ -50,114 +54,92 @@ endif()
set(XDG_SHELL_XML
"${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml"
)
set(XDG_DECOR_XML
"${WAYLAND_PROTOCOLS_DIR}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml"
)
# --- generated outputs (into build dir) ---------------------------------------
set(GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
file(MAKE_DIRECTORY "${GEN_DIR}")
# waylandpp C++ headers + code (used by the app)
set(GEN_CXX_HEADERS
"${GEN_DIR}/xdg-shell-client-protocol.hpp"
"${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.hpp"
)
set(GEN_CXX_SOURCES
"${GEN_DIR}/xdg-shell-client-protocol.cpp"
"${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.cpp"
pkg_get_variable(WLR_PROTOCOLS_DIR wlr-protocols pkgdatadir)
if(NOT WLR_PROTOCOLS_DIR OR NOT EXISTS "${WLR_PROTOCOLS_DIR}/unstable/wlr-layer-shell-unstable-v1.xml")
find_path(WLR_PROTOCOLS_DIR
NAMES unstable/wlr-layer-shell-unstable-v1.xml
HINTS ${CMAKE_SYSTEM_PREFIX_PATH}
PATH_SUFFIXES wlr-protocols share/wlr-protocols
)
endif()
if(NOT WLR_PROTOCOLS_DIR)
message(FATAL_ERROR "Could not locate wlr-protocols datadir (install wlr-protocols?)")
endif()
set(BACKGROUND_EFFECT_XML
"${WAYLAND_PROTOCOLS_DIR}/staging/ext-background-effect/ext-background-effect-v1.xml"
)
set(WLR_LAYER_SHELL_XML
"${WLR_PROTOCOLS_DIR}/unstable/wlr-layer-shell-unstable-v1.xml"
)
# (optional) C headers + private impls (not linked, but generated)
set(GEN_C_HEADERS
"${GEN_DIR}/xdg-shell-client-protocol.h"
"${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.h"
"${GEN_DIR}/wlr-layer-shell-unstable-v1-client-protocol.h"
"${GEN_DIR}/ext-background-effect-v1-client-protocol.h"
"${GEN_DIR}/blur-client-protocol.h"
)
set(GEN_C_PRIVATES
"${GEN_DIR}/xdg-shell-protocol.c"
"${GEN_DIR}/xdg-decoration-unstable-v1-protocol.c"
"${GEN_DIR}/wlr-layer-shell-unstable-v1-protocol.c"
"${GEN_DIR}/ext-background-effect-v1-protocol.c"
"${GEN_DIR}/blur-protocol.c"
)
# --- custom commands: generate C++ (required) ---------------------------------
add_custom_command(
OUTPUT ${GEN_CXX_HEADERS} ${GEN_CXX_SOURCES}
COMMAND "${WAYLAND_SCANNER_PP}" "${XDG_SHELL_XML}" "${GEN_DIR}/xdg-shell-client-protocol.hpp" "${GEN_DIR}/xdg-shell-client-protocol.cpp"
COMMAND "${WAYLAND_SCANNER_PP}" "${XDG_DECOR_XML}" "${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.hpp" "${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.cpp"
DEPENDS "${XDG_SHELL_XML}" "${XDG_DECOR_XML}"
COMMENT "Generating waylandpp C++ protocol headers/sources with wayland-scanner++"
VERBATIM
)
# --- custom commands: generate C (optional) -----------------------------------
add_custom_command(
OUTPUT ${GEN_C_HEADERS} ${GEN_C_PRIVATES}
COMMAND "${WAYLAND_SCANNER}" client-header "${XDG_SHELL_XML}" "${GEN_DIR}/xdg-shell-client-protocol.h"
COMMAND "${WAYLAND_SCANNER}" private-code "${XDG_SHELL_XML}" "${GEN_DIR}/xdg-shell-protocol.c"
COMMAND "${WAYLAND_SCANNER}" client-header "${XDG_DECOR_XML}" "${GEN_DIR}/xdg-decoration-unstable-v1-client-protocol.h"
COMMAND "${WAYLAND_SCANNER}" private-code "${XDG_DECOR_XML}" "${GEN_DIR}/xdg-decoration-unstable-v1-protocol.c"
DEPENDS "${XDG_SHELL_XML}" "${XDG_DECOR_XML}"
COMMENT "Generating C client headers + private code with wayland-scanner (optional)"
# ext-background-effect
COMMAND "${WAYLAND_SCANNER}" client-header "${BACKGROUND_EFFECT_XML}" "${GEN_DIR}/ext-background-effect-v1-client-protocol.h"
COMMAND "${WAYLAND_SCANNER}" private-code "${BACKGROUND_EFFECT_XML}" "${GEN_DIR}/ext-background-effect-v1-protocol.c"
# wlr-layer-shell
COMMAND "${WAYLAND_SCANNER}" client-header "${WLR_LAYER_SHELL_XML}" "${GEN_DIR}/wlr-layer-shell-unstable-v1-client-protocol.h"
COMMAND "${WAYLAND_SCANNER}" private-code "${WLR_LAYER_SHELL_XML}" "${GEN_DIR}/wlr-layer-shell-unstable-v1-protocol.c"
# org-kde-win-blur
COMMAND "${WAYLAND_SCANNER}" client-header "${CMAKE_CURRENT_SOURCE_DIR}/blur.xml" "${GEN_DIR}/blur-client-protocol.h"
COMMAND "${WAYLAND_SCANNER}" private-code "${CMAKE_CURRENT_SOURCE_DIR}/blur.xml" "${GEN_DIR}/blur-protocol.c"
DEPENDS "${XDG_SHELL_XML}" "${WLR_LAYER_SHELL_XML}"
COMMENT "Generating Wayland + wlr-layer-shell client headers and private code"
VERBATIM
)
add_custom_target(generate_protocols ALL
DEPENDS ${GEN_CXX_HEADERS} ${GEN_CXX_SOURCES} ${GEN_C_HEADERS} ${GEN_C_PRIVATES}
DEPENDS ${GEN_C_HEADERS} ${GEN_C_PRIVATES}
)
# --- executable ---------------------------------------------------------------
add_executable(skia_wayland
${GEN_CXX_HEADERS}
${GEN_CXX_SOURCES}
add_executable(waylight
${GEN_C_PRIVATES}
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
)
add_dependencies(skia_wayland generate_protocols)
add_dependencies(waylight generate_protocols)
# include dirs (system + generated)
target_include_directories(skia_wayland PRIVATE
${WAYLAND_CLIENT_INCLUDE_DIRS}
${WAYLAND_EGL_INCLUDE_DIRS}
${EGL_INCLUDE_DIRS}
${GLES2_INCLUDE_DIRS}
${SKIA_INCLUDE_DIRS}
# waylandpp headers (wayland-client.hpp). If they aren't system-wide, add your path here:
# ${CMAKE_CURRENT_SOURCE_DIR}/external/waylandpp/include
target_include_directories(waylight PRIVATE
${GEN_DIR}
)
# libs
target_link_libraries(skia_wayland PRIVATE
${WAYLAND_CLIENT_LIBRARIES}
${WAYLAND_EGL_LIBRARIES}
${EGL_LIBRARIES}
${GLES2_LIBRARIES}
${SKIA_LIBRARIES}
# some distros need these as well:
target_link_libraries(waylight PRIVATE
PkgConfig::WAYLAND_CLIENT
PkgConfig::WAYLAND_EGL
PkgConfig::EGL
PkgConfig::GLES2
PkgConfig::GLIB
PkgConfig::LIBPORTAL
raylib
m
dl
pthread
)
# cflags/ldflags from pkg-config
target_compile_options(skia_wayland PRIVATE
${WAYLAND_CLIENT_CFLAGS_OTHER}
${WAYLAND_EGL_CFLAGS_OTHER}
${EGL_CFLAGS_OTHER}
${GLES2_CFLAGS_OTHER}
${SKIA_CFLAGS_OTHER}
)
target_link_options(skia_wayland PRIVATE
${WAYLAND_CLIENT_LDFLAGS_OTHER}
${WAYLAND_EGL_LDFLAGS_OTHER}
${EGL_LDFLAGS_OTHER}
${GLES2_LDFLAGS_OTHER}
${SKIA_LDFLAGS_OTHER}
)
# --- warnings -----------------------------------------------------------------
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
target_compile_options(skia_wayland PRIVATE -Wall -Wextra -Wno-unused-parameter)
target_compile_options(waylight PRIVATE -Wall -Wextra -Wno-unused-parameter)
endif()
# --- install (optional) -------------------------------------------------------
install(TARGETS skia_wayland RUNTIME DESTINATION bin)
install(TARGETS waylight RUNTIME DESTINATION bin)