From 9b6b206bb931afaa456baa6043b40daafbd826d0 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 4 May 2026 20:48:50 +0200 Subject: [PATCH] build: Allow custom screenshot impl for downstream SDKs Allow downstream SDKs to select SENTRY_SCREENSHOT=custom so sentry-native skips the built-in screenshot capture source and expects an implementation from the embedding build. Co-Authored-By: OpenAI Codex --- CMakeLists.txt | 19 +++++++++++++++++++ src/CMakeLists.txt | 8 ++++++-- src/backends/native/sentry_crash_daemon.c | 2 +- src/backends/sentry_backend_breakpad.cpp | 2 +- src/backends/sentry_backend_inproc.c | 2 +- src/backends/sentry_backend_native.c | 3 +++ 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf2fb45b0..45aa05a1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,6 +198,25 @@ else() message(FATAL_ERROR "SENTRY_TRANSPORT must be one of: ${_SUPPORTED_TRANSPORTS}") endif() +if(WIN32) + set(_SUPPORTED_SCREENSHOTS "windows, none, or custom") + set(SENTRY_SCREENSHOT "windows" CACHE STRING + "The screenshot implementation that sentry uses, can be one of: ${_SUPPORTED_SCREENSHOTS}.") +else() + set(_SUPPORTED_SCREENSHOTS "none or custom") + set(SENTRY_SCREENSHOT "none" CACHE STRING + "The screenshot implementation that sentry uses, can be one of: ${_SUPPORTED_SCREENSHOTS}.") +endif() + +if(SENTRY_SCREENSHOT STREQUAL "windows") + set(SENTRY_SCREENSHOT_WINDOWS TRUE) +elseif(SENTRY_SCREENSHOT STREQUAL "custom") + set(SENTRY_SCREENSHOT_CUSTOM TRUE) +elseif(SENTRY_SCREENSHOT STREQUAL "none") + set(SENTRY_SCREENSHOT_NONE TRUE) +else() + message(FATAL_ERROR "SENTRY_SCREENSHOT must be one of: ${_SUPPORTED_SCREENSHOTS}") +endif() if(SENTRY_BUILD_TESTS OR SENTRY_BUILD_EXAMPLES) enable_testing() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d3cff005d..495dac181 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -271,12 +271,16 @@ if(SENTRY_INTEGRATION_QT) endif() # screenshot -if(WIN32) +if(SENTRY_SCREENSHOT_WINDOWS) + target_compile_definitions(sentry PRIVATE SENTRY_SCREENSHOT_WINDOWS) sentry_target_sources_cwd(sentry screenshot/sentry_screenshot_windows.c ) -else() +elseif(SENTRY_SCREENSHOT_NONE) + target_compile_definitions(sentry PRIVATE SENTRY_SCREENSHOT_NONE) sentry_target_sources_cwd(sentry screenshot/sentry_screenshot_none.c ) +elseif(SENTRY_SCREENSHOT_CUSTOM) + target_compile_definitions(sentry PRIVATE SENTRY_SCREENSHOT_CUSTOM) endif() diff --git a/src/backends/native/sentry_crash_daemon.c b/src/backends/native/sentry_crash_daemon.c index a2cf4df71..77109cae8 100644 --- a/src/backends/native/sentry_crash_daemon.c +++ b/src/backends/native/sentry_crash_daemon.c @@ -2905,7 +2905,7 @@ sentry__process_crash(const sentry_options_t *options, sentry_crash_ipc_t *ipc) // Capture screenshot if enabled (Windows only) // This is done in the daemon process (out-of-process) because // screenshot capture is NOT signal-safe (uses LoadLibrary, GDI+, etc.) -#if defined(SENTRY_PLATFORM_WINDOWS) +#if !defined(SENTRY_SCREENSHOT_NONE) if (ctx->attach_screenshot && run_folder) { SENTRY_DEBUG("Capturing screenshot"); sentry_path_t *screenshot_path diff --git a/src/backends/sentry_backend_breakpad.cpp b/src/backends/sentry_backend_breakpad.cpp index 3f0f4cdea..becf079dc 100644 --- a/src/backends/sentry_backend_breakpad.cpp +++ b/src/backends/sentry_backend_breakpad.cpp @@ -164,7 +164,7 @@ breakpad_backend_callback(const google_breakpad::MinidumpDescriptor &descriptor, if (should_handle) { bool capture_screenshot = options->attach_screenshot; -#ifdef SENTRY_PLATFORM_WINDOWS +#ifndef SENTRY_SCREENSHOT_NONE if (capture_screenshot && options->before_screenshot_func) { SENTRY_SIGNAL_SAFE_LOG( "DEBUG invoking `before_screenshot` hook"); diff --git a/src/backends/sentry_backend_inproc.c b/src/backends/sentry_backend_inproc.c index 6b7d6b395..4ab75785c 100644 --- a/src/backends/sentry_backend_inproc.c +++ b/src/backends/sentry_backend_inproc.c @@ -1174,7 +1174,7 @@ process_ucontext_deferred(const sentry_ucontext_t *uctx, TEST_CRASH_POINT("before_capture"); if (should_handle) { bool capture_screenshot = options->attach_screenshot; -#ifdef SENTRY_PLATFORM_WINDOWS +#ifndef SENTRY_SCREENSHOT_NONE if (capture_screenshot && options->before_screenshot_func) { SENTRY_DEBUG("invoking `before_screenshot` hook"); capture_screenshot = options->before_screenshot_func( diff --git a/src/backends/sentry_backend_native.c b/src/backends/sentry_backend_native.c index d9bbcf038..c546c16da 100644 --- a/src/backends/sentry_backend_native.c +++ b/src/backends/sentry_backend_native.c @@ -922,6 +922,9 @@ native_backend_except(sentry_backend_t *backend, const sentry_ucontext_t *uctx) # endif sentry_value_set_by_key(contexts, "device", device_context); +#endif + +#ifndef SENTRY_SCREENSHOT_NONE // The screenshot is captured by the daemon out-of-process, so // we invoke the hook here (in the crashing process, where // user callbacks can run) and communicate the decision to the