From 4ad6287efcbc2d20ac299d4da0d8005870dbe29d Mon Sep 17 00:00:00 2001
From: galister <22305755+galister@users.noreply.github.com>
Date: Sat, 1 Aug 2026 23:09:57 +0900
Subject: [PATCH] refactor: InterfaceFeats in AppState
---
wayvr/src/assets/gui/keyboard.xml | 2 +-
wayvr/src/backend/openvr/mod.rs | 6 ++++--
wayvr/src/backend/openxr/mod.rs | 15 +++++++++++++--
wayvr/src/overlays/dashboard.rs | 15 ++-------------
wayvr/src/overlays/keyboard/builder.rs | 8 ++++++--
wayvr/src/overlays/keyboard/mod.rs | 2 +-
wayvr/src/overlays/screen/mirror.rs | 8 ++++++--
wayvr/src/overlays/screen/pw.rs | 2 +-
wayvr/src/overlays/screen/wl.rs | 2 +-
wayvr/src/overlays/screen/x11.rs | 4 ++--
wayvr/src/overlays/wayvr.rs | 6 +++++-
wayvr/src/overlays/whisper.rs | 2 +-
wayvr/src/state.rs | 15 +++++++--------
wayvr/src/windowing/manager.rs | 2 +-
wlx-common/src/dash_interface.rs | 13 +++++++++++++
wlx-common/src/dash_interface_emulated.rs | 1 +
16 files changed, 65 insertions(+), 38 deletions(-)
diff --git a/wayvr/src/assets/gui/keyboard.xml b/wayvr/src/assets/gui/keyboard.xml
index 0aceeef2..ebb3d59c 100644
--- a/wayvr/src/assets/gui/keyboard.xml
+++ b/wayvr/src/assets/gui/keyboard.xml
@@ -182,7 +182,7 @@
|
|
|
- |
+ |
|
|
diff --git a/wayvr/src/backend/openvr/mod.rs b/wayvr/src/backend/openvr/mod.rs
index add2c4dc..107e17a5 100644
--- a/wayvr/src/backend/openvr/mod.rs
+++ b/wayvr/src/backend/openvr/mod.rs
@@ -12,7 +12,7 @@ use ovr_overlay::{
};
use smallvec::smallvec;
use vulkano::{Handle, VulkanObject, device::physical::PhysicalDevice};
-use wlx_common::overlays::ToastTopic;
+use wlx_common::{dash_interface::InterfaceFeats, overlays::ToastTopic};
use crate::{
Args, FRAME_COUNTER, RUNNING, XrBackend,
@@ -87,9 +87,11 @@ pub fn openvr_run(args: &Args) -> Result<(), BackendError> {
names.iter().map(std::string::String::as_str).collect()
};
+ let feats = InterfaceFeats::default_for_backend(XrBackend::OpenVR);
+
let mut app = {
let (gfx, gfx_extras) = init_openvr_graphics(instance_extensions, device_extensions_fn)?;
- AppState::from_graphics(gfx, gfx_extras, XrBackend::OpenVR)?
+ AppState::from_graphics(gfx, gfx_extras, feats)?
};
app.session.no_autostart = args.no_autostart;
diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs
index 4e33eef3..b63b5026 100644
--- a/wayvr/src/backend/openxr/mod.rs
+++ b/wayvr/src/backend/openxr/mod.rs
@@ -10,7 +10,10 @@ use input::OpenXrInputSource;
use openxr as xr;
use skybox::{Skybox, create_skybox};
use vulkano::{Handle, VulkanObject};
-use wlx_common::overlays::{StereoMode, ToastTopic};
+use wlx_common::{
+ dash_interface::InterfaceFeats,
+ overlays::{StereoMode, ToastTopic},
+};
use crate::{
Args, FRAME_COUNTER, RUNNING, XrBackend,
@@ -63,9 +66,17 @@ pub fn openxr_run(args: &Args) -> Result<(), BackendError> {
}
};
+ let feats = InterfaceFeats {
+ passthru: xr_instance
+ .exts()
+ .fb_composition_layer_alpha_blend
+ .is_some(),
+ ..InterfaceFeats::default_for_backend(XrBackend::OpenXR)
+ };
+
let mut app = {
let (gfx, gfx_extras) = init_openxr_graphics(xr_instance.clone(), system)?;
- AppState::from_graphics(gfx, gfx_extras, XrBackend::OpenXR)?
+ AppState::from_graphics(gfx, gfx_extras, feats)?
};
app.session.no_autostart = args.no_autostart;
diff --git a/wayvr/src/overlays/dashboard.rs b/wayvr/src/overlays/dashboard.rs
index 09cbefd5..a228daf9 100644
--- a/wayvr/src/overlays/dashboard.rs
+++ b/wayvr/src/overlays/dashboard.rs
@@ -91,7 +91,7 @@ impl DashFrontend {
interface: Box::new(interface),
lang_provider: &WayVRLangProvider::from_config(&app.session.config),
show_welcome: tutorial,
- has_monado: app.xr_backend.is_open_xr(),
+ has_monado: app.feats.xr_backend.is_open_xr(),
theme: app.wgui_theme.clone(),
color_palette: &*app.session.config.color_palette,
executor: app.executor.clone(),
@@ -578,18 +578,7 @@ impl DashInterface for DashInterfaceLive {
}
fn get_feats(&mut self, data: &mut AppState) -> dash_interface::InterfaceFeats {
- dash_interface::InterfaceFeats {
- xr_backend: data.xr_backend,
- desktop_backend: data.desktop_backend,
- #[cfg(feature = "openxr")]
- monado: data.monado_state.is_some(),
- #[cfg(not(feature = "openxr"))]
- monado: false,
- #[cfg(feature = "whisper")]
- whisper: true,
- #[cfg(not(feature = "whisper"))]
- whisper: false,
- }
+ data.feats
}
#[cfg(feature = "openxr")]
diff --git a/wayvr/src/overlays/keyboard/builder.rs b/wayvr/src/overlays/keyboard/builder.rs
index 06d7d1b5..dfb73514 100644
--- a/wayvr/src/overlays/keyboard/builder.rs
+++ b/wayvr/src/overlays/keyboard/builder.rs
@@ -58,12 +58,16 @@ pub(super) fn create_keyboard_panel(
layout: &layout::Layout,
) -> anyhow::Result> {
let mut params = NewGuiPanelParams::default();
+ params.extra_vars.insert(
+ "openvr".into(),
+ bool_to_rc_str(app.feats.xr_backend.is_open_vr()),
+ );
params
.extra_vars
- .insert("openvr".into(), bool_to_rc_str(app.xr_backend.is_open_vr()));
+ .insert("not_passthru".into(), bool_to_rc_str(!app.feats.passthru));
params.extra_vars.insert(
"not_wayland".into(),
- bool_to_rc_str(!app.desktop_backend.is_wayland()),
+ bool_to_rc_str(!app.feats.desktop_backend.is_wayland()),
);
let mut panel = GuiPanel::new_from_template(app, "gui/keyboard.xml", state, params)?;
diff --git a/wayvr/src/overlays/keyboard/mod.rs b/wayvr/src/overlays/keyboard/mod.rs
index 87983bf0..c8b71e10 100644
--- a/wayvr/src/overlays/keyboard/mod.rs
+++ b/wayvr/src/overlays/keyboard/mod.rs
@@ -70,7 +70,7 @@ pub fn create_keyboard(app: &mut AppState) -> anyhow::Result, app: &mut AppState) -> anyhow::Result>,
app: &mut AppState,
) -> Box {
- let renderer =
- ScreenBackend::new_raw(name.clone(), app.xr_backend, CaptureType::PipeWire, capture);
+ let renderer = ScreenBackend::new_raw(
+ name.clone(),
+ app.feats.xr_backend,
+ CaptureType::PipeWire,
+ capture,
+ );
let backend = MirrorBackend(renderer);
diff --git a/wayvr/src/overlays/screen/pw.rs b/wayvr/src/overlays/screen/pw.rs
index 782953d8..66cb22e0 100644
--- a/wayvr/src/overlays/screen/pw.rs
+++ b/wayvr/src/overlays/screen/pw.rs
@@ -81,7 +81,7 @@ impl ScreenCastBackend {
use wlx_capture::frame::Transform;
let mut backend =
- ScreenBackend::new_raw(name, app.xr_backend, CaptureType::PipeWire, capture);
+ ScreenBackend::new_raw(name, app.feats.xr_backend, CaptureType::PipeWire, capture);
backend.logical_pos = logical_pos;
backend.logical_size = logical_size;
diff --git a/wayvr/src/overlays/screen/wl.rs b/wayvr/src/overlays/screen/wl.rs
index ba1692a6..bd7baea4 100644
--- a/wayvr/src/overlays/screen/wl.rs
+++ b/wayvr/src/overlays/screen/wl.rs
@@ -29,7 +29,7 @@ impl ScreenBackend {
);
Some(Self::new_raw(
output.name.clone(),
- app.xr_backend,
+ app.feats.xr_backend,
CaptureType::ScreenCopy,
capture,
))
diff --git a/wayvr/src/overlays/screen/x11.rs b/wayvr/src/overlays/screen/x11.rs
index 783f518e..6d648608 100644
--- a/wayvr/src/overlays/screen/x11.rs
+++ b/wayvr/src/overlays/screen/x11.rs
@@ -33,7 +33,7 @@ impl ScreenBackend {
);
Self::new_raw(
screen.name.clone(),
- app.xr_backend,
+ app.feats.xr_backend,
CaptureType::Xshm,
capture,
)
@@ -103,7 +103,7 @@ pub fn create_screens_x11pw(app: &mut AppState) -> anyhow::Result anyhow::Result {
- let clipboard_provider: Option> = match app.desktop_backend {
+ let clipboard_provider: Option> = match app.feats.desktop_backend {
#[cfg(feature = "wayland")]
DesktopBackend::Wayland => clipboard::wl::Provider::new()
.log_err("Could not create Wayland clipboard provider")
diff --git a/wayvr/src/state.rs b/wayvr/src/state.rs
index b564d2e6..c4335a3a 100644
--- a/wayvr/src/state.rs
+++ b/wayvr/src/state.rs
@@ -27,7 +27,7 @@ use wlx_common::{
#[cfg(feature = "openxr")]
use crate::backend;
use crate::backend::wayvr::WvrServerState;
-use wlx_common::DesktopBackend;
+use wlx_common::dash_interface::InterfaceFeats;
use crate::subsystem::notifications::NotificationManager;
#[cfg(feature = "osc")]
@@ -36,7 +36,6 @@ use crate::subsystem::osc::OscSender;
#[cfg(feature = "whisper")]
use crate::subsystem::whisper_stt::WhisperStt;
use crate::{
- XrBackend,
backend::{input::InputState, task::TaskContainer},
config::load_general_config,
graphics::WGfxExtras,
@@ -72,8 +71,7 @@ pub struct AppState {
pub dbus: DbusConnector,
- pub xr_backend: XrBackend,
- pub desktop_backend: DesktopBackend,
+ pub feats: InterfaceFeats,
pub ipc_server: ipc_server::WayVRServer,
pub wayvr_signals: SyncEventQueue,
@@ -102,7 +100,7 @@ impl AppState {
pub fn from_graphics(
gfx: Arc,
gfx_extras: WGfxExtras,
- xr_backend: XrBackend,
+ feats: InterfaceFeats,
) -> anyhow::Result {
// insert shared resources
let mut tasks = TaskContainer::new();
@@ -218,10 +216,9 @@ impl AppState {
wgui_theme: Rc::new(theme),
executor,
dbus,
- xr_backend,
+ feats,
ipc_server,
wayvr_signals: wvr_signals,
- desktop_backend: DesktopBackend::Headless, // set by OverlayWindowManager
desktop_finder,
notifications: NotificationManager::new(),
@@ -253,7 +250,7 @@ impl AppState {
self.notifications.run_udp();
#[cfg(feature = "openxr")]
- if self.xr_backend.is_open_xr() {
+ if self.feats.xr_backend.is_open_xr() {
use crate::backend::openxr::monado_state::MonadoState;
log::debug!("Connecting to Monado IPC");
@@ -262,9 +259,11 @@ impl AppState {
match MonadoState::new() {
Ok(m) => {
self.monado_state = Some(m);
+ self.feats.monado = true;
}
Err(e) => {
log::error!("Will not use libmonado: {e:?}");
+ self.feats.monado = false;
}
}
}
diff --git a/wayvr/src/windowing/manager.rs b/wayvr/src/windowing/manager.rs
index f6ce3830..89e9f6b3 100644
--- a/wayvr/src/windowing/manager.rs
+++ b/wayvr/src/windowing/manager.rs
@@ -89,7 +89,7 @@ where
// OverlayWindowManager::restore_layout down below
match create_screens(app) {
Ok((data, backend)) => {
- app.desktop_backend = backend;
+ app.feats.desktop_backend = backend;
let last_idx = data.screens.len() - 1;
for (idx, (meta, mut config)) in data.screens.into_iter().enumerate() {
config.show_on_spawn = true;
diff --git a/wlx-common/src/dash_interface.rs b/wlx-common/src/dash_interface.rs
index 3318f620..d61d4311 100644
--- a/wlx-common/src/dash_interface.rs
+++ b/wlx-common/src/dash_interface.rs
@@ -50,9 +50,22 @@ pub struct InterfaceFeats {
pub xr_backend: XrBackend,
pub desktop_backend: DesktopBackend,
pub monado: bool,
+ pub passthru: bool,
pub whisper: bool,
}
+impl InterfaceFeats {
+ pub fn default_for_backend(xr_backend: XrBackend) -> Self {
+ Self {
+ xr_backend,
+ desktop_backend: DesktopBackend::Headless,
+ monado: false,
+ passthru: false,
+ whisper: false,
+ }
+ }
+}
+
pub trait DashInterface {
fn window_list(&mut self, data: &mut T) -> anyhow::Result>;
fn window_set_visible(&mut self, data: &mut T, handle: WvrWindowHandle, visible: bool) -> anyhow::Result<()>;
diff --git a/wlx-common/src/dash_interface_emulated.rs b/wlx-common/src/dash_interface_emulated.rs
index 153ce13d..699282af 100644
--- a/wlx-common/src/dash_interface_emulated.rs
+++ b/wlx-common/src/dash_interface_emulated.rs
@@ -238,6 +238,7 @@ impl DashInterface<()> for DashInterfaceEmulated {
xr_backend: crate::XrBackend::OpenXR,
desktop_backend: crate::DesktopBackend::Wayland,
monado: true,
+ passthru: false,
whisper: true,
}
}