headless mode

This commit is contained in:
galister
2025-05-30 22:14:04 +09:00
parent b0f5e23ffd
commit f29364d772
4 changed files with 62 additions and 45 deletions

View File

@@ -59,55 +59,60 @@ impl<T> OverlayContainer<T>
where where
T: Default, T: Default,
{ {
pub fn new(app: &mut AppState) -> anyhow::Result<Self> { pub fn new(app: &mut AppState, headless: bool) -> anyhow::Result<Self> {
let mut overlays = IdMap::new(); let mut overlays = IdMap::new();
let mut wl = create_wl_client(); let mut show_screens = app.session.config.show_screens.clone();
let keymap = None;
let keymap;
app.screens.clear(); app.screens.clear();
let data = if let Some(wl) = wl.as_mut() {
log::info!("Wayland detected."); if headless {
keymap = get_keymap_wl() log::info!("Running in headless mode; keyboard will be en-US");
.map_err(|f| log::warn!("Could not load keyboard layout: {f}"))
.ok();
crate::overlays::screen::create_screens_wayland(wl, app)
} else { } else {
log::info!("Wayland not detected, assuming X11."); let mut wl = create_wl_client();
keymap = get_keymap_x11()
.map_err(|f| log::warn!("Could not load keyboard layout: {f}")) let data = if let Some(wl) = wl.as_mut() {
.ok(); log::info!("Wayland detected.");
match crate::overlays::screen::create_screens_x11pw(app) { keymap = get_keymap_wl()
Ok(data) => data, .map_err(|f| log::warn!("Could not load keyboard layout: {f}"))
Err(e) => { .ok();
log::info!("Will not use X11 PipeWire capture: {e:?}"); crate::overlays::screen::create_screens_wayland(wl, app)
crate::overlays::screen::create_screens_xshm(app)? } else {
log::info!("Wayland not detected, assuming X11.");
keymap = get_keymap_x11()
.map_err(|f| log::warn!("Could not load keyboard layout: {f}"))
.ok();
match crate::overlays::screen::create_screens_x11pw(app) {
Ok(data) => data,
Err(e) => {
log::info!("Will not use X11 PipeWire capture: {e:?}");
crate::overlays::screen::create_screens_xshm(app)?
}
}
};
if show_screens.is_empty() {
if let Some((_, s, _)) = data.screens.first() {
show_screens.arc_set(s.name.clone());
} }
} }
};
let mut show_screens = app.session.config.show_screens.clone(); for (meta, mut state, backend) in data.screens {
if show_screens.is_empty() { if show_screens.arc_get(state.name.as_ref()) {
if let Some((_, s, _)) = data.screens.first() { state.show_hide = true;
show_screens.arc_set(s.name.clone()); }
overlays.insert(
state.id.0,
OverlayData::<T> {
state,
backend,
..Default::default()
},
);
app.screens.push(meta);
} }
} }
for (meta, mut state, backend) in data.screens {
if show_screens.arc_get(state.name.as_ref()) {
state.show_hide = true;
}
overlays.insert(
state.id.0,
OverlayData::<T> {
state,
backend,
..Default::default()
},
);
app.screens.push(meta);
}
let anchor = create_anchor(app)?; let anchor = create_anchor(app)?;
overlays.insert(anchor.state.id.0, anchor); overlays.insert(anchor.state.id.0, anchor);

View File

@@ -62,7 +62,11 @@ pub fn openvr_uninstall() {
} }
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)] #[allow(clippy::too_many_lines, clippy::cognitive_complexity)]
pub fn openvr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(), BackendError> { pub fn openvr_run(
running: Arc<AtomicBool>,
show_by_default: bool,
headless: bool,
) -> Result<(), BackendError> {
let app_type = EVRApplicationType::VRApplication_Overlay; let app_type = EVRApplicationType::VRApplication_Overlay;
let Ok(context) = ovr_overlay::Context::init(app_type) else { let Ok(context) = ovr_overlay::Context::init(app_type) else {
log::warn!("Will not use OpenVR: Context init failed"); log::warn!("Will not use OpenVR: Context init failed");
@@ -112,7 +116,7 @@ pub fn openvr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
let _ = install_manifest(&mut app_mgr); let _ = install_manifest(&mut app_mgr);
let mut overlays = OverlayContainer::<OpenVrOverlayData>::new(&mut state)?; let mut overlays = OverlayContainer::<OpenVrOverlayData>::new(&mut state, headless)?;
let mut notifications = NotificationManager::new(); let mut notifications = NotificationManager::new();
notifications.run_dbus(); notifications.run_dbus();
notifications.run_udp(); notifications.run_udp();

View File

@@ -57,7 +57,11 @@ struct XrState {
} }
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)] #[allow(clippy::too_many_lines, clippy::cognitive_complexity)]
pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(), BackendError> { pub fn openxr_run(
running: Arc<AtomicBool>,
show_by_default: bool,
headless: bool,
) -> Result<(), BackendError> {
let (xr_instance, system) = match helpers::init_xr() { let (xr_instance, system) = match helpers::init_xr() {
Ok((xr_instance, system)) => (xr_instance, system), Ok((xr_instance, system)) => (xr_instance, system),
Err(e) => { Err(e) => {
@@ -90,7 +94,7 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
); );
} }
let mut overlays = OverlayContainer::<OpenXrOverlayData>::new(&mut app)?; let mut overlays = OverlayContainer::<OpenXrOverlayData>::new(&mut app, headless)?;
let mut lines = LinePool::new(app.graphics.clone())?; let mut lines = LinePool::new(app.graphics.clone())?;
let mut notifications = NotificationManager::new(); let mut notifications = NotificationManager::new();

View File

@@ -70,6 +70,10 @@ struct Args {
#[arg(long)] #[arg(long)]
multi: bool, multi: bool,
/// Disable desktop access altogether.
#[arg(long)]
headless: bool,
/// Path to write logs to /// Path to write logs to
#[arg(short, long, value_name = "FILE_PATH")] #[arg(short, long, value_name = "FILE_PATH")]
log_to: Option<String>, log_to: Option<String>,
@@ -139,7 +143,7 @@ fn auto_run(running: Arc<AtomicBool>, args: Args) {
if !args_get_openvr(&args) { if !args_get_openvr(&args) {
use crate::backend::openxr::openxr_run; use crate::backend::openxr::openxr_run;
tried_xr = true; tried_xr = true;
match openxr_run(running.clone(), args.show) { match openxr_run(running.clone(), args.show, args.headless) {
Ok(()) => return, Ok(()) => return,
Err(BackendError::NotSupported) => (), Err(BackendError::NotSupported) => (),
Err(e) => { Err(e) => {
@@ -153,7 +157,7 @@ fn auto_run(running: Arc<AtomicBool>, args: Args) {
if !args_get_openxr(&args) { if !args_get_openxr(&args) {
use crate::backend::openvr::openvr_run; use crate::backend::openvr::openvr_run;
tried_vr = true; tried_vr = true;
match openvr_run(running, args.show) { match openvr_run(running, args.show, args.headless) {
Ok(()) => return, Ok(()) => return,
Err(BackendError::NotSupported) => (), Err(BackendError::NotSupported) => (),
Err(e) => { Err(e) => {