- 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).
82 lines
3.4 KiB
Rust
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");
|
|
}
|