use crate::cli::RuntimeOptions;
use crate::config::Config;
use anyhow::Result;
use std::sync::Arc;
use tokio::runtime::Runtime;
use winit::event_loop::{ControlFlow, EventLoop};
#[derive(Debug, Clone)]
pub(crate) enum AppEvent {
#[cfg(target_os = "macos")]
DisplayConfigurationChanged,
UiTestStep(ui_test::UiTestStep),
UiTestFinish,
}
pub(crate) mod display_recovery;
pub(crate) mod copy_mode;
mod file_transfers;
pub mod handler;
pub mod input_events;
pub mod mouse_events;
pub(crate) mod pane_hint_select;
pub(crate) mod render_pipeline;
pub mod tab_ops;
mod tmux_handler;
mod triggers;
pub(crate) mod ui_test;
pub mod window_manager;
pub mod window_state;
pub(crate) use window_manager::WindowManager;
pub struct App {
config: Config,
runtime: Arc<Runtime>,
runtime_options: RuntimeOptions,
}
impl App {
pub fn new(runtime: Arc<Runtime>, runtime_options: RuntimeOptions) -> Result<Self> {
let mut config = Config::load()?;
if let Some(ref shader) = runtime_options.shader {
config.shader.custom_shader = Some(shader.clone());
config.shader.custom_shader_enabled = true;
config.background.background_image_enabled = false;
log::info!("CLI override: using shader '{}'", shader);
}
if runtime_options.log_session {
config.session_log.auto_log_sessions = true;
log::info!("CLI override: session logging enabled");
}
if runtime_options.log_level.is_none() {
log::info!("Config log level: {}", config.log_level.display_name());
crate::debug::set_log_level(config.log_level.to_level_filter());
}
Ok(Self {
config,
runtime,
runtime_options,
})
}
pub fn run(self) -> Result<()> {
let event_loop = EventLoop::<AppEvent>::with_user_event().build()?;
event_loop.set_control_flow(ControlFlow::Wait);
#[cfg(target_os = "macos")]
let _display_observer =
display_recovery::register_display_change_observer(event_loop.create_proxy());
let ui_test_script = self
.runtime_options
.ui_test
.as_deref()
.map(ui_test::load_script)
.transpose()?;
if let Some(script) = ui_test_script {
let proxy = event_loop.create_proxy();
std::thread::spawn(move || {
for step in script.steps {
std::thread::sleep(std::time::Duration::from_millis(step.wait_ms));
if proxy.send_event(AppEvent::UiTestStep(step)).is_err() {
return; }
}
std::thread::sleep(std::time::Duration::from_millis(600));
let _ = proxy.send_event(AppEvent::UiTestFinish);
});
}
let mut window_manager =
WindowManager::new(self.config, self.runtime, self.runtime_options);
event_loop.run_app(&mut window_manager)?;
Ok(())
}
}