diff --git a/wlx-overlay-s/src/backend/openvr/mod.rs b/wlx-overlay-s/src/backend/openvr/mod.rs index 3ee98b6b..03e8860c 100644 --- a/wlx-overlay-s/src/backend/openvr/mod.rs +++ b/wlx-overlay-s/src/backend/openvr/mod.rs @@ -335,7 +335,9 @@ pub fn openvr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr .for_each(|o| o.after_render(universe.clone(), &mut overlay_mgr, &app.gfx)); #[cfg(feature = "wayvr")] - app.wayvr.borrow_mut().data.tick_finish()?; + if let Some(wayland_server) = app.wayland_server.as_ref() { + wayland_server.borrow_mut().data.tick_finish()?; + } // chaperone } // main_loop diff --git a/wlx-overlay-s/src/backend/openxr/mod.rs b/wlx-overlay-s/src/backend/openxr/mod.rs index ac829aa4..2b2dadbe 100644 --- a/wlx-overlay-s/src/backend/openxr/mod.rs +++ b/wlx-overlay-s/src/backend/openxr/mod.rs @@ -459,7 +459,9 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr // End layer composition #[cfg(feature = "wayvr")] - app.wayvr.borrow_mut().data.tick_finish()?; + if let Some(wayland_server) = app.wayland_server.as_ref() { + wayland_server.borrow_mut().data.tick_finish()?; + } // Begin layer submit layers.sort_by(|a, b| b.0.total_cmp(&a.0)); diff --git a/wlx-overlay-s/src/ipc/events.rs b/wlx-overlay-s/src/ipc/events.rs index 0273ecf2..b3032442 100644 --- a/wlx-overlay-s/src/ipc/events.rs +++ b/wlx-overlay-s/src/ipc/events.rs @@ -1,6 +1,5 @@ use std::{cell::RefCell, rc::Rc}; -use crate::ipc::ipc_server; use wayvr_ipc::packet_server; #[cfg(feature = "wayvr")] @@ -112,18 +111,17 @@ pub fn tick_events( where O: Default, { - #[cfg(feature = "wayvr")] - let r_wayvr = app.wayvr.clone(); - #[cfg(feature = "wayvr")] - let mut wayvr = r_wayvr.borrow_mut(); + let wayland_server = app.wayland_server.clone(); while let Some(signal) = app.wayvr_signals.read() { match signal { #[cfg(feature = "wayvr")] WayVRSignal::DisplayVisibility(display_handle, visible) => { - if let Some(overlay_id) = wayvr.display_handle_map.get(&display_handle) { + if let Some(mut wayland_server) = wayland_server.as_ref().map(|r| r.borrow_mut()) + && let Some(overlay_id) = wayland_server.display_handle_map.get(&display_handle) + { let overlay_id = *overlay_id; - wayvr + wayland_server .data .state .set_display_visible(display_handle, visible); @@ -144,7 +142,12 @@ where } #[cfg(feature = "wayvr")] WayVRSignal::DisplayWindowLayout(display_handle, layout) => { - wayvr.data.state.set_display_layout(display_handle, layout); + if let Some(mut wayland_server) = wayland_server.as_ref().map(|r| r.borrow_mut()) { + wayland_server + .data + .state + .set_display_layout(display_handle, layout); + } } #[cfg(feature = "wayvr")] WayVRSignal::BroadcastStateChanged(packet) => { @@ -153,7 +156,9 @@ where } #[cfg(feature = "wayvr")] WayVRSignal::Haptics(haptics) => { - wayvr.pending_haptics = Some(haptics); + if let Some(mut wayland_server) = wayland_server.as_ref().map(|r| r.borrow_mut()) { + wayland_server.pending_haptics = Some(haptics); + } } WayVRSignal::DropOverlay(overlay_id) => { app.tasks @@ -170,8 +175,16 @@ where #[cfg(feature = "wayvr")] { - let tick_tasks = wayvr.data.tick_events(app)?; - process_tick_tasks(app, tick_tasks, &r_wayvr)?; + if let Some(wayland_server) = wayland_server { + let tick_tasks = wayland_server.borrow_mut().data.tick_events(app)?; + process_tick_tasks(app, tick_tasks, &wayland_server)?; + + overlays::wayvr::create_queued_displays( + app, + &mut wayland_server.borrow_mut(), + overlays, + )?; + } } #[cfg(not(feature = "wayvr"))] @@ -182,8 +195,5 @@ where }); } - #[cfg(feature = "wayvr")] - overlays::wayvr::create_queued_displays(app, &mut wayvr, overlays)?; - Ok(()) } diff --git a/wlx-overlay-s/src/overlays/wayvr.rs b/wlx-overlay-s/src/overlays/wayvr.rs index 3590ba6b..53557f16 100644 --- a/wlx-overlay-s/src/overlays/wayvr.rs +++ b/wlx-overlay-s/src/overlays/wayvr.rs @@ -8,7 +8,7 @@ use vulkano::{ format::Format, image::{Image, ImageTiling, SubresourceLayout, view::ImageView}, }; -use wayvr_ipc::packet_server::{self, PacketServer, WvrStateChanged}; +use wayvr_ipc::packet_server::{PacketServer, WvrStateChanged}; use wgui::gfx::{ WGfx, pass::WGfxPass, @@ -658,11 +658,15 @@ pub fn create_wayvr_display_overlay( display_scale: f32, name: &str, ) -> anyhow::Result { - let wayvr = app.wayvr.clone(); + let wayland_server = app + .wayland_server + .as_ref() + .map(|r| r.clone()) + .context("wayland_server unavailable")?; let backend = Box::new(WayVRBackend::new( app, - wayvr, + wayland_server, display_handle, [display_width, display_height], )?); @@ -719,7 +723,11 @@ fn action_app_click( where O: Default, { - let wayvr = app.wayvr.clone(); + let wayland_server = app + .wayland_server + .as_ref() + .map(|r| r.clone()) + .context("wayland_server unavailable")?; let catalog = app .session @@ -729,7 +737,7 @@ where .clone(); if let Some(app_entry) = catalog.get_app(app_name) { - let mut wayvr = wayvr.borrow_mut(); + let mut wayvr = wayland_server.borrow_mut(); let disp_handle = get_or_create_display_by_name( app, @@ -783,8 +791,11 @@ pub fn action_display_click( where O: Default, { - let wayvr = app.wayvr.clone(); - let mut wayvr = wayvr.borrow_mut(); + let wayland_server = app + .wayland_server + .clone() + .context("wayland_server unavailable")?; + let mut wayvr = wayland_server.borrow_mut(); let Some(handle) = WayVR::get_display_by_name(&wayvr.data.state.displays, display_name) else { return Ok(()); @@ -843,10 +854,10 @@ pub fn wayvr_action( } } WayVRAction::ToggleDashboard => { - let wayvr = app.wayvr.clone(); - let mut wayvr = wayvr.borrow_mut(); - - if let Err(e) = toggle_dashboard::(app, overlays, &mut wayvr) { + if let Some(wayland_server) = app.wayland_server.as_ref().map(|r| r.clone()) + && let Err(e) = + toggle_dashboard::(app, overlays, &mut wayland_server.borrow_mut()) + { error_toast(app, "toggle_dashboard failed", e); } } diff --git a/wlx-overlay-s/src/state.rs b/wlx-overlay-s/src/state.rs index e5453cb8..c25f433a 100644 --- a/wlx-overlay-s/src/state.rs +++ b/wlx-overlay-s/src/state.rs @@ -60,10 +60,8 @@ pub struct AppState { #[cfg(feature = "osc")] pub osc_sender: Option, - // wayland server - // TODO: rename to wayland_server? #[cfg(feature = "wayvr")] - pub wayvr: Rc>, + pub wayland_server: Option>>, } #[allow(unused_mut)] @@ -80,15 +78,18 @@ impl AppState { let wayvr_signals = SyncEventQueue::new(); #[cfg(feature = "wayvr")] - let wayvr = - session - .wayvr_config - .post_load(&session.config, &mut tasks, wayvr_signals.clone())?; + let wayland_server = session + .wayvr_config + .post_load(&session.config, &mut tasks, wayvr_signals.clone()) + .inspect_err(|e| log::error!("Could not initialize wayland server: {e:?}")) + .ok(); let mut hid_provider = HidWrapper::new(); #[cfg(feature = "wayvr")] - hid_provider.set_wayvr(wayvr.clone()); + if let Some(wayland_server) = wayland_server.as_ref() { + hid_provider.set_wayvr(wayland_server.clone()); + } #[cfg(feature = "osc")] let osc_sender = crate::subsystem::osc::OscSender::new(session.config.osc_out_port).ok(); @@ -150,7 +151,7 @@ impl AppState { osc_sender, #[cfg(feature = "wayvr")] - wayvr, + wayland_server, }) }