From 066f033a91790bfccfed22b33be332b5878569f0 Mon Sep 17 00:00:00 2001 From: Hiina <60050507+hiinaspace@users.noreply.github.com> Date: Wed, 3 Jun 2026 00:55:50 -0600 Subject: [PATCH 1/3] fix: preserve screencopy transforms for rotated outputs (#530) --- wayvr/src/overlays/screen/backend.rs | 10 +++- wayvr/src/overlays/screen/capture.rs | 88 ++++++++++++++++------------ wayvr/src/overlays/wayvr.rs | 6 +- wlx-capture/src/frame.rs | 2 +- wlx-capture/src/wlr_screencopy.rs | 3 +- 5 files changed, 66 insertions(+), 43 deletions(-) diff --git a/wayvr/src/overlays/screen/backend.rs b/wayvr/src/overlays/screen/backend.rs index 92b6ba3f..8b78a7db 100644 --- a/wayvr/src/overlays/screen/backend.rs +++ b/wayvr/src/overlays/screen/backend.rs @@ -238,16 +238,20 @@ impl OverlayBackend for ScreenBackend { } if let Some(pipeline) = self.pipeline.as_mut() { - if self.meta.is_some_and(|old| old.extent != meta.extent) { - pipeline.set_extent( + if self.meta.is_some_and(|old| old.extent != meta.extent) + || frame.format.transform != pipeline.transform() + { + pipeline.set_layout( app, [meta.extent[0] as _, meta.extent[1] as _], [0., 0.], + frame.format.transform, )?; self.interaction_transform = Some(ui_transform(meta.extent)); } } else { - let pipeline = ScreenPipeline::new(&meta, app, stereo, [0., 0.])?; + let pipeline = + ScreenPipeline::new(&meta, app, stereo, [0., 0.], frame.format.transform)?; self.pipeline = Some(pipeline); self.interaction_transform = Some(ui_transform(meta.extent)); } diff --git a/wayvr/src/overlays/screen/capture.rs b/wayvr/src/overlays/screen/capture.rs index a37e4b42..a2e6b749 100644 --- a/wayvr/src/overlays/screen/capture.rs +++ b/wayvr/src/overlays/screen/capture.rs @@ -1,10 +1,9 @@ use std::{ - f32::consts::PI, os::fd::AsRawFd, sync::{Arc, OnceLock}, }; -use glam::{Affine3A, Vec3}; +use glam::Affine3A; use smallvec::{SmallVec, smallvec}; use vulkano::{ buffer::{BufferUsage, Subbuffer}, @@ -55,6 +54,7 @@ pub struct ScreenPipeline { pipeline: Arc>, extentf: [f32; 2], offsetf: [f32; 2], + transform: wlx_frame::Transform, stereo: StereoMode, } @@ -64,6 +64,7 @@ impl ScreenPipeline { app: &mut AppState, stereo: StereoMode, offsetf: [f32; 2], + transform: wlx_frame::Transform, ) -> anyhow::Result { let extentf = [meta.extent[0] as f32, meta.extent[1] as f32]; @@ -81,6 +82,7 @@ impl ScreenPipeline { pipeline, extentf, offsetf, + transform, stereo, }; me.ensure_stereo(stereo); @@ -96,6 +98,10 @@ impl ScreenPipeline { self.pass.clear(); // ensure_depth will repopulate } + pub const fn transform(&self) -> wlx_frame::Transform { + self.transform + } + fn ensure_depth(&mut self, app: &mut AppState, depth: usize) -> anyhow::Result<()> { while self.pass.len() < depth { self.pass.push(Self::create_pass( @@ -111,20 +117,22 @@ impl ScreenPipeline { } for (eye, current) in self.pass.iter_mut().enumerate() { - let verts = stereo_mode_to_verts(self.stereo, eye); + let verts = stereo_mode_to_verts(self.stereo, eye, self.transform); current.buf_vert.write()?.copy_from_slice(&verts); } Ok(()) } - pub fn set_extent( + pub fn set_layout( &mut self, app: &mut AppState, extentf: [f32; 2], offsetf: [f32; 2], + transform: wlx_frame::Transform, ) -> anyhow::Result<()> { self.extentf = extentf; self.offsetf = offsetf; + self.transform = transform; self.pass.clear(); self.mouse = Self::create_mouse_pass(app, self.pipeline.clone(), extentf, offsetf)?; @@ -241,13 +249,31 @@ impl ScreenPipeline { } } -fn stereo_mode_to_verts(stereo: StereoMode, array_index: usize) -> [Vert2Uv; 4] { +fn transform_uv(uv: [f32; 2], transform: wlx_frame::Transform) -> [f32; 2] { + let [u, v] = uv; + match transform { + wlx_frame::Transform::Normal | wlx_frame::Transform::Undefined => [u, v], + wlx_frame::Transform::Rotated90 => [v, 1.0 - u], + wlx_frame::Transform::Rotated180 => [1.0 - u, 1.0 - v], + wlx_frame::Transform::Rotated270 => [1.0 - v, u], + wlx_frame::Transform::Flipped => [1.0 - u, v], + wlx_frame::Transform::Flipped90 => [v, u], + wlx_frame::Transform::Flipped180 => [u, 1.0 - v], + wlx_frame::Transform::Flipped270 => [1.0 - v, 1.0 - u], + } +} + +fn stereo_mode_to_verts( + stereo: StereoMode, + array_index: usize, + transform: wlx_frame::Transform, +) -> [Vert2Uv; 4] { let eye = match stereo { StereoMode::RightLeft | StereoMode::BottomTop => (1 - array_index) as f32, _ => array_index as f32, }; - match stereo { + let mut verts = match stereo { StereoMode::None => [ Vert2Uv { in_pos: [0., 0.], @@ -302,7 +328,13 @@ fn stereo_mode_to_verts(stereo: StereoMode, array_index: usize) -> [Vert2Uv; 4] in_uv: [1., 0.5 + eye * 0.5], }, ], + }; + + for vert in &mut verts { + vert.in_uv = transform_uv(vert.in_uv, transform); } + + verts } static DMA_ALLOCATOR: OnceLock> = OnceLock::new(); @@ -460,7 +492,7 @@ impl WlxCaptureOut { FrameMeta { clear: WGfxClearMode::DontCare, extent: extent_from_format(self.format, config), - transform: affine_from_format(&self.format), + transform: Affine3A::IDENTITY, format: self.image.format(), stereo, } @@ -585,13 +617,14 @@ pub(super) fn receive_callback(me: &WlxCaptureIn, frame: WlxFrame) -> Option { + WlxFrame::Implicit(transform) => { log::trace!("{}: New Implicit frame", me.name); - let Some((image, format)) = me.dma_exporter.as_ref().unwrap().get_current() else { + let Some((image, mut format)) = me.dma_exporter.as_ref().unwrap().get_current() else { log::error!("{}: Implicit frame is missing!", me.name); return None; }; + format.transform = transform; Some(WlxCaptureOut { image, @@ -676,6 +709,14 @@ const fn receive_callback_dummy(_: &DummyDrmExporter, frame: WlxFrame) -> Option } fn extent_from_format(fmt: FrameFormat, config: &GeneralConfig) -> [u32; 2] { + let (width, height) = match fmt.transform { + wlx_frame::Transform::Rotated90 + | wlx_frame::Transform::Rotated270 + | wlx_frame::Transform::Flipped90 + | wlx_frame::Transform::Flipped270 => (fmt.height, fmt.width), + _ => (fmt.width, fmt.height), + }; + // screens above a certain resolution will have severe aliasing let height_limit = if config.screen_render_down { u32::from(config.screen_max_height.min(2560)) @@ -683,36 +724,11 @@ fn extent_from_format(fmt: FrameFormat, config: &GeneralConfig) -> [u32; 2] { 2560 }; - let h = fmt.height.min(height_limit); - let w = (fmt.width as f32 / fmt.height as f32 * h as f32) as u32; + let h = height.min(height_limit); + let w = (width as f32 / height as f32 * h as f32) as u32; [w, h] } -fn affine_from_format(format: &FrameFormat) -> Affine3A { - const FLIP_X: Vec3 = Vec3 { - x: -1.0, - y: 1.0, - z: 1.0, - }; - - match format.transform { - wlx_frame::Transform::Rotated90 => Affine3A::from_rotation_z(-PI / 2.0), - wlx_frame::Transform::Rotated180 => Affine3A::from_rotation_z(PI), - wlx_frame::Transform::Rotated270 => Affine3A::from_rotation_z(PI / 2.0), - wlx_frame::Transform::Flipped => Affine3A::from_scale(FLIP_X), - wlx_frame::Transform::Flipped90 => { - Affine3A::from_scale(FLIP_X) * Affine3A::from_rotation_z(-PI / 2.0) - } - wlx_frame::Transform::Flipped180 => { - Affine3A::from_scale(FLIP_X) * Affine3A::from_rotation_z(PI) - } - wlx_frame::Transform::Flipped270 => { - Affine3A::from_scale(FLIP_X) * Affine3A::from_rotation_z(PI / 2.0) - } - _ => Affine3A::IDENTITY, - } -} - macro_rules! new_wlx_capture { ($capture_queue:expr, $capture:expr) => { if $capture_queue.is_none() { diff --git a/wayvr/src/overlays/wayvr.rs b/wayvr/src/overlays/wayvr.rs index 2b0b0274..9a223ed2 100644 --- a/wayvr/src/overlays/wayvr.rs +++ b/wayvr/src/overlays/wayvr.rs @@ -19,7 +19,7 @@ use wgui::{ parser::Fetchable, widget::{EventResult, label::WidgetLabel}, }; -use wlx_capture::frame::MouseMeta; +use wlx_capture::frame::{MouseMeta, Transform}; use wlx_common::{ overlays::{BackendAttrib, BackendAttribValue, StereoMode}, windowing::{OverlayWindowState, Positioning}, @@ -348,10 +348,11 @@ impl OverlayBackend for WvrWindowBackend { if let Some(pipeline) = self.pipeline.as_mut() { if self.inner_extent != inner_extent { - pipeline.set_extent( + pipeline.set_layout( app, [inner_extent[0] as _, inner_extent[1] as _], [BORDER_SIZE as _, (BAR_SIZE + BORDER_SIZE) as _], + Transform::Normal, )?; self.apply_extent(app, &meta)?; self.inner_extent = inner_extent; @@ -362,6 +363,7 @@ impl OverlayBackend for WvrWindowBackend { app, self.stereo.unwrap_or(StereoMode::None), [BORDER_SIZE as _, (BAR_SIZE + BORDER_SIZE) as _], + Transform::Normal, )?; self.apply_extent(app, &meta)?; self.pipeline = Some(pipeline); diff --git a/wlx-capture/src/frame.rs b/wlx-capture/src/frame.rs index c0c7fc18..c1c9c7b9 100644 --- a/wlx-capture/src/frame.rs +++ b/wlx-capture/src/frame.rs @@ -16,7 +16,7 @@ pub enum WlxFrame { Dmabuf(DmabufFrame), MemFd(MemFdFrame), MemPtr(MemPtrFrame), - Implicit, + Implicit(Transform), } #[derive(Debug, Clone, Copy, Default, PartialEq)] diff --git a/wlx-capture/src/wlr_screencopy.rs b/wlx-capture/src/wlr_screencopy.rs index 4f694a68..8de78e3a 100644 --- a/wlx-capture/src/wlr_screencopy.rs +++ b/wlx-capture/src/wlr_screencopy.rs @@ -267,7 +267,8 @@ where // copy_with_damage seems to not work here proxy.copy(&wl_buffer); - frame_buffer = Some((WlxFrame::Implicit, BufData::Dma { wl_buffer })); + frame_buffer = + Some((WlxFrame::Implicit(transform), BufData::Dma { wl_buffer })); } else if let Some(ScreenCopyEvent::Buffer { shm_format, width, From 9806027e1922bc118b408f6f1ddcb7a0cca0fec3 Mon Sep 17 00:00:00 2001 From: art0007i Date: Wed, 3 Jun 2026 09:22:09 +0200 Subject: [PATCH 2/3] add watch toggle setting (#526) * add watch toggle setting * previous commit broke monado workaround, this fixes it * use active_state to toggle watch * use the other monado workaround * fix whitespace * cargo fmt --- dash-frontend/assets/lang/en.json | 1 + dash-frontend/assets/lang/pl.json | 1 + dash-frontend/src/tab/settings/mod.rs | 3 +++ dash-frontend/src/tab/settings/tab_features.rs | 2 +- dash-frontend/src/tab/settings/tab_look_and_feel.rs | 1 + wayvr/src/backend/openxr/mod.rs | 13 +++++++++++-- wayvr/src/config.rs | 2 ++ wayvr/src/overlays/watch.rs | 2 +- wayvr/src/res/config.yaml | 3 +++ wayvr/src/windowing/manager.rs | 10 ++++++++++ wlx-common/src/config.rs | 3 +++ 11 files changed, 37 insertions(+), 4 deletions(-) diff --git a/dash-frontend/assets/lang/en.json b/dash-frontend/assets/lang/en.json index 14b8d023..e8091cb7 100644 --- a/dash-frontend/assets/lang/en.json +++ b/dash-frontend/assets/lang/en.json @@ -100,6 +100,7 @@ "SCREEN_RENDER_DOWN_HELP": "Helps with aliasing on high-res screens", "SCROLL_SPEED": "Scroll speed", "SELECT_VARIANT": "Select variant", + "ENABLE_WATCH": "Enable watch", "SETS_ON_WATCH": "Sets on watch", "SKYBOX": "Skybox", "SKYMAP_ALREADY_DOWNLOADED": "This skymap is already downloaded. Select desired action.", diff --git a/dash-frontend/assets/lang/pl.json b/dash-frontend/assets/lang/pl.json index 7e4ceef4..c45a2cdc 100644 --- a/dash-frontend/assets/lang/pl.json +++ b/dash-frontend/assets/lang/pl.json @@ -44,6 +44,7 @@ "USE_SKYBOX_HELP": "Wyświetlaj niebo, jeśli nie ma aplikacji sceny lub passthrough", "USE_PASSTHROUGH_HELP": "Pozwól na passthrough, jeśli runtime XR to obsługuje", "SCREEN_RENDER_DOWN_HELP": "Pomaga redukować aliasing na ekranach o wysokiej rozdzielczości", + "ENABLE_WATCH": "Włącz zegarek", "SETS_ON_WATCH": "Lista zestawów na zegarku", "TROUBLESHOOTING": "Rozwiązywanie problemów", "CLEAR_SAVED_STATE": "Wyczyść zapisany stan", diff --git a/dash-frontend/src/tab/settings/mod.rs b/dash-frontend/src/tab/settings/mod.rs index ab32bdf1..eb66a6dc 100644 --- a/dash-frontend/src/tab/settings/mod.rs +++ b/dash-frontend/src/tab/settings/mod.rs @@ -274,6 +274,7 @@ enum SettingType { PointerLerpFactor, ScreenRenderDown, ScrollSpeed, + EnableWatch, SetsOnWatch, SpaceDragMultiplier, SpaceDragUnlocked, @@ -309,6 +310,7 @@ impl SettingType { Self::KeyboardSoundEnabled => &mut config.keyboard_sound_enabled, Self::UprightScreenFix => &mut config.upright_screen_fix, Self::DoubleCursorFix => &mut config.double_cursor_fix, + Self::EnableWatch => &mut config.enable_watch, Self::SetsOnWatch => &mut config.sets_on_watch, Self::HideGrabHelp => &mut config.hide_grab_help, Self::AllowSliding => &mut config.allow_sliding, @@ -435,6 +437,7 @@ impl SettingType { Self::PointerLerpFactor => Ok("APP_SETTINGS.POINTER_LERP_FACTOR"), Self::ScreenRenderDown => Ok("APP_SETTINGS.SCREEN_RENDER_DOWN"), Self::ScrollSpeed => Ok("APP_SETTINGS.SCROLL_SPEED"), + Self::EnableWatch => Ok("APP_SETTINGS.ENABLE_WATCH"), Self::SetsOnWatch => Ok("APP_SETTINGS.SETS_ON_WATCH"), Self::SpaceDragMultiplier => Ok("APP_SETTINGS.SPACE_DRAG_MULTIPLIER"), Self::SpaceDragUnlocked => Ok("APP_SETTINGS.SPACE_DRAG_UNLOCKED"), diff --git a/dash-frontend/src/tab/settings/tab_features.rs b/dash-frontend/src/tab/settings/tab_features.rs index e84d89b1..266a7334 100644 --- a/dash-frontend/src/tab/settings/tab_features.rs +++ b/dash-frontend/src/tab/settings/tab_features.rs @@ -1,6 +1,6 @@ use crate::tab::settings::{ - macros::{options_category, options_checkbox, options_range_f32, options_slider_f32}, SettingType, SettingsMountParams, SettingsTab, + macros::{options_category, options_checkbox, options_range_f32, options_slider_f32}, }; pub struct State {} diff --git a/dash-frontend/src/tab/settings/tab_look_and_feel.rs b/dash-frontend/src/tab/settings/tab_look_and_feel.rs index 768536db..216e6688 100644 --- a/dash-frontend/src/tab/settings/tab_look_and_feel.rs +++ b/dash-frontend/src/tab/settings/tab_look_and_feel.rs @@ -22,6 +22,7 @@ impl State { options_slider_f32(par.mp, c, SettingType::UiAnimationSpeed, 0.5, 5.0, 0.1)?; // min, max, step options_slider_f32(par.mp, c, SettingType::UiGradientIntensity, 0.0, 1.0, 0.05)?; // min, max, step options_slider_f32(par.mp, c, SettingType::UiRoundMultiplier, 0.1, 5.0, 0.1)?; + options_checkbox(par.mp, c, SettingType::EnableWatch)?; options_checkbox(par.mp, c, SettingType::SetsOnWatch)?; options_checkbox(par.mp, c, SettingType::Clock12h)?; Ok(State {}) diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs index f6ec7a44..75294aea 100644 --- a/wayvr/src/backend/openxr/mod.rs +++ b/wayvr/src/backend/openxr/mod.rs @@ -346,9 +346,12 @@ 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 { + 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, @@ -510,7 +513,13 @@ pub fn openxr_run( //FIXME: Temporary workaround for Monado bug let watch = overlays.mut_by_id(watch_id).unwrap(); // want panic - watch.config.active_state.as_mut().unwrap().transform = watch_transform; + + 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/config.rs b/wayvr/src/config.rs index a42526db..c440fd26 100644 --- a/wayvr/src/config.rs +++ b/wayvr/src/config.rs @@ -145,6 +145,7 @@ pub struct AutoSettings { pub keyboard_sound_enabled: bool, pub upright_screen_fix: bool, pub double_cursor_fix: bool, + pub enable_watch: bool, pub sets_on_watch: bool, pub hide_grab_help: bool, pub xr_click_sensitivity: f32, @@ -200,6 +201,7 @@ pub fn save_settings(config: &GeneralConfig) -> anyhow::Result<()> { keyboard_sound_enabled: config.keyboard_sound_enabled, upright_screen_fix: config.upright_screen_fix, double_cursor_fix: config.double_cursor_fix, + enable_watch: config.enable_watch, sets_on_watch: config.sets_on_watch, hide_grab_help: config.hide_grab_help, xr_click_sensitivity: config.xr_click_sensitivity, diff --git a/wayvr/src/overlays/watch.rs b/wayvr/src/overlays/watch.rs index 596d2a4d..fa4b85c2 100644 --- a/wayvr/src/overlays/watch.rs +++ b/wayvr/src/overlays/watch.rs @@ -156,7 +156,7 @@ pub fn create_watch(app: &mut AppState) -> anyhow::Result { angle_fade: true, ..OverlayWindowState::default() }, - show_on_spawn: true, + show_on_spawn: app.session.config.enable_watch, global: true, ..OverlayWindowConfig::from_backend(Box::new(panel)) }) diff --git a/wayvr/src/res/config.yaml b/wayvr/src/res/config.yaml index 55747a09..b9fd51af 100644 --- a/wayvr/src/res/config.yaml +++ b/wayvr/src/res/config.yaml @@ -85,6 +85,9 @@ # The settings are here for reference only. # Probably don't include them in your config file. +## The watch will be enabled +#enable_watch: true + ## The bottom of the watch will list sets instead of overlays. #sets_on_watch: false diff --git a/wayvr/src/windowing/manager.rs b/wayvr/src/windowing/manager.rs index 5d8a168c..8b859ff0 100644 --- a/wayvr/src/windowing/manager.rs +++ b/wayvr/src/windowing/manager.rs @@ -288,6 +288,16 @@ where self.sets_changed(app); } OverlayTask::SettingsChanged => { + if let Some(watch) = self.mut_by_id(self.watch_id) { + if app.session.config.enable_watch != watch.config.active_state.is_some() { + if watch.config.active_state.is_some() { + watch.config.deactivate(); + } else { + watch.config.activate(app); + } + } + } + for o in self.overlays.values_mut() { let _ = o .config diff --git a/wlx-common/src/config.rs b/wlx-common/src/config.rs index e673bda9..1770356f 100644 --- a/wlx-common/src/config.rs +++ b/wlx-common/src/config.rs @@ -273,6 +273,9 @@ pub struct GeneralConfig { #[serde(default = "def_false")] pub double_cursor_fix: bool, + #[serde(default = "def_true")] + pub enable_watch: bool, + #[serde(default = "def_false")] pub sets_on_watch: bool, From 7f97dc884f9a9120ba4e90bcbcc8d988ca32b396 Mon Sep 17 00:00:00 2001 From: oo8dev Date: Wed, 3 Jun 2026 09:51:22 +0200 Subject: [PATCH 3/3] wayvr: Space gravity (#520) * wayvr: Space gravity (wip) * dash-frontend: dedicated "Space drag" settings tab, deduplicate overlay shift code in xr&vr, account for gravity shift for static overlays * space reset & gravity conflict bugfix, add ground friction slider * Space gravity UI improvements * space gravity: floor level * wayvr: space gravity: hide in openvr --- dash-frontend/assets/dashboard/drag.svg | 1 + dash-frontend/assets/dashboard/gravity.svg | 46 ++++++ dash-frontend/assets/gui/tab/settings.xml | 9 +- .../gui/tab/settings_tab_space_drag.xml | 14 ++ dash-frontend/assets/lang/en.json | 15 +- dash-frontend/src/tab/apps.rs | 4 +- dash-frontend/src/tab/settings/mod.rs | 146 ++++++++++++------ .../src/tab/settings/tab_features.rs | 11 +- .../src/tab/settings/tab_space_drag.rs | 138 +++++++++++++++++ dash-frontend/src/util/popup_manager.rs | 13 +- dash-frontend/src/views/running_games_list.rs | 5 +- uidev/src/testbed/testbed_generic.rs | 12 +- wayvr/src/backend/mod.rs | 1 + wayvr/src/backend/openvr/mod.rs | 4 + wayvr/src/backend/openvr/playspace.rs | 13 +- wayvr/src/backend/openxr/mod.rs | 14 +- wayvr/src/backend/openxr/playspace.rs | 56 ++++--- wayvr/src/backend/playspace_common.rs | 101 ++++++++++++ wayvr/src/config.rs | 12 ++ wayvr/src/gui/panel/mod.rs | 11 +- wayvr/src/overlays/anchor.rs | 11 +- wayvr/src/overlays/edit/pos.rs | 24 +-- wayvr/src/overlays/edit/tab.rs | 8 +- wayvr/src/overlays/watch.rs | 10 +- wayvr/src/res/config.yaml | 15 ++ wayvr/src/state.rs | 4 + wgui/src/components/editbox.rs | 9 +- wgui/src/components/slider.rs | 4 +- wgui/src/event.rs | 11 ++ wgui/src/layout.rs | 13 +- wgui/src/parser/widget_label.rs | 6 +- wlx-common/src/config.rs | 22 +++ 32 files changed, 573 insertions(+), 190 deletions(-) create mode 100644 dash-frontend/assets/dashboard/drag.svg create mode 100644 dash-frontend/assets/dashboard/gravity.svg create mode 100644 dash-frontend/assets/gui/tab/settings_tab_space_drag.xml create mode 100644 dash-frontend/src/tab/settings/tab_space_drag.rs create mode 100644 wayvr/src/backend/playspace_common.rs diff --git a/dash-frontend/assets/dashboard/drag.svg b/dash-frontend/assets/dashboard/drag.svg new file mode 100644 index 00000000..9710d6bd --- /dev/null +++ b/dash-frontend/assets/dashboard/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dash-frontend/assets/dashboard/gravity.svg b/dash-frontend/assets/dashboard/gravity.svg new file mode 100644 index 00000000..bec06901 --- /dev/null +++ b/dash-frontend/assets/dashboard/gravity.svg @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/dash-frontend/assets/gui/tab/settings.xml b/dash-frontend/assets/gui/tab/settings.xml index b6850851..8b7d33a8 100644 --- a/dash-frontend/assets/gui/tab/settings.xml +++ b/dash-frontend/assets/gui/tab/settings.xml @@ -13,13 +13,13 @@