blender/intern/ghost/CMakeLists.txt
Hans Goudey 8bce53c474 GHOST: Add DBUS-based desktop settings watcher (GHOST_SystemDBusUnix)
This commit introduces an API for watching desktop setting changes
for Linux, built around libdbus. It's designed around the initial use
case of reading the system theme (light or dark) and changes to the
value (implemented in !161872), but design to be extensible enough
to watch other settings too. The watching is done on a background
thread, so that Blender doesn't have to poll as part of a busy loop.
Instead, callback functions passed to the watcher have flexibility
over how they pass the data to Blender, e.g. sending an event.
2026-09-03 17:36:17 +02:00

678 lines
16 KiB
CMake

# SPDX-FileCopyrightText: 2006 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
set(INC
PUBLIC .
../guardedalloc
)
set(INC_SYS
)
set(SRC
intern/GHOST_Buttons.cc
intern/GHOST_CallbackEventConsumer.cc
intern/GHOST_Context.cc
intern/GHOST_ContextNone.cc
intern/GHOST_EventManager.cc
intern/GHOST_ISystem.cc
intern/GHOST_ISystemPaths.cc
intern/GHOST_ModifierKeys.cc
intern/GHOST_PathUtils.cc
intern/GHOST_Rect.cc
intern/GHOST_System.cc
intern/GHOST_TimerManager.cc
intern/GHOST_Window.cc
intern/GHOST_WindowManager.cc
GHOST_CallbackEventConsumer.hh
GHOST_IContext.hh
GHOST_IEvent.hh
GHOST_IEventConsumer.hh
GHOST_ISystem.hh
GHOST_ISystemPaths.hh
GHOST_ITimerTask.hh
GHOST_IWindow.hh
GHOST_Rect.hh
GHOST_Types.hh
intern/GHOST_Buttons.hh
intern/GHOST_Context.hh
intern/GHOST_ContextNone.hh
intern/GHOST_Debug.hh
intern/GHOST_Event.hh
intern/GHOST_EventButton.hh
intern/GHOST_EventCursor.hh
intern/GHOST_EventDragnDrop.hh
intern/GHOST_EventKey.hh
intern/GHOST_EventManager.hh
intern/GHOST_EventString.hh
intern/GHOST_EventTrackpad.hh
intern/GHOST_EventWheel.hh
intern/GHOST_ModifierKeys.hh
intern/GHOST_PathUtils.hh
intern/GHOST_System.hh
intern/GHOST_SystemPaths.hh
intern/GHOST_TimerManager.hh
intern/GHOST_TimerTask.hh
intern/GHOST_Util.hh
intern/GHOST_Window.hh
intern/GHOST_WindowManager.hh
intern/GHOST_utildefines.hh
intern/GHOST_utildefines_variadic.hh
)
set(LIB
PRIVATE bf::blenlib
PRIVATE bf::dna
PRIVATE bf::gpu
PRIVATE bf::imbuf
PRIVATE bf::intern::clog
)
if(WITH_INPUT_IME)
add_definitions(-DWITH_INPUT_IME)
endif()
if(WITH_OPENGL_BACKEND)
list(APPEND LIB
PRIVATE bf::dependencies::epoxy
)
add_definitions(-DWITH_OPENGL_BACKEND)
endif()
if(WITH_VULKAN_BACKEND)
list(APPEND SRC
intern/GHOST_ContextVK.cc
intern/GHOST_ContextVK.hh
)
list(APPEND INC_SYS
PUBLIC ${VULKAN_INCLUDE_DIRS}
)
list(APPEND LIB
PUBLIC bf::dependencies::optional::vulkan
PRIVATE bf::extern::vulkan_memory_allocator
PRIVATE bf::extern::volk
)
add_definitions(-DWITH_VULKAN_BACKEND)
endif()
if(WITH_GHOST_DEBUG)
list(APPEND SRC
intern/GHOST_EventPrinter.cc
intern/GHOST_EventPrinter.hh
)
add_definitions(-DWITH_GHOST_DEBUG)
endif()
if(WITH_INPUT_NDOF)
add_definitions(-DWITH_INPUT_NDOF)
list(APPEND SRC
intern/GHOST_NDOFManager.cc
intern/GHOST_EventNDOF.hh
intern/GHOST_NDOFManager.hh
)
# Only some platforms define this.
if(DEFINED NDOF_INCLUDE_DIRS)
list(APPEND INC_SYS
${NDOF_INCLUDE_DIRS}
)
endif()
if(DEFINED NDOF_LIBRARIES)
list(APPEND LIB
${NDOF_LIBRARIES}
)
endif()
endif()
list(APPEND SRC
intern/GHOST_SystemHeadless.hh
intern/GHOST_WindowNULL.hh
)
if(WITH_HEADLESS)
add_definitions(-DWITH_HEADLESS)
elseif(WITH_GHOST_SDL)
list(APPEND SRC
intern/GHOST_SystemSDL.cc
intern/GHOST_WindowSDL.cc
intern/GHOST_SystemSDL.hh
intern/GHOST_WindowSDL.hh
)
# SDL/OpenGL uses ContextSDL, while SDL/Vulkan uses the common ContextVK.
if(WITH_OPENGL_BACKEND)
list(APPEND SRC
intern/GHOST_ContextSDL.cc
intern/GHOST_ContextSDL.hh
)
endif()
add_definitions(-DWITH_GHOST_SDL)
list(APPEND LIB
bf::dependencies::optional::sdl
)
elseif(APPLE AND NOT WITH_GHOST_X11)
list(APPEND SRC
intern/GHOST_SystemCocoa.mm
intern/GHOST_WindowCocoa.mm
intern/GHOST_SystemCocoa.hh
intern/GHOST_WindowCocoa.hh
intern/GHOST_WindowViewCocoa.hh
)
if(WITH_INPUT_NDOF)
list(APPEND SRC
intern/GHOST_NDOFManagerCocoa.mm
intern/GHOST_NDOFManagerCocoa.hh
)
endif()
elseif(WITH_GHOST_X11 OR WITH_GHOST_WAYLAND)
if(WITH_GHOST_X11)
list(APPEND INC_SYS
${X11_X11_INCLUDE_PATH}
)
list(APPEND LIB
${X11_X11_LIB}
${X11_Xrender_LIB}
)
list(APPEND SRC
intern/GHOST_SystemX11.cc
intern/GHOST_WindowX11.cc
intern/GHOST_IconX11.hh
intern/GHOST_SystemX11.hh
intern/GHOST_WindowX11.hh
)
if(WITH_OPENGL_BACKEND)
list(APPEND SRC
intern/GHOST_ContextGLX.cc
intern/GHOST_ContextGLX.hh
)
endif()
if(WITH_GHOST_XDND)
add_definitions(-DWITH_XDND)
list(APPEND LIB
extern_xdnd
)
list(APPEND INC
../../extern/xdnd
)
list(APPEND SRC
intern/GHOST_DropTargetX11.cc
intern/GHOST_DropTargetX11.hh
)
endif()
if(X11_XF86keysym_INCLUDE_PATH)
add_definitions(-DWITH_XF86KEYSYM)
list(APPEND INC_SYS
${X11_XF86keysym_INCLUDE_PATH}
)
endif()
if(WITH_X11_XFIXES)
add_definitions(-DWITH_X11_XFIXES)
list(APPEND INC_SYS
${X11_Xfixes_INCLUDE_PATH}
)
list(APPEND LIB
${X11_Xfixes_LIB}
)
endif()
if(WITH_X11_XINPUT)
add_definitions(-DWITH_X11_XINPUT)
list(APPEND INC_SYS
${X11_Xinput_INCLUDE_PATH}
)
list(APPEND LIB
${X11_Xinput_LIB}
)
endif()
add_definitions(-DWITH_GHOST_X11)
endif()
if(WITH_GHOST_WAYLAND)
list(APPEND INC_SYS
${wayland-client_INCLUDE_DIRS}
${wayland-egl_INCLUDE_DIRS}
${xkbcommon_INCLUDE_DIRS}
${wayland-cursor_INCLUDE_DIRS}
)
list(APPEND LIB
${xkbcommon_LINK_LIBRARIES}
)
if(WITH_GHOST_WAYLAND_DYNLOAD)
list(APPEND INC_SYS
../wayland_dynload/extern
)
list(APPEND LIB
bf_intern_wayland_dynload
)
add_definitions(-DWITH_GHOST_WAYLAND_DYNLOAD)
else()
list(APPEND LIB
${wayland-client_LINK_LIBRARIES}
${wayland-egl_LINK_LIBRARIES}
${wayland-cursor_LINK_LIBRARIES}
)
endif()
if(WITH_GHOST_CSD)
list(APPEND SRC
intern/GHOST_WindowWaylandCSD.cc
intern/GHOST_WindowWaylandCSD.hh
)
add_definitions(-DWITH_GHOST_CSD)
endif()
include(CheckSymbolExists)
set(CMAKE_REQUIRED_DEFINITIONS "-D_GNU_SOURCE")
check_symbol_exists(memfd_create "sys/mman.h" HAVE_MEMFD_CREATE)
unset(CMAKE_REQUIRED_DEFINITIONS)
if(HAVE_MEMFD_CREATE)
add_definitions(-DHAVE_MEMFD_CREATE)
endif()
list(APPEND SRC
intern/GHOST_SystemWayland.cc
intern/GHOST_WindowWayland.cc
intern/GHOST_SystemWayland.hh
intern/GHOST_WaylandUtils.hh
intern/GHOST_WindowWayland.hh
)
set(INC_DST ${CMAKE_CURRENT_BINARY_DIR}/libwayland)
# Generate protocols bindings.
# Modifies in parent scope:
# - `SRC`: appended with generated protocol source and header files.
function(generate_protocol_bindings PROT_DEF)
# File name without directory or extension (use for header name).
cmake_path(GET PROT_DEF STEM LAST_ONLY _name)
add_custom_command(
OUTPUT ${INC_DST}/${_name}-client-protocol.h
COMMAND ${CMAKE_COMMAND} -E make_directory ${INC_DST}
COMMAND ${WAYLAND_SCANNER} client-header ${PROT_DEF} ${INC_DST}/${_name}-client-protocol.h
)
add_custom_command(
OUTPUT ${INC_DST}/${_name}-client-protocol.c
COMMAND ${CMAKE_COMMAND} -E make_directory ${INC_DST}
COMMAND ${WAYLAND_SCANNER} private-code ${PROT_DEF} ${INC_DST}/${_name}-client-protocol.c
DEPENDS ${INC_DST}/${_name}-client-protocol.h
)
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
# Prevent warnings/failure to compile with generated `WL_PRIVATE` declarations.
set_source_files_properties(
"${INC_DST}/${_name}-client-protocol.c"
PROPERTIES COMPILE_FLAGS "-Wno-missing-variable-declarations"
)
endif()
list(APPEND SRC
${INC_DST}/${_name}-client-protocol.c
${INC_DST}/${_name}-client-protocol.h
)
set(SRC "${SRC}" PARENT_SCOPE)
endfunction()
list(APPEND INC_SYS
${INC_DST}
)
# `xdg-shell`.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml"
)
# `xdg-decoration`.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml"
)
# `xdg-output`.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/xdg-output/xdg-output-unstable-v1.xml"
)
# `xdg-activation`.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/staging/xdg-activation/xdg-activation-v1.xml"
)
# Fractional scale.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/staging/fractional-scale/fractional-scale-v1.xml"
)
# Viewporter (only required when fractional scale is in use).
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/stable/viewporter/viewporter.xml"
)
# Color management (HDR properties)
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/staging/color-management/color-management-v1.xml"
)
# Pointer-constraints.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml"
)
# Relative-pointer.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/relative-pointer/relative-pointer-unstable-v1.xml"
)
# Pointer-gestures (multi-touch).
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml"
)
# Tablet.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/stable/tablet/tablet-v2.xml"
)
# Primary-selection.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/primary-selection/primary-selection-unstable-v1.xml"
)
if(WITH_INPUT_IME)
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/unstable/text-input/text-input-unstable-v3.xml"
)
endif()
# Desktop compositor controlled cursor rendering.
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/staging/cursor-shape/cursor-shape-v1.xml"
)
# Support setting the window icon directly (replace legacy `.desktop` files).
generate_protocol_bindings(
"${WAYLAND_PROTOCOLS_DIR}/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml"
)
unset(INC_DST)
add_definitions(-DWITH_GHOST_WAYLAND)
if(NOT WITH_GHOST_WAYLAND_APP_ID STREQUAL "")
add_definitions(-DWITH_GHOST_WAYLAND_APP_ID=${WITH_GHOST_WAYLAND_APP_ID})
endif()
endif()
# Not tied to a windowing back-end: the settings read over DBUS (currently the light/dark
# theme preference) come from the desktop, not from X11 or WAYLAND.
if(WITH_GHOST_DBUS)
list(APPEND INC_SYS
${dbus_INCLUDE_DIRS}
)
list(APPEND SRC
intern/GHOST_SystemDBusUnix.cc
intern/GHOST_SystemDBusUnix.hh
)
add_definitions(-DWITH_GHOST_DBUS)
if(WITH_GHOST_DBUS_DYNLOAD)
# `libdbus` is loaded at runtime by `bf_intern_dbus_dynload`,
# `dbus_INCLUDE_DIRS` above is still needed for its type declarations.
list(APPEND INC_SYS
../dbus_dynload/extern
)
list(APPEND LIB
bf_intern_dbus_dynload
)
add_definitions(-DWITH_GHOST_DBUS_DYNLOAD)
else()
list(APPEND LIB
${dbus_LINK_LIBRARIES}
)
endif()
endif()
if(WITH_INPUT_NDOF)
list(APPEND SRC
intern/GHOST_NDOFManagerUnix.cc
intern/GHOST_NDOFManagerUnix.hh
)
endif()
elseif(WIN32)
# # Warnings as errors, this is too strict!
# if(MSVC)
# string(APPEND CMAKE_CXX_FLAGS " /WX")
# endif()
list(APPEND INC_SYS
${WINTAB_INC}
)
list(APPEND SRC
intern/GHOST_ContextD3D.cc
intern/GHOST_DropTargetWin32.cc
intern/GHOST_SystemWin32.cc
intern/GHOST_TrackpadWin32.cc
intern/GHOST_WindowWin32.cc
intern/GHOST_Wintab.cc
intern/GHOST_ContextD3D.hh
intern/GHOST_DropTargetWin32.hh
intern/GHOST_SystemWin32.hh
intern/GHOST_TaskbarWin32.hh
intern/GHOST_TrackpadWin32.hh
intern/GHOST_WindowWin32.hh
intern/GHOST_Wintab.hh
# Without these files listed, they aren't known to CMake.
../../extern/wintab/include/pktdef.h
../../extern/wintab/include/wintab.h
)
list(APPEND SRC
intern/GHOST_ContextWGL.cc
intern/GHOST_ContextWGL.hh
)
if(WITH_INPUT_IME)
list(APPEND SRC
intern/GHOST_ImeWin32.cc
intern/GHOST_ImeWin32.hh
)
endif()
if(WITH_INPUT_NDOF)
list(APPEND SRC
intern/GHOST_NDOFManagerWin32.cc
intern/GHOST_NDOFManagerWin32.hh
)
endif()
endif()
if(UNIX AND NOT APPLE)
if(WITH_OPENGL_BACKEND)
list(APPEND SRC
intern/GHOST_ContextEGL.cc
intern/GHOST_ContextEGL.hh
)
endif()
endif()
if(APPLE)
if(WITH_METAL_BACKEND)
list(APPEND SRC
intern/GHOST_ContextMTL.mm
intern/GHOST_ContextMTL.hh
)
endif()
endif()
if(APPLE)
list(APPEND SRC
intern/GHOST_SystemPathsCocoa.hh
intern/GHOST_SystemPathsCocoa.mm
)
elseif(UNIX)
list(APPEND SRC
intern/GHOST_SystemPathsUnix.cc
intern/GHOST_SystemPathsUnix.hh
)
# System-wide (non-portable) installs locate architecture-dependent libraries under `lib`
# (typically `/usr/lib`), following the FHS convention - alongside `share/`.
if(NOT WITH_INSTALL_PORTABLE)
add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
# NOTE: A Python module is itself a library: its wrapper libraries are bundled in the package
# beside the add-on, so it doesn't need a separate system libraries path.
if(NOT WITH_PYTHON_MODULE)
# The standard variable for this path is `CMAKE_INSTALL_LIBDIR` (typically `lib` or `lib64`).
# It isn't set by default, but systems that build packages may define it.
#
# NOTE: `include(GNUInstallDirs)` could auto-detect this path.
# Since default builds aren't system-wide, leave it to the
# package-build scripts to pass in the correct directory.
set(_lib "lib")
if(DEFINED CMAKE_INSTALL_LIBDIR)
if(CMAKE_INSTALL_LIBDIR)
set(_lib "${CMAKE_INSTALL_LIBDIR}")
endif()
endif()
add_definitions(-DBLENDER_INSTALL_LIBDIR="${_lib}")
unset(_lib)
endif()
endif()
elseif(WIN32)
list(APPEND SRC
intern/GHOST_SystemPathsWin32.cc
intern/GHOST_SystemPathsWin32.hh
)
list(APPEND INC
../utfconv
)
endif()
if(WITH_XR_OPENXR)
list(APPEND SRC
intern/GHOST_Xr.cc
intern/GHOST_XrAction.cc
intern/GHOST_XrContext.cc
intern/GHOST_XrControllerModel.cc
intern/GHOST_XrEvent.cc
intern/GHOST_XrGraphicsBinding.cc
intern/GHOST_XrSession.cc
intern/GHOST_XrSwapchain.cc
GHOST_IXrContext.hh
GHOST_Xr-api.hh
intern/GHOST_IXrGraphicsBinding.hh
intern/GHOST_XrAction.hh
intern/GHOST_XrContext.hh
intern/GHOST_XrControllerModel.hh
intern/GHOST_XrException.hh
intern/GHOST_XrSession.hh
intern/GHOST_XrSwapchain.hh
intern/GHOST_Xr_intern.hh
intern/GHOST_Xr_openxr_includes.hh
# Header only library.
../../extern/tinygltf/tiny_gltf.h
)
if(APPLE)
list(APPEND SRC
intern/GHOST_XrGraphicsBindingMetal.mm
intern/GHOST_XrGraphicsBindingMetal.hh
)
endif()
if(WIN32)
list(APPEND SRC
intern/GHOST_XrGraphicsBindingD3D.cc
intern/GHOST_XrGraphicsBindingD3D.hh
)
endif()
list(APPEND INC_SYS
../../extern/json/include
../../extern/tinygltf
)
list(APPEND INC_SYS
${XR_OPENXR_SDK_INCLUDE_DIR}
)
list(APPEND LIB
${XR_OPENXR_SDK_LIBRARIES}
PRIVATE bf::dependencies::eigen
)
set(XR_PLATFORM_DEFINES
)
if(WITH_OPENGL_BACKEND)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_GRAPHICS_API_OPENGL)
endif()
if(WITH_VULKAN_BACKEND)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_GRAPHICS_API_VULKAN)
list(APPEND SRC
intern/GHOST_XrGraphicsBindingVulkan.cc
intern/GHOST_XrGraphicsBindingVulkan.hh
)
endif()
if(WITH_METAL_BACKEND)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_GRAPHICS_API_METAL)
endif()
# Add compiler defines as required by the OpenXR specification.
if(WIN32)
list(APPEND XR_PLATFORM_DEFINES
-DXR_USE_PLATFORM_WIN32
-DXR_USE_GRAPHICS_API_D3D11
)
list(APPEND LIB
shlwapi
)
elseif(UNIX AND NOT APPLE)
list(APPEND XR_PLATFORM_DEFINES -DXR_OS_LINUX)
if(WITH_GHOST_WAYLAND)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_WAYLAND)
endif()
if(WITH_GHOST_X11)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_EGL)
list(APPEND XR_PLATFORM_DEFINES -DXR_USE_PLATFORM_XLIB)
endif()
endif()
add_definitions(-DWITH_XR_OPENXR ${XR_PLATFORM_DEFINES})
unset(XR_PLATFORM_DEFINES)
endif()
blender_add_lib(bf_intern_ghost "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")