scarab_plugin_api/events/mod.rs
1//! Rich Event System
2//!
3//! Provides granular events for plugins to hook into terminal behavior,
4//! matching WezTerm's event capabilities.
5//!
6//! # Architecture
7//!
8//! The event system consists of:
9//! - **EventType**: Enum of all available event types (20+ granular events)
10//! - **EventArgs**: Event context passed to handlers (window, pane, tab, data)
11//! - **EventHandler**: Function type for event callbacks
12//! - **EventRegistry**: ⚠️ **DEPRECATED** - Legacy mutex-based dispatch (daemon only)
13//!
14//! # ⚠️ DEPRECATION NOTICE
15//!
16//! The `EventRegistry` pattern using `Arc<Mutex<EventRegistry>>` is **deprecated** in favor
17//! of pure Bevy ECS events. This provides:
18//! - **Lock-free**: No mutex contention or blocking
19//! - **Type-safe**: Compile-time event type checking
20//! - **ECS-native**: Integrates seamlessly with Bevy's parallel scheduler
21//!
22//! ## Migration Guide
23//!
24//! **Old pattern (deprecated):**
25//! ```ignore
26//! use scarab_plugin_api::events::{EventRegistry, EventType, EventArgs, EventResult};
27//! use scarab_plugin_api::object_model::ObjectHandle;
28//!
29//! let mut registry = EventRegistry::new();
30//!
31//! // Register a handler for window creation
32//! registry.register(
33//! EventType::WindowCreated,
34//! 100, // priority
35//! "my-plugin",
36//! Box::new(|args| {
37//! println!("Window created: {:?}", args.window);
38//! EventResult::Continue
39//! })
40//! );
41//!
42//! // Dispatch an event
43//! let args = EventArgs::new(EventType::WindowCreated);
44//! let results = registry.dispatch(&args);
45//! ```
46//!
47//! **New pattern (Bevy ECS):**
48//! ```ignore
49//! use bevy::prelude::*;
50//! use scarab_client::events::WindowCreatedEvent;
51//!
52//! // In your plugin's build() method:
53//! app.add_systems(Update, handle_window_created);
54//!
55//! // Handler system (runs in parallel with other systems):
56//! fn handle_window_created(mut events: EventReader<WindowCreatedEvent>) {
57//! for event in events.read() {
58//! println!("Window created: {:?}", event.window);
59//! }
60//! }
61//! ```
62//!
63//! ## Where to Use Each Pattern
64//!
65//! - **Daemon plugins**: Continue using `DaemonEventDispatcher` (wraps `EventRegistry`)
66//! - **Client code**: Always use Bevy events from `scarab-client/src/events/bevy_events.rs`
67//! - **New features**: Prefer Bevy events for lock-free, type-safe event handling
68//!
69//! See `crates/scarab-client/src/events/bevy_events.rs` for all available typed events.
70
71mod args;
72mod handler;
73mod registry;
74mod types;
75
76pub use args::{EventArgs, EventData};
77pub use handler::{EventHandler, EventResult, HandlerEntry};
78#[allow(deprecated)]
79pub use registry::EventRegistry;
80pub use types::EventType;