From 1b4cabac4d860fee7b6977753714f2b9c03ad9fe Mon Sep 17 00:00:00 2001 From: art0007i Date: Mon, 1 Jun 2026 17:25:41 +0200 Subject: [PATCH] use the other monado workaround --- wayvr/src/assets/gui/dummy.xml | 10 ---------- wayvr/src/backend/openxr/mod.rs | 31 ++++++++++++++++++++++++++++++- wayvr/src/windowing/manager.rs | 32 ++++---------------------------- 3 files changed, 34 insertions(+), 39 deletions(-) delete mode 100644 wayvr/src/assets/gui/dummy.xml diff --git a/wayvr/src/assets/gui/dummy.xml b/wayvr/src/assets/gui/dummy.xml deleted file mode 100644 index a16ff579..00000000 --- a/wayvr/src/assets/gui/dummy.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs index ba462b35..9ebab6a4 100644 --- a/wayvr/src/backend/openxr/mod.rs +++ b/wayvr/src/backend/openxr/mod.rs @@ -5,6 +5,7 @@ use std::{ time::{Duration, Instant}, }; +use glam::{Affine3A, Vec3}; use input::OpenXrInputSource; use openxr as xr; use skybox::{Skybox, create_skybox}; @@ -21,7 +22,7 @@ use crate::{ }, config::{save_settings, save_state}, graphics::{GpuFutures, init_openxr_graphics}, - overlays::toast::Toast, + overlays::{toast::Toast, watch::WATCH_NAME}, state::AppState, subsystem::notifications::NotificationManager, windowing::{ @@ -140,6 +141,8 @@ pub fn openxr_run( lines.allocate(&xr_state, &app)?, ]; + let watch_id = overlays.lookup(WATCH_NAME).unwrap(); // want panic + let mut input_source = input::OpenXrInputSource::new(&xr_state)?; let mut session_running = false; @@ -342,6 +345,22 @@ pub fn openxr_run( app.hid_provider.inner.commit(); + let watch = overlays.mut_by_id(watch_id).unwrap(); // want panic + if watch.config.active_state.is_none() { + watch.config.activate(&mut app); + } + let watch_state = watch.config.active_state.as_mut().unwrap(); + let watch_transform = watch_state.transform; + if watch_state.alpha < 0.05 || !app.session.config.enable_watch { + //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) { @@ -491,6 +510,16 @@ pub fn openxr_run( } delete_queue.retain(|(_, frame)| *frame > cur_frame); + + //FIXME: Temporary workaround for Monado bug + let watch = overlays.mut_by_id(watch_id).unwrap(); // want panic + + if let Some(state) = watch.config.active_state.as_mut() { + state.transform = watch_transform + } + if !app.session.config.enable_watch { + watch.config.deactivate(); + } } // 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 de8b5ecd..e558618d 100644 --- a/wayvr/src/windowing/manager.rs +++ b/wayvr/src/windowing/manager.rs @@ -5,17 +5,17 @@ use std::{ }; use anyhow::Context; -use glam::{Affine3A, Quat, Vec3, Vec3A}; +use glam::{Affine3A, Vec3, Vec3A}; use slotmap::{Key, SecondaryMap, SlotMap}; use wgui::log::LogErr; use wlx_common::{ astr_containers::{AStrMap, AStrMapExt}, config::SerializedWindowSet, - overlays::{BackendAttrib, BackendAttribValue, ToastTopic}, windowing::{OverlayWindowState, Positioning}, + overlays::{BackendAttrib, BackendAttribValue, ToastTopic}, }; use crate::{ - FRAME_COUNTER, backend::task::{OverlayTask, ToggleMode}, config::save_state, gui::panel::{GuiPanel, NewGuiPanelParams}, overlays::{ + FRAME_COUNTER, backend::task::{OverlayTask, ToggleMode}, config::save_state, overlays::{ anchor::{create_anchor, create_grab_help}, custom::create_custom, dashboard::{DASH_NAME, create_dash_frontend}, @@ -29,11 +29,10 @@ use crate::{ backend::{OverlayEventData, OverlayMeta}, set::OverlayWindowSet, snap_upright, - window::{OverlayCategory, OverlayWindowConfig, OverlayWindowData}, + window::{OverlayCategory, OverlayWindowData}, } }; -pub const DUMMY_NAME: &str = "FIXME: Temporary workaround for Monado bug"; pub const MAX_OVERLAY_SETS: usize = 6; pub struct OverlayWindowManager { @@ -123,29 +122,6 @@ 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); - let watch = OverlayWindowData::from_config(create_watch(app)?); me.watch_id = me.add(watch, app);