From c3b30029e85f264d91e01481d58f41d3f2e9e707 Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Tue, 14 Jul 2026 09:22:38 -0700 Subject: [PATCH 1/7] Use native otioz support Signed-off-by: Darby Johnston --- .gitmodules | 3 -- CMakeLists.txt | 19 ---------- app.cpp | 91 +-------------------------------------------- app.h | 2 +- colors.cpp | 29 ++++++++------- editing.cpp | 3 +- editing.h | 2 +- inspector.cpp | 7 ++-- libs/minizip-ng | 1 - libs/opentimelineio | 2 +- timeline.cpp | 4 +- timeline.h | 2 +- 12 files changed, 29 insertions(+), 136 deletions(-) delete mode 160000 libs/minizip-ng diff --git a/.gitmodules b/.gitmodules index a425b63..1c493e5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,6 +16,3 @@ [submodule "libs/ImGuiColorTextEdit"] path = libs/ImGuiColorTextEdit url = https://github.com/jminor/ImGuiColorTextEdit.git -[submodule "libs/minizip-ng"] - path = libs/minizip-ng - url = https://github.com/zlib-ng/minizip-ng.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 2257db5..ab1714a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,24 +72,6 @@ if(NOT EMSCRIPTEN AND NOT WIN32) add_subdirectory("libs/glfw") endif() -# minizip-ng -set(BUILD_SHARED_LIBS OFF) -set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) -set(MZ_FETCH_LIBS ON) -set(MZ_ZLIB ON) -# OTIOZ doesn't need any of these -set(MZ_BZIP2 OFF) -set(MZ_LZMA OFF) -set(MZ_ZSTD OFF) -set(MZ_LIBCOMP OFF) -set(MZ_PKCRYPT OFF) -set(MZ_WZAES OFF) -set(MZ_OPENSSL OFF) -set(MZ_BCRYPT OFF) -set(MZ_LIBBSD OFF) -set(MZ_ICONV OFF) -add_subdirectory("libs/minizip-ng") - if(NOT EMSCRIPTEN) add_custom_command( OUTPUT "${PROJECT_SOURCE_DIR}/fonts/embedded_font.inc" @@ -105,7 +87,6 @@ target_compile_definitions(raven target_link_libraries(raven PUBLIC OTIO::opentimelineio IMGUI - MINIZIP::minizip ) if (APPLE) diff --git a/app.cpp b/app.cpp index c6e4c0d..f5c771b 100644 --- a/app.cpp +++ b/app.cpp @@ -17,11 +17,7 @@ #include "nfd.h" #endif -#include "mz.h" -#include "mz_zip.h" -#include "mz_strm.h" -#include "mz_zip_rw.h" - +#include #include #include #include @@ -325,90 +321,7 @@ otio::SerializableObjectWithMetadata* LoadOTIOFile(std::string path) { } otio::SerializableObjectWithMetadata* LoadOTIOZFile(std::string path) { - otio::SerializableObjectWithMetadata* root = nullptr; - - void *zip_reader = mz_zip_reader_create(); - - auto status = mz_zip_reader_open_file(zip_reader, path.c_str()); - if (status != MZ_OK) { - ErrorMessage( - "Error opening \"%s\": %d", - path.c_str(), - status); - } else { - status = mz_zip_reader_locate_entry(zip_reader, "content.otio", 1); - if (status != MZ_OK) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": \"content.otio\" not found in archive.", - path.c_str()); - } else { - mz_zip_file *file_info = NULL; - status = mz_zip_reader_entry_get_info(zip_reader, &file_info); - if (status != MZ_OK) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": Error getting entry info: %d", - path.c_str(), - status); - } else { - status = mz_zip_reader_entry_open(zip_reader); - if (status != MZ_OK) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": Unable to open entry: %d", - path.c_str(), - status); - } else { - char* buf = (char*)malloc(file_info->uncompressed_size + 1); - char* buf_cursor = buf; - int64_t bytes_remaining = file_info->uncompressed_size; - int32_t bytes_read = 0; - while (bytes_remaining > 0) { - int32_t chunk_size = bytes_remaining < INT32_MAX ? bytes_remaining : INT32_MAX; - bytes_read = mz_zip_reader_entry_read(zip_reader, buf_cursor, chunk_size); - if (bytes_read > 0) { - bytes_remaining -= bytes_read; - buf_cursor += bytes_read; - } else { - break; - } - } - if (bytes_remaining != 0) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": Error reading entry: %ld", - path.c_str(), - bytes_remaining); - } else { - // Add a null terminator - buf[file_info->uncompressed_size] = '\0'; - std::string json(buf); - otio::ErrorStatus error_status; - root = dynamic_cast( - otio::SerializableObjectWithMetadata::from_json_string(json, &error_status)); - if (otio::is_error(error_status)) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": %s", - path.c_str(), - otio_error_string(error_status).c_str()); - // Set root to nullptr rather than returning so we can still clean up - // the zip reader - root = nullptr; - } else if (!root) { - ErrorMessage( - "Invalid OTIOZ: \"%s\": Unable to extract OTIO data from input", - path.c_str()); - } - } - free(buf); - mz_zip_reader_entry_close(zip_reader); - } - } - } - - mz_zip_reader_close(zip_reader); - } - - mz_zip_reader_delete(&zip_reader); - - return root; + return dynamic_cast(otio::bundle::read_otioz(path)); } std::string FileExtension(std::string path) { diff --git a/app.h b/app.h index c4275d8..f4b6718 100644 --- a/app.h +++ b/app.h @@ -9,7 +9,7 @@ #include #include -namespace otio = opentimelineio::OPENTIMELINEIO_VERSION; +namespace otio = opentimelineio::OPENTIMELINEIO_VERSION_NS; enum AppThemeCol_ { AppThemeCol_Background, diff --git a/colors.cpp b/colors.cpp index c498e89..160764d 100644 --- a/colors.cpp +++ b/colors.cpp @@ -2,8 +2,8 @@ #include "imgui_internal.h" -#include -namespace otio = opentimelineio::OPENTIMELINEIO_VERSION; +#include +namespace otio = opentimelineio::OPENTIMELINEIO_VERSION_NS; ImU32 LerpColors(ImU32 col_a, ImU32 col_b, float t) { int r = ImLerp( @@ -26,28 +26,29 @@ ImU32 LerpColors(ImU32 col_a, ImU32 col_b, float t) { } ImU32 UIColorFromName(std::string color) { - if (color == otio::Marker::Color::pink) + // \todo + /*if (color == otio::Color::pink) return IM_COL32(0xff, 0x70, 0x70, 0xff); - if (color == otio::Marker::Color::red) + if (color == otio::Color::red) return IM_COL32(0xff, 0x00, 0x00, 0xff); - if (color == otio::Marker::Color::orange) + if (color == otio::Color::orange) return IM_COL32(0xff, 0xa0, 0x00, 0xff); - if (color == otio::Marker::Color::yellow) + if (color == otio::Color::yellow) return IM_COL32(0xff, 0xff, 0x00, 0xff); - if (color == otio::Marker::Color::green) + if (color == otio::Color::green) return IM_COL32(0x00, 0xff, 0x00, 0xff); - if (color == otio::Marker::Color::cyan) + if (color == otio::Color::cyan) return IM_COL32(0x00, 0xff, 0xff, 0xff); - if (color == otio::Marker::Color::blue) + if (color == otio::Color::blue) return IM_COL32(0x00, 0x00, 0xff, 0xff); - if (color == otio::Marker::Color::purple) + if (color == otio::Color::purple) return IM_COL32(0xa0, 0x00, 0xd0, 0xff); - if (color == otio::Marker::Color::magenta) + if (color == otio::Color::magenta) return IM_COL32(0xff, 0x00, 0xff, 0xff); - if (color == otio::Marker::Color::black) + if (color == otio::Color::black) return IM_COL32(0x00, 0x00, 0x00, 0xff); - if (color == otio::Marker::Color::white) - return IM_COL32(0xff, 0xff, 0xff, 0xff); + if (color == otio::Color::white) + return IM_COL32(0xff, 0xff, 0xff, 0xff);*/ return IM_COL32(0x88, 0x88, 0x88, 0xff); } diff --git a/editing.cpp b/editing.cpp index 6987c87..f3753ec 100644 --- a/editing.cpp +++ b/editing.cpp @@ -176,7 +176,8 @@ void AddMarkerAtPlayhead(otio::Item* item, std::string name, std::string color) } const auto marked_range = otio::TimeRange(time); // default 0 duration - otio::SerializableObject::Retainer marker = new otio::Marker(name, marked_range, color); + // \todo + otio::SerializableObject::Retainer marker = new otio::Marker(name, marked_range); item->markers().push_back(marker); } diff --git a/editing.h b/editing.h index a225add..d25c483 100644 --- a/editing.h +++ b/editing.h @@ -2,7 +2,7 @@ #include #include -namespace otio = opentimelineio::OPENTIMELINEIO_VERSION; +namespace otio = opentimelineio::OPENTIMELINEIO_VERSION_NS; bool ReplaceObject(otio::SerializableObject* old_object, otio::SerializableObject* new_object); void DeleteSelectedObject(); diff --git a/inspector.cpp b/inspector.cpp index 5b4eadc..bc33b9f 100644 --- a/inspector.cpp +++ b/inspector.cpp @@ -737,7 +737,8 @@ void DrawInspector() { } // Marker - if (const auto& marker = dynamic_cast(selected_object)) { + // \todo + /*if (const auto& marker = dynamic_cast(selected_object)) { auto rate = marker->marked_range().start_time().rate(); auto color_name = DrawColorChooser(marker->color()); @@ -754,7 +755,7 @@ void DrawInspector() { if (DrawTimeRange("Marked Range", &marked_range, false)) { marker->set_marked_range(marked_range); } - } + }*/ // Track if (const auto& track = dynamic_cast(selected_object)) { @@ -986,7 +987,7 @@ void DrawMarkersInspector() { // Color + Name ImGui::TableNextColumn(); - ImGui::PushStyleColor(ImGuiCol_Text, UIColorFromName(marker->color())); + ImGui::PushStyleColor(ImGuiCol_Text, UIColorFromName(marker->color()->name())); ImGui::TextUnformatted("\xef\x80\xab"); ImGui::PopStyleColor(); ImGui::SameLine(); diff --git a/libs/minizip-ng b/libs/minizip-ng deleted file mode 160000 index 362b091..0000000 --- a/libs/minizip-ng +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 362b091dc42ede21ddc6cbc4be0f4ba6315e893d diff --git a/libs/opentimelineio b/libs/opentimelineio index 60171a4..0eebd21 160000 --- a/libs/opentimelineio +++ b/libs/opentimelineio @@ -1 +1 @@ -Subproject commit 60171a4a3f4fc102c609c77743ffe6efae68bc54 +Subproject commit 0eebd211b2055f111e2c53d04b5581adc594c1fc diff --git a/timeline.cpp b/timeline.cpp index 7bda8b6..323344c 100644 --- a/timeline.cpp +++ b/timeline.cpp @@ -549,7 +549,7 @@ void DrawMarkers( + origin.x - arrow_width / 2, ImGui::GetCursorPosY()); - auto fill_color = UIColorFromName(marker->color()); + auto fill_color = UIColorFromName(marker->color()->name()); auto selected_fill_color = appTheme.colors[AppThemeCol_MarkerSelected]; auto hover_fill_color = appTheme.colors[AppThemeCol_MarkerHovered]; @@ -607,7 +607,7 @@ void DrawMarkers( "%s: %s\nColor: %s\nRange: %s - %s\nDuration: %s", marker->schema_name().c_str(), marker->name().c_str(), - marker->color().c_str(), + marker->color()->name().c_str(), FormattedStringFromTime(range.start_time()).c_str(), FormattedStringFromTime(range.end_time_exclusive()).c_str(), FormattedStringFromTime(duration).c_str()); diff --git a/timeline.h b/timeline.h index 6ebbf89..dd94f48 100644 --- a/timeline.h +++ b/timeline.h @@ -1,7 +1,7 @@ // Timeline widget #include -namespace otio = opentimelineio::OPENTIMELINEIO_VERSION; +namespace otio = opentimelineio::OPENTIMELINEIO_VERSION_NS; void DrawTimeline(otio::Timeline* timeline); bool DrawTransportControls(otio::Timeline* timeline); From 227e3854fea48a9d9002fc27dd8fbffef581740e Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Tue, 14 Jul 2026 10:35:25 -0700 Subject: [PATCH 2/7] Install zlib on Windows and Emscripten Signed-off-by: Darby Johnston --- .github/workflows/build.yaml | 37 +++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c7dae20..5e3f7e9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -94,12 +94,20 @@ jobs: emsdk-master/emsdk install latest emsdk-master/emsdk activate latest + - name: Pre-build zlib port + run: | + source emsdk-master/emsdk_env.sh + embuilder build zlib + - name: Build run: | source emsdk-master/emsdk_env.sh mkdir build-web cd build-web - emcmake cmake .. + emcmake cmake .. \ + -DCMAKE_C_FLAGS="-sUSE_ZLIB=1" \ + -DCMAKE_CXX_FLAGS="-sUSE_ZLIB=1" \ + -DCMAKE_EXE_LINKER_FLAGS="-sUSE_ZLIB=1" cmake --build . --parallel 4 - name: Check Product @@ -117,13 +125,18 @@ jobs: name: raven-web.zip path: build-web/raven-web.zip Windows: - runs-on: windows-latest + runs-on: windows-2022 steps: - uses: actions/checkout@v5 with: fetch-depth: 1 submodules: recursive + - name: Install ZLIB + run: | + vcpkg install zlib:x64-windows + echo "CMAKE_PREFIX_PATH=C:/vcpkg/installed/x64-windows" >> $env:GITHUB_ENV + - name: Build run: | mkdir build_win64 @@ -132,6 +145,15 @@ jobs: cmake --build . --config Debug --parallel 4 cmake --build . --config Release --parallel 4 + # vcpkg's zlib port renames the Windows DLL to z.dll (not zlib1.dll). + # raven.exe links against it, so bundle it into the archive next to + # raven.exe so users who download the artifact can actually run it. + - name: Bundle ZLIB DLL for archive + shell: pwsh + run: | + Copy-Item "C:/vcpkg/installed/x64-windows/bin/*.dll" "build_win64/Debug/" + Copy-Item "C:/vcpkg/installed/x64-windows/bin/*.dll" "build_win64/Release/" + - name: Check Product shell: bash run: | @@ -155,17 +177,22 @@ jobs: strategy: matrix: python-version: ["3.9"] - os: [ ubuntu-latest, ubuntu-24.04-arm, windows-latest, macos-13, macos-latest ] + os: [ ubuntu-latest, ubuntu-24.04-arm, windows-2022, macos-13, macos-latest ] steps: - uses: actions/checkout@v5 with: fetch-depth: 1 submodules: recursive - - name: Install Dependencies + - name: Install Dependencies (Linux) run: | sudo apt-get update sudo apt-get install -y libglfw3-dev libgtk-3-dev if: matrix.os == 'ubuntu-latest' || matrix.os == 'ubuntu-24.04-arm' + - name: Install ZLIB (Windows) + if: matrix.os == 'windows-2022' + run: | + vcpkg install zlib:x64-windows + echo "CMAKE_PREFIX_PATH=C:/vcpkg/installed/x64-windows" >> $env:GITHUB_ENV - name: Install UV uses: astral-sh/setup-uv@v7 with: @@ -205,4 +232,4 @@ jobs: uses: actions/upload-artifact@v5 with: name: sdist - path: dist/*.tar.gz \ No newline at end of file + path: dist/*.tar.gz From 7b2b114077dce42f06d75b62f7352fe50261dc9f Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Tue, 14 Jul 2026 11:52:21 -0700 Subject: [PATCH 3/7] Build fix Signed-off-by: Darby Johnston --- .github/workflows/build.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5e3f7e9..9c1c371 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -99,6 +99,22 @@ jobs: source emsdk-master/emsdk_env.sh embuilder build zlib + # OTIO's pinned minizip-ng commit (d69cb0a5) fails to build under + # Emscripten: check_type_size("DIR*") returns false during the + # cross-compile configure step, causing mz_os.h to declare + # `typedef struct DIR DIR;`, which collides with musl's + # `typedef struct __dirstream DIR;` from . + # + # raven vendored minizip-ng at 362b091 before this PR and built + # cleanly under Emscripten. Roll the OTIO submodule to that commit + # here as a test — if green, follow up with an OTIO PR bumping the + # submodule pointer permanently. + - name: Roll minizip-ng back to raven's known-good commit + run: | + cd libs/opentimelineio/src/deps/minizip-ng + git fetch --unshallow origin 2>/dev/null || git fetch origin + git checkout 362b091 + - name: Build run: | source emsdk-master/emsdk_env.sh From a13e6670191e926f6ba64bf5d2d7af10503d6d42 Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Tue, 14 Jul 2026 12:20:56 -0700 Subject: [PATCH 4/7] Use raven-owned minizip-ng + OTIO_FIND_MINIZIP_NG=ON for Emscripten Signed-off-by: Darby Johnston --- .github/workflows/build.yaml | 22 ++++------------- .gitmodules | 3 +++ CMakeLists.txt | 46 ++++++++++++++++++++++++++++++++++++ cmake/Findminizip-ng.cmake | 25 ++++++++++++++++++++ libs/minizip-ng | 1 + 5 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 cmake/Findminizip-ng.cmake create mode 160000 libs/minizip-ng diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 9c1c371..2fd9e4a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -99,22 +99,6 @@ jobs: source emsdk-master/emsdk_env.sh embuilder build zlib - # OTIO's pinned minizip-ng commit (d69cb0a5) fails to build under - # Emscripten: check_type_size("DIR*") returns false during the - # cross-compile configure step, causing mz_os.h to declare - # `typedef struct DIR DIR;`, which collides with musl's - # `typedef struct __dirstream DIR;` from . - # - # raven vendored minizip-ng at 362b091 before this PR and built - # cleanly under Emscripten. Roll the OTIO submodule to that commit - # here as a test — if green, follow up with an OTIO PR bumping the - # submodule pointer permanently. - - name: Roll minizip-ng back to raven's known-good commit - run: | - cd libs/opentimelineio/src/deps/minizip-ng - git fetch --unshallow origin 2>/dev/null || git fetch origin - git checkout 362b091 - - name: Build run: | source emsdk-master/emsdk_env.sh @@ -141,6 +125,9 @@ jobs: name: raven-web.zip path: build-web/raven-web.zip Windows: + # Pinned to windows-2022 because windows-latest migrated to Windows + # Server 2025 + VS 2026 + CMake 4.3 in June 2026, which breaks the + # vcpkg-based ZLIB find_package path. runs-on: windows-2022 steps: - uses: actions/checkout@v5 @@ -193,6 +180,7 @@ jobs: strategy: matrix: python-version: ["3.9"] + # See Windows job for why windows-latest is pinned to windows-2022. os: [ ubuntu-latest, ubuntu-24.04-arm, windows-2022, macos-13, macos-latest ] steps: - uses: actions/checkout@v5 @@ -248,4 +236,4 @@ jobs: uses: actions/upload-artifact@v5 with: name: sdist - path: dist/*.tar.gz + path: dist/*.tar.gz \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 1c493e5..a425b63 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,6 @@ [submodule "libs/ImGuiColorTextEdit"] path = libs/ImGuiColorTextEdit url = https://github.com/jminor/ImGuiColorTextEdit.git +[submodule "libs/minizip-ng"] + path = libs/minizip-ng + url = https://github.com/zlib-ng/minizip-ng.git diff --git a/CMakeLists.txt b/CMakeLists.txt index ab1714a..f058b1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,52 @@ include_directories( ${PROJECT_SOURCE_DIR}/libs/nativefiledialog/src/include ) +# ----------------------------------------------------------------------------- +# minizip-ng +# +# raven owns this dependency directly rather than relying on OTIO's vendored +# copy. Two reasons: +# +# 1. raven's previous pin (362b091) builds cleanly under Emscripten, while +# OTIO's current pin (d69cb0a5) does not: minizip-ng's CMake configure +# calls check_type_size("DIR*") during cross-compile, that returns +# false, and mz_os.h then declares `typedef struct DIR DIR;` which +# collides with Emscripten musl's `typedef struct __dirstream DIR;` +# from . (See upstream issue: TODO.) +# +# 2. This exercises OTIO's OTIO_FIND_MINIZIP_NG=ON code path, which lets +# downstream projects supply their own minizip-ng. That path landed in +# OTIO's C++ bundle work but hasn't had a real-world consumer yet. +# +# The MZ_* settings mirror raven's previous configuration, minus features +# OTIO's bundle.cpp doesn't need. +set(BUILD_SHARED_LIBS OFF) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(MZ_FETCH_LIBS ON) +set(MZ_ZLIB ON) +set(MZ_BZIP2 OFF) +set(MZ_LZMA OFF) +set(MZ_ZSTD OFF) +set(MZ_LIBCOMP OFF) +set(MZ_PKCRYPT OFF) +set(MZ_WZAES OFF) +set(MZ_OPENSSL OFF) +set(MZ_BCRYPT OFF) +set(MZ_LIBBSD OFF) +set(MZ_ICONV OFF) +add_subdirectory("libs/minizip-ng") + +# Let OTIO's find_package(minizip-ng REQUIRED) resolve to the copy we just +# built via add_subdirectory. See cmake/Findminizip-ng.cmake. +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Tell OTIO to find minizip-ng rather than use its own vendored copy, and +# don't let OTIO run `git submodule update` during configure (submodules +# are already fetched by actions/checkout with submodules: recursive, and +# letting OTIO re-fetch them would reset any local checkouts). +set(OTIO_FIND_MINIZIP_NG ON) +set(OTIO_AUTOMATIC_SUBMODULES OFF) + set(OTIO_SHARED_LIBS OFF) add_subdirectory("libs/opentimelineio") include_directories( diff --git a/cmake/Findminizip-ng.cmake b/cmake/Findminizip-ng.cmake new file mode 100644 index 0000000..d431a00 --- /dev/null +++ b/cmake/Findminizip-ng.cmake @@ -0,0 +1,25 @@ +# Findminizip-ng.cmake +# +# Raven-local shim for OTIO's `find_package(minizip-ng REQUIRED)`, which +# it calls when OTIO_FIND_MINIZIP_NG=ON. Rather than requiring an +# installed minizip-ng-config.cmake, we build minizip-ng ourselves via +# add_subdirectory(libs/minizip-ng) and report success here as long as +# the MINIZIP::minizip target (created inside minizip-ng's own +# CMakeLists.txt during add_subdirectory) is present. +# +# This is what makes the OTIO_FIND_MINIZIP_NG=ON path usable from +# projects that vendor minizip-ng via add_subdirectory. Distros and +# vcpkg users hit find_package's normal Config mode with an installed +# minizip-ng, which does not need this shim. + +if(TARGET MINIZIP::minizip) + set(minizip-ng_FOUND TRUE) + set(minizip-ng_CONFIG "provided by raven via add_subdirectory(libs/minizip-ng)") +else() + set(minizip-ng_FOUND FALSE) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(minizip-ng + REQUIRED_VARS minizip-ng_FOUND +) diff --git a/libs/minizip-ng b/libs/minizip-ng new file mode 160000 index 0000000..362b091 --- /dev/null +++ b/libs/minizip-ng @@ -0,0 +1 @@ +Subproject commit 362b091dc42ede21ddc6cbc4be0f4ba6315e893d From 80c0a540b9b493bcd20190f72363b18a6cec06b5 Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Tue, 14 Jul 2026 12:32:50 -0700 Subject: [PATCH 5/7] Update emscripten macros Signed-off-by: Darby Johnston --- app.cpp | 14 +++++++------- main.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app.cpp b/app.cpp index f5c771b..15f33b5 100644 --- a/app.cpp +++ b/app.cpp @@ -13,7 +13,7 @@ #include "widgets.h" -#ifndef EMSCRIPTEN +#ifndef __EMSCRIPTEN__ #include "nfd.h" #endif @@ -620,13 +620,13 @@ void MainGui() { auto viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowPos(viewport->Pos); ImGui::SetNextWindowSize(viewport->Size); -#ifndef EMSCRIPTEN +#ifndef __EMSCRIPTEN__ ImGui::GetPlatformIO().Platform_SetWindowTitle(viewport, window_title); #endif ImGui::Begin( window_id, -#ifndef EMSCRIPTEN +#ifndef __EMSCRIPTEN__ &appState.show_main_window, #else NULL, @@ -634,7 +634,7 @@ void MainGui() { ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | -#ifndef EMSCRIPTEN +#ifndef __EMSCRIPTEN__ // With Emscripten, we show the Dear ImGui titlebar, // but on desktop, the outer platform window has a titlebar already ImGuiWindowFlags_NoTitleBar | @@ -880,7 +880,7 @@ void SaveTheme() { } std::string OpenFileDialog() { -#ifdef EMSCRIPTEN +#ifdef __EMSCRIPTEN__ return ""; #else nfdchar_t* outPath = NULL; @@ -899,7 +899,7 @@ std::string OpenFileDialog() { } std::string SaveFileDialog() { -#ifdef EMSCRIPTEN +#ifdef __EMSCRIPTEN__ return ""; #else nfdchar_t* outPath = NULL; @@ -938,7 +938,7 @@ void DrawMenu() { if (ImGui::MenuItem("Close Tab", NULL, false, GetActiveRoot())) { CloseTab(appState.active_tab); } -#ifndef EMSCRIPTEN +#ifndef __EMSCRIPTEN__ // You can't exit(0) from a web page // but you can on Desktop platforms. if (ImGui::MenuItem("Exit", "Alt+F4")) { diff --git a/main.h b/main.h index b57a742..409fcca 100644 --- a/main.h +++ b/main.h @@ -4,7 +4,7 @@ void MainGui(); void MainCleanup(); void FileDropCallback(int count, const char** paths); -#ifdef EMSCRIPTEN +#ifdef __EMSCRIPTEN__ extern "C" { void js_LoadUrl(char* url); void js_LoadString(char* json); From c9e2e71dc56837c03db158f627d5f690a5b78a43 Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Wed, 15 Jul 2026 10:41:18 -0700 Subject: [PATCH 6/7] Bump macOS version Signed-off-by: Darby Johnston --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2fd9e4a..bb1c873 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -181,7 +181,7 @@ jobs: matrix: python-version: ["3.9"] # See Windows job for why windows-latest is pinned to windows-2022. - os: [ ubuntu-latest, ubuntu-24.04-arm, windows-2022, macos-13, macos-latest ] + os: [ ubuntu-latest, ubuntu-24.04-arm, windows-2022, macos-14, macos-latest ] steps: - uses: actions/checkout@v5 with: @@ -236,4 +236,4 @@ jobs: uses: actions/upload-artifact@v5 with: name: sdist - path: dist/*.tar.gz \ No newline at end of file + path: dist/*.tar.gz From 786ed251f9b442fc85b5d46f8fc2fb8e6d2bb091 Mon Sep 17 00:00:00 2001 From: Darby Johnston Date: Wed, 15 Jul 2026 10:58:12 -0700 Subject: [PATCH 7/7] Trim comments Signed-off-by: Darby Johnston --- .github/workflows/build.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index bb1c873..34efbb2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -125,9 +125,6 @@ jobs: name: raven-web.zip path: build-web/raven-web.zip Windows: - # Pinned to windows-2022 because windows-latest migrated to Windows - # Server 2025 + VS 2026 + CMake 4.3 in June 2026, which breaks the - # vcpkg-based ZLIB find_package path. runs-on: windows-2022 steps: - uses: actions/checkout@v5 @@ -180,7 +177,6 @@ jobs: strategy: matrix: python-version: ["3.9"] - # See Windows job for why windows-latest is pinned to windows-2022. os: [ ubuntu-latest, ubuntu-24.04-arm, windows-2022, macos-14, macos-latest ] steps: - uses: actions/checkout@v5