dont die if wayland server init fails

This commit is contained in:
galister
2025-12-24 16:57:46 +09:00
parent 36576122a9
commit 1d6a0e4bde
5 changed files with 62 additions and 36 deletions

View File

@@ -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)); .for_each(|o| o.after_render(universe.clone(), &mut overlay_mgr, &app.gfx));
#[cfg(feature = "wayvr")] #[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 // chaperone
} // main_loop } // main_loop

View File

@@ -459,7 +459,9 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
// End layer composition // End layer composition
#[cfg(feature = "wayvr")] #[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 // Begin layer submit
layers.sort_by(|a, b| b.0.total_cmp(&a.0)); layers.sort_by(|a, b| b.0.total_cmp(&a.0));

View File

@@ -1,6 +1,5 @@
use std::{cell::RefCell, rc::Rc}; use std::{cell::RefCell, rc::Rc};
use crate::ipc::ipc_server;
use wayvr_ipc::packet_server; use wayvr_ipc::packet_server;
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
@@ -112,18 +111,17 @@ pub fn tick_events<O>(
where where
O: Default, O: Default,
{ {
#[cfg(feature = "wayvr")] let wayland_server = app.wayland_server.clone();
let r_wayvr = app.wayvr.clone();
#[cfg(feature = "wayvr")]
let mut wayvr = r_wayvr.borrow_mut();
while let Some(signal) = app.wayvr_signals.read() { while let Some(signal) = app.wayvr_signals.read() {
match signal { match signal {
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
WayVRSignal::DisplayVisibility(display_handle, visible) => { 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; let overlay_id = *overlay_id;
wayvr wayland_server
.data .data
.state .state
.set_display_visible(display_handle, visible); .set_display_visible(display_handle, visible);
@@ -144,7 +142,12 @@ where
} }
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
WayVRSignal::DisplayWindowLayout(display_handle, layout) => { 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")] #[cfg(feature = "wayvr")]
WayVRSignal::BroadcastStateChanged(packet) => { WayVRSignal::BroadcastStateChanged(packet) => {
@@ -153,7 +156,9 @@ where
} }
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
WayVRSignal::Haptics(haptics) => { 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) => { WayVRSignal::DropOverlay(overlay_id) => {
app.tasks app.tasks
@@ -170,8 +175,16 @@ where
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
{ {
let tick_tasks = wayvr.data.tick_events(app)?; if let Some(wayland_server) = wayland_server {
process_tick_tasks(app, tick_tasks, &r_wayvr)?; 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"))] #[cfg(not(feature = "wayvr"))]
@@ -182,8 +195,5 @@ where
}); });
} }
#[cfg(feature = "wayvr")]
overlays::wayvr::create_queued_displays(app, &mut wayvr, overlays)?;
Ok(()) Ok(())
} }

View File

@@ -8,7 +8,7 @@ use vulkano::{
format::Format, format::Format,
image::{Image, ImageTiling, SubresourceLayout, view::ImageView}, image::{Image, ImageTiling, SubresourceLayout, view::ImageView},
}; };
use wayvr_ipc::packet_server::{self, PacketServer, WvrStateChanged}; use wayvr_ipc::packet_server::{PacketServer, WvrStateChanged};
use wgui::gfx::{ use wgui::gfx::{
WGfx, WGfx,
pass::WGfxPass, pass::WGfxPass,
@@ -658,11 +658,15 @@ pub fn create_wayvr_display_overlay(
display_scale: f32, display_scale: f32,
name: &str, name: &str,
) -> anyhow::Result<OverlayWindowConfig> { ) -> anyhow::Result<OverlayWindowConfig> {
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( let backend = Box::new(WayVRBackend::new(
app, app,
wayvr, wayland_server,
display_handle, display_handle,
[display_width, display_height], [display_width, display_height],
)?); )?);
@@ -719,7 +723,11 @@ fn action_app_click<O>(
where where
O: Default, 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 let catalog = app
.session .session
@@ -729,7 +737,7 @@ where
.clone(); .clone();
if let Some(app_entry) = catalog.get_app(app_name) { 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( let disp_handle = get_or_create_display_by_name(
app, app,
@@ -783,8 +791,11 @@ pub fn action_display_click<O>(
where where
O: Default, O: Default,
{ {
let wayvr = app.wayvr.clone(); let wayland_server = app
let mut wayvr = wayvr.borrow_mut(); .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 { let Some(handle) = WayVR::get_display_by_name(&wayvr.data.state.displays, display_name) else {
return Ok(()); return Ok(());
@@ -843,10 +854,10 @@ pub fn wayvr_action<O>(
} }
} }
WayVRAction::ToggleDashboard => { WayVRAction::ToggleDashboard => {
let wayvr = app.wayvr.clone(); if let Some(wayland_server) = app.wayland_server.as_ref().map(|r| r.clone())
let mut wayvr = wayvr.borrow_mut(); && let Err(e) =
toggle_dashboard::<O>(app, overlays, &mut wayland_server.borrow_mut())
if let Err(e) = toggle_dashboard::<O>(app, overlays, &mut wayvr) { {
error_toast(app, "toggle_dashboard failed", e); error_toast(app, "toggle_dashboard failed", e);
} }
} }

View File

@@ -60,10 +60,8 @@ pub struct AppState {
#[cfg(feature = "osc")] #[cfg(feature = "osc")]
pub osc_sender: Option<OscSender>, pub osc_sender: Option<OscSender>,
// wayland server
// TODO: rename to wayland_server?
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
pub wayvr: Rc<RefCell<WayVRData>>, pub wayland_server: Option<Rc<RefCell<WayVRData>>>,
} }
#[allow(unused_mut)] #[allow(unused_mut)]
@@ -80,15 +78,18 @@ impl AppState {
let wayvr_signals = SyncEventQueue::new(); let wayvr_signals = SyncEventQueue::new();
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
let wayvr = let wayland_server = session
session
.wayvr_config .wayvr_config
.post_load(&session.config, &mut tasks, wayvr_signals.clone())?; .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(); let mut hid_provider = HidWrapper::new();
#[cfg(feature = "wayvr")] #[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")] #[cfg(feature = "osc")]
let osc_sender = crate::subsystem::osc::OscSender::new(session.config.osc_out_port).ok(); let osc_sender = crate::subsystem::osc::OscSender::new(session.config.osc_out_port).ok();
@@ -150,7 +151,7 @@ impl AppState {
osc_sender, osc_sender,
#[cfg(feature = "wayvr")] #[cfg(feature = "wayvr")]
wayvr, wayland_server,
}) })
} }