lesavka/client/src/launcher/ui/activation_setup.rs

190 lines
8.1 KiB
Rust

{
let (display_width, display_height) = largest_monitor_size();
let (physical_width, physical_height) = largest_monitor_physical_size();
{
let mut state = state.borrow_mut();
state.set_breakout_display_size(display_width, display_height);
state.set_breakout_limit_size(physical_width, physical_height);
}
let view =
build_launcher_view(app, server_addr.as_ref(), &catalog.borrow(), &state.borrow());
let window = view.window.clone();
let (launcher_width, launcher_height) = launcher_default_size(display_width, display_height);
window.set_default_size(launcher_width, launcher_height);
let server_entry = view.server_entry.clone();
let camera_combo = view.camera_combo.clone();
let camera_quality_combo = view.camera_quality_combo.clone();
let microphone_combo = view.microphone_combo.clone();
let speaker_combo = view.speaker_combo.clone();
let keyboard_combo = view.keyboard_combo.clone();
let mouse_combo = view.mouse_combo.clone();
let widgets = view.widgets.clone();
let preview = view.preview.clone();
let popouts = Rc::clone(&view.popouts);
let diagnostics_popout = Rc::clone(&view.diagnostics_popout);
let log_popout = Rc::clone(&view.log_popout);
let shutdown_cleaned = Rc::new(Cell::new(false));
let camera_quality_syncing = Rc::new(Cell::new(false));
{
let shutdown_cleaned = Rc::clone(&shutdown_cleaned);
let app = app.clone();
let child_proc = Rc::clone(&child_proc);
let tests = Rc::clone(&tests);
let preview = preview.clone();
let widgets = widgets.clone();
let popouts = Rc::clone(&popouts);
let diagnostics_popout = Rc::clone(&diagnostics_popout);
let log_popout = Rc::clone(&log_popout);
window.connect_close_request(move |_| {
if !shutdown_cleaned.replace(true) {
shutdown_launcher_runtime(
&child_proc,
&tests,
preview.as_deref(),
&widgets,
&popouts,
&diagnostics_popout,
&log_popout,
);
}
let app = app.clone();
glib::idle_add_local_once(move || {
app.quit();
});
glib::Propagation::Stop
});
}
{
let shutdown_cleaned = Rc::clone(&shutdown_cleaned);
let child_proc = Rc::clone(&child_proc);
let tests = Rc::clone(&tests);
let preview = preview.clone();
let widgets = widgets.clone();
let popouts = Rc::clone(&popouts);
let diagnostics_popout = Rc::clone(&diagnostics_popout);
let log_popout = Rc::clone(&log_popout);
app.connect_shutdown(move |_| {
if !shutdown_cleaned.replace(true) {
shutdown_launcher_runtime(
&child_proc,
&tests,
preview.as_deref(),
&widgets,
&popouts,
&diagnostics_popout,
&log_popout,
);
}
});
}
{
let mut tests = tests.borrow_mut();
if let Err(err) = tests.bind_camera_preview(
&view.device_stage.camera_preview,
&view.device_stage.camera_status,
) {
widgets
.status_label
.set_text(&format!("Camera preview setup failed: {err}"));
}
if let Err(err) =
tests.set_camera_selection(state.borrow().devices.camera.as_deref())
{
widgets
.status_label
.set_text(&format!("Camera staging setup failed: {err}"));
}
if let Err(err) = tests.set_camera_quality(state.borrow().camera_quality) {
widgets
.status_label
.set_text(&format!("Camera quality staging setup failed: {err}"));
}
}
refresh_launcher_ui(&widgets, &state.borrow(), child_proc.borrow().is_some());
refresh_test_buttons(&widgets, &mut tests.borrow_mut());
let (power_tx, power_rx) = std::sync::mpsc::channel::<PowerMessage>();
let power_request_in_flight = Rc::new(Cell::new(false));
let (calibration_tx, calibration_rx) =
std::sync::mpsc::channel::<CalibrationMessage>();
let calibration_request_in_flight = Rc::new(Cell::new(false));
let (upstream_sync_tx, upstream_sync_rx) =
std::sync::mpsc::channel::<UpstreamSyncMessage>();
let upstream_sync_request_in_flight = Rc::new(Cell::new(false));
let (relay_tx, relay_rx) = std::sync::mpsc::channel::<RelayMessage>();
let relay_request_in_flight = Rc::new(Cell::new(false));
let (caps_tx, caps_rx) = std::sync::mpsc::channel::<CapsMessage>();
let caps_request_in_flight = Rc::new(Cell::new(false));
let diagnostics_network = Rc::new(RefCell::new(NetworkTelemetry::default()));
let diagnostics_process = Rc::new(RefCell::new(ProcessCpuSampler::new()));
let disconnect_cooldown_until = Rc::new(Cell::new(None));
let next_power_probe =
Rc::new(Cell::new(Instant::now() + Duration::from_millis(500)));
let next_calibration_probe =
Rc::new(Cell::new(Instant::now() + Duration::from_millis(650)));
let next_upstream_sync_probe =
Rc::new(Cell::new(Instant::now() + Duration::from_millis(750)));
let next_diagnostics_probe =
Rc::new(Cell::new(Instant::now() + Duration::from_millis(250)));
let next_diagnostics_sample =
Rc::new(Cell::new(Instant::now() + Duration::from_secs(1)));
let preview_session_active = Rc::new(Cell::new(false));
let (clipboard_tx, clipboard_rx) = std::sync::mpsc::channel::<ClipboardMessage>();
let (log_tx, log_rx) = std::sync::mpsc::channel::<String>();
if let Some(preview) = preview.as_ref() {
preview.set_log_sink(log_tx.clone());
sync_preview_profiles(preview, &widgets, &popouts, &state.borrow());
}
ActivationContext {
window,
launcher_size: (launcher_width, launcher_height),
server_entry,
camera_combo,
camera_quality_combo,
microphone_combo,
speaker_combo,
keyboard_combo,
mouse_combo,
widgets,
preview,
popouts,
diagnostics_popout,
log_popout,
camera_quality_syncing,
power_tx,
power_rx,
power_request_in_flight,
calibration_tx,
calibration_rx,
calibration_request_in_flight,
upstream_sync_tx,
upstream_sync_rx,
upstream_sync_request_in_flight,
relay_tx,
relay_rx,
relay_request_in_flight,
caps_tx,
caps_rx,
caps_request_in_flight,
diagnostics_network,
diagnostics_process,
disconnect_cooldown_until,
next_power_probe,
next_calibration_probe,
next_upstream_sync_probe,
next_diagnostics_probe,
next_diagnostics_sample,
preview_session_active,
clipboard_tx,
clipboard_rx,
log_tx,
log_rx,
}
}