feat(apprt): port the core/runtime contract types
Ports ZIG/src/apprt/{action,structs,surface,ipc,runtime}.zig into
ghostty-apprt: the Action enum performed by the core on the app runtime
(all 65 variants with docs), Target<S> generic over the runtime's
surface handle, clipboard/size/scale/selection structs, the core->surface
Message enum with a Mailbox over an AppMailbox trait, and IPC action
types for +new-window.
Owned Strings and Arc<Config> replace Zig's borrowed slices/pointers.
Scrollbar and RendererHealth are local stand-ins until core integration.
The embedded C API and browser runtime are out of scope.
Test Plan:
- cargo test -p ghostty-apprt (16 tests)
This commit is contained in:
1 parent
fe37bde1fa
commit
5a5fa7893b
9 files changed
+1529
-1
No files matched your search
@@ -0,0 +1,61 @@
|
||||
//! Port of `runtime.zig` (and `none.zig`).
|
||||
|
||||
/// Runtime is the runtime to use for Ghostty. All runtimes do not provide
|
||||
/// equivalent feature sets.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum Runtime {
|
||||
/// Will not produce an executable at all (lib only). Matches `none.zig`:
|
||||
/// there is no apprt to communicate with, so IPC always returns `false`.
|
||||
None,
|
||||
|
||||
/// GTK4. Rich windowed application. This uses a full GObject-based
|
||||
/// approach to building the application.
|
||||
Gtk,
|
||||
}
|
||||
|
||||
impl Runtime {
|
||||
/// The default runtime for the current target. The Linux and FreeBSD
|
||||
/// default is GTK because it is a full featured application; otherwise
|
||||
/// `None`.
|
||||
#[must_use]
|
||||
pub fn default_for_target() -> Self {
|
||||
if cfg!(any(target_os = "linux", target_os = "freebsd")) {
|
||||
Runtime::Gtk
|
||||
} else {
|
||||
Runtime::None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// `none.zig` `App::performIpc`: always false as there is no apprt to
|
||||
/// communicate with.
|
||||
///
|
||||
/// # Errors
|
||||
/// Never fails.
|
||||
pub fn none_perform_ipc(
|
||||
_target: &crate::ipc::Target,
|
||||
_action: &crate::ipc::Action,
|
||||
) -> Result<bool, crate::ipc::Error> {
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn default_runtime_is_gtk_on_linux() {
|
||||
if cfg!(target_os = "linux") {
|
||||
assert_eq!(Runtime::default_for_target(), Runtime::Gtk);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn none_ipc_returns_false() {
|
||||
let r = none_perform_ipc(
|
||||
&crate::ipc::Target::Detect,
|
||||
&crate::ipc::Action::NewWindow(crate::ipc::NewWindow { arguments: None }),
|
||||
);
|
||||
assert!(matches!(r, Ok(false)));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user