diff --git a/wayvr/src/assets/gui/dummy.xml b/wayvr/src/assets/gui/dummy.xml
new file mode 100644
index 00000000..a16ff579
--- /dev/null
+++ b/wayvr/src/assets/gui/dummy.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs
index 11cc457d..ba462b35 100644
--- a/wayvr/src/backend/openxr/mod.rs
+++ b/wayvr/src/backend/openxr/mod.rs
@@ -5,7 +5,6 @@ use std::{
time::{Duration, Instant},
};
-use glam::{Affine3A, Vec3};
use input::OpenXrInputSource;
use openxr as xr;
use skybox::{Skybox, create_skybox};
@@ -22,7 +21,7 @@ use crate::{
},
config::{save_settings, save_state},
graphics::{GpuFutures, init_openxr_graphics},
- overlays::{toast::Toast, watch::WATCH_NAME},
+ overlays::toast::Toast,
state::AppState,
subsystem::notifications::NotificationManager,
windowing::{
@@ -141,8 +140,6 @@ pub fn openxr_run(
lines.allocate(&xr_state, &app)?,
];
- let watch_id = overlays.lookup(WATCH_NAME);
-
let mut input_source = input::OpenXrInputSource::new(&xr_state)?;
let mut session_running = false;
@@ -345,21 +342,6 @@ pub fn openxr_run(
app.hid_provider.inner.commit();
- let mut watch_transform = Affine3A::IDENTITY;
- if let Some(watch) = watch_id.and_then(|id| overlays.mut_by_id(id)) {
- let watch_state = watch.config.active_state.as_mut().unwrap();
- watch_transform = watch_state.transform;
- if watch_state.alpha < 0.05 {
- //FIXME: Temporary workaround for Monado bug
- watch_state.transform = Affine3A::from_scale(Vec3 {
- x: 0.001,
- y: 0.001,
- z: 0.001,
- });
- watch_state.alpha = 0.02; // visible but not really. Monado freaks out if no layers are submitted.
- }
- }
-
if let Err(e) =
crate::ipc::events::tick_events::(&mut app, &mut overlays)
{
@@ -509,11 +491,6 @@ pub fn openxr_run(
}
delete_queue.retain(|(_, frame)| *frame > cur_frame);
-
- //FIXME: Temporary workaround for Monado bug
- if let Some(watch) = watch_id.and_then(|id| overlays.mut_by_id(id)) {
- watch.config.active_state.as_mut().unwrap().transform = watch_transform;
- }
} // main_loop
if let (Some(blocker), Some(monado)) = (blocker, app.monado_state.as_mut()) {
diff --git a/wayvr/src/windowing/manager.rs b/wayvr/src/windowing/manager.rs
index de14379a..642451e4 100644
--- a/wayvr/src/windowing/manager.rs
+++ b/wayvr/src/windowing/manager.rs
@@ -5,20 +5,17 @@ use std::{
};
use anyhow::Context;
-use glam::{Affine3A, Vec3, Vec3A};
+use glam::{Affine3A, Quat, Vec3, Vec3A};
use slotmap::{Key, SecondaryMap, SlotMap};
use wgui::log::LogErr;
use wlx_common::{
astr_containers::{AStrMap, AStrMapExt},
config::SerializedWindowSet,
- overlays::{BackendAttrib, BackendAttribValue, ToastTopic},
+ overlays::{BackendAttrib, BackendAttribValue, ToastTopic}, windowing::{OverlayWindowState, Positioning},
};
use crate::{
- FRAME_COUNTER,
- backend::task::{OverlayTask, ToggleMode},
- config::save_state,
- overlays::{
+ FRAME_COUNTER, backend::task::{OverlayTask, ToggleMode}, config::save_state, gui::panel::{GuiPanel, NewGuiPanelParams}, overlays::{
anchor::{create_anchor, create_grab_help},
custom::create_custom,
dashboard::{DASH_NAME, create_dash_frontend},
@@ -27,17 +24,16 @@ use crate::{
screen::create_screens,
toast::Toast,
watch::{WATCH_NAME, create_watch},
- },
- state::AppState,
- windowing::{
+ }, state::AppState, windowing::{
OverlayID, OverlaySelector,
backend::{OverlayEventData, OverlayMeta},
set::OverlayWindowSet,
snap_upright,
- window::{OverlayCategory, OverlayWindowData},
- },
+ window::{OverlayCategory, OverlayWindowConfig, OverlayWindowData},
+ }
};
+pub const DUMMY_NAME: &str = "FIXME: Temporary workaround for Monado bug";
pub const MAX_OVERLAY_SETS: usize = 6;
pub struct OverlayWindowManager {
@@ -126,6 +122,29 @@ where
let anchor = OverlayWindowData::from_config(create_anchor(app)?);
me.add(anchor, app);
+
+ // FIXME: Temporary workaround for Monado bug
+ // Monado freaks out if no layers are submitted.
+ // This creates a panel which is behind your head and is very tiny so you should never be able to see it.
+ let mut panel =
+ GuiPanel::new_from_template(app, "gui/dummy.xml", (), NewGuiPanelParams::default()).unwrap();
+ panel.update_layout(app)?;
+ let dummy = OverlayWindowData::from_config(OverlayWindowConfig {
+ name: DUMMY_NAME.into(),
+ z_order: u32::MIN,
+ category: OverlayCategory::Internal,
+ default_state: OverlayWindowState {
+ grabbable: false,
+ interactable: false,
+ positioning: Positioning::FollowHead { lerp: 1.0 },
+ transform: Affine3A::from_scale_rotation_translation(Vec3::ONE * 0.001, Quat::IDENTITY, Vec3::Z),
+ ..OverlayWindowState::default()
+ },
+ show_on_spawn: true,
+ global: true,
+ ..OverlayWindowConfig::from_backend(Box::new(panel))
+ });
+ me.add(dummy, app);
if app.session.config.enable_watch {
let watch = OverlayWindowData::from_config(create_watch(app)?);