Files
oak-editor/build.rs
T
Mike-Solar 55bd1132cd feat(app): OFX Interact viewer integration - overlay drawing and event forwarding
- Main-process interact instances for the selected OFX effect card
  (create on selection change, describe, destroy on deselect/close),
  coexisting with the render-worker plugin instances per the OFX
  multi-instance model.
- Program viewer composites the interact's overlay: draw into a GL
  FBO via gl_bridge, read back, straight-alpha 'over' composite onto
  the displayed frame; cached and only re-rendered on frame/time/
  viewport/instance change or plugin redraw requests.
- Event forwarding: picture-area pointer maps through the contain-fit
  letterbox inverse to OFX pen coordinates (pen_motion/down/up);
  Keystroke to OFX key symbols (ASCII, navigation, F1-F35) for
  key_down/up; a 50ms idle pump; global shortcut consumption keeps
  precedence.
- e2e with the real test plugin: lifecycle marker assertions, pen/key
  event records, and macOS GL overlay compositing verified (265 tests
  green incl. gpui_widgets viewer suite).
2026-08-20 00:28:14 +08:00

82 lines
3.4 KiB
Rust

// Oak Video Editor - Non-Linear Video Editor
// Copyright (C) 2026 Oak Team
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//! Build-time link configuration for the `oakapp` crate.
//!
//! M14 R3: the app links the oak* module crates as plain rlibs — there is
//! no `liboakengine` dylib to locate anymore. The only remaining link
//! concern is gpui's macOS backend: gpui_macos reaches the IOSurface API
//! through the `core-video` crate, which depends on `io-surface` with
//! `default-features = false` — that disables io-surface's `link` feature,
//! so nothing adds the IOSurface.framework to the final link and the
//! binary fails with undefined `_IOSurface*` symbols. The app's build
//! script is the single place that configures the macOS link, so link the
//! framework here.
fn main() {
let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
if os == "macos" {
println!("cargo:rustc-link-lib=framework=IOSurface");
// The static FFmpeg's external codec libraries pull in `-lz`, and
// on some machines that resolves to a package-manager copy whose
// install name is @rpath/libz.1.dylib; without an LC_RPATH entry
// the binary dies at launch ("Library not loaded"). Map the rpath
// at the real system library.
println!("cargo:rustc-link-arg=-Wl,-rpath,/usr/lib");
}
// --- OFX interact end-to-end test plugin ---------------------------------
// The app-side interact tests (src/oakui/ofx.rs) drive the *real*
// minimal test plugin (crates/oakplugin/cbits/oak_test_plugin.c) through
// the app's interact wiring. oakplugin compiles the same C file into its
// own OUT_DIR, but build-script env vars do not cross crates, so compile
// it here too — the test assembles a plugin bundle from the app's
// OUT_DIR.
println!("cargo:rerun-if-changed=crates/oakplugin/cbits/oak_test_plugin.c");
build_test_plugin(&os);
}
/// Compiles the minimal OFX test plugin as a shared library into
/// `$OUT_DIR/oak_test_plugin.{dylib,so}` (same recipe as oakplugin's
/// build.rs). Only the interact branch of the plugin is exercised by the
/// app-side tests; the GL parts are macOS-gated inside the C source.
fn build_test_plugin(os: &str) {
use std::process::Command;
let out = std::env::var("OUT_DIR").expect("OUT_DIR");
let cc = std::env::var("CC").unwrap_or_else(|_| "cc".into());
let (link_flag, ext) = if os == "macos" {
("-dynamiclib", "dylib")
} else {
("-shared", "so")
};
let mut args = vec![
"-fPIC".to_string(),
"-Icrates/oakplugin/ofx".to_string(),
"crates/oakplugin/cbits/oak_test_plugin.c".to_string(),
link_flag.to_string(),
"-o".to_string(),
format!("{out}/oak_test_plugin.{ext}"),
];
if os == "macos" {
args.push("-framework".into());
args.push("OpenGL".into());
}
let status = Command::new(&cc)
.args(&args)
.status()
.expect("compile OFX test plugin failed");
assert!(status.success(), "OFX test plugin compile failed");
}