struct LauncherShellContext {
    window: gtk::ApplicationWindow,
    root: gtk::Box,
    staging_row: gtk::Box,
    operations: gtk::Box,
    left_pane: DisplayPaneWidgets,
    right_pane: DisplayPaneWidgets,
    relay_light: gtk::Box,
    relay_value: gtk::Label,
    routing_light: gtk::Box,
    routing_value: gtk::Label,
    gpio_light: gtk::Box,
    gpio_value: gtk::Label,
    left_eye_light: gtk::Box,
    left_eye_value: gtk::Label,
    right_eye_light: gtk::Box,
    right_eye_value: gtk::Label,
    usb_light: gtk::Box,
    usb_value: gtk::Label,
    uac_light: gtk::Box,
    uac_value: gtk::Label,
    uvc_light: gtk::Box,
    uvc_value: gtk::Label,
    upstream_lag_light: gtk::Box,
    upstream_lag_value: gtk::Label,
    shortcut_value: gtk::Label,
}

struct DeviceControlsContext {
    device_refresh_button: gtk::Button,
    camera_combo: gtk::ComboBoxText,
    camera_quality_combo: gtk::ComboBoxText,
    microphone_combo: gtk::ComboBoxText,
    speaker_combo: gtk::ComboBoxText,
    keyboard_combo: gtk::ComboBoxText,
    mouse_combo: gtk::ComboBoxText,
    camera_channel_toggle: gtk::ToggleButton,
    microphone_channel_toggle: gtk::ToggleButton,
    noise_suppression_toggle: gtk::ToggleButton,
    audio_channel_toggle: gtk::ToggleButton,
    audio_gain_scale: gtk::Scale,
    audio_gain_value: gtk::Label,
    mic_gain_scale: gtk::Scale,
    mic_gain_value: gtk::Label,
    audio_check_detail: gtk::Label,
    audio_check_meter: gtk::ProgressBar,
    devices_panel: gtk::Box,
    preview_panel: gtk::Box,
    camera_preview_stack: gtk::Stack,
    camera_preview_frame: gtk::AspectFrame,
    camera_preview: gtk::Picture,
    webcam_transport_combo: gtk::ComboBoxText,
    upstream_audio_transport_combo: gtk::ComboBoxText,
    camera_mirror_button: gtk::ToggleButton,
    camera_mirror_revealer: gtk::Revealer,
    camera_status: gtk::Label,
    camera_test_button: gtk::Button,
    microphone_test_button: gtk::Button,
    microphone_replay_button: gtk::Button,
    speaker_test_button: gtk::Button,
}

struct OperationsRailContext {
    server_entry: gtk::Entry,
    start_button: gtk::Button,
    certs_button: gtk::Button,
    clipboard_button: gtk::Button,
    wake_combo: gtk::ComboBoxText,
    usb_recover_button: gtk::Button,
    uac_recover_button: gtk::Button,
    uvc_recover_button: gtk::Button,
    calibration_default_button: gtk::Button,
    calibration_factory_button: gtk::Button,
    calibration_blind_button: gtk::Button,
    calibration_minus_button: gtk::Button,
    calibration_plus_button: gtk::Button,
    calibration_rig_button: gtk::Button,
    power_auto_button: gtk::Button,
    power_on_button: gtk::Button,
    power_off_button: gtk::Button,
    power_detail: gtk::Label,
    input_toggle_button: gtk::Button,
    swap_key_button: gtk::Button,
    diagnostics_copy_button: gtk::Button,
    diagnostics_popout_button: gtk::Button,
    diagnostics_log: Rc<RefCell<DiagnosticsLog>>,
    diagnostics_label: gtk::Label,
    diagnostics_scroll: gtk::ScrolledWindow,
    console_copy_button: gtk::Button,
    console_popout_button: gtk::Button,
    console_level_combo: gtk::ComboBoxText,
    session_log_level: Rc<RefCell<ConsoleLogLevel>>,
    status_label: gtk::Label,
    session_log_buffer: gtk::TextBuffer,
    session_log_view: gtk::TextView,
    preview: Option<Rc<LauncherPreview>>,
}
