From 9d43068271977f67ed722bf905f1c26d2a366ff4 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:24:14 +0900 Subject: [PATCH] adjust mouse for stereo --- wayvr/src/assets/gui/edit.xml | 3 +- wayvr/src/assets/lang/en.json | 1 + wayvr/src/overlays/edit/mod.rs | 25 ++++++++++++++ wayvr/src/overlays/screen/backend.rs | 49 +++++++++++++++++++++------- wayvr/src/overlays/wayvr.rs | 27 +++++++++++++-- wlx-common/src/overlays.rs | 2 ++ 6 files changed, 92 insertions(+), 15 deletions(-) diff --git a/wayvr/src/assets/gui/edit.xml b/wayvr/src/assets/gui/edit.xml index 7ad87cc8..022ae8a8 100644 --- a/wayvr/src/assets/gui/edit.xml +++ b/wayvr/src/assets/gui/edit.xml @@ -85,8 +85,9 @@ -
+
+
diff --git a/wayvr/src/assets/lang/en.json b/wayvr/src/assets/lang/en.json index ea88d597..701f3072 100644 --- a/wayvr/src/assets/lang/en.json +++ b/wayvr/src/assets/lang/en.json @@ -47,6 +47,7 @@ "GLOBAL": "Always visible", "RESIZE_PRESS_AND_DRAG": "Resize (press & drag)", "STEREO_3D_MODE": { + "ADJUST_MOUSE": "Adjust mouse", "SPLIT_BOTTOM_TOP": "BOTTOM→TOP", "SPLIT_LEFT_RIGHT": "LEFT→RIGHT", "SPLIT_RIGHT_LEFT": "RIGHT→LEFT", diff --git a/wayvr/src/overlays/edit/mod.rs b/wayvr/src/overlays/edit/mod.rs index e7a43e4c..e1349fab 100644 --- a/wayvr/src/overlays/edit/mod.rs +++ b/wayvr/src/overlays/edit/mod.rs @@ -437,6 +437,11 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result { "stereo_full_frame_box", cb_assign_stereo_full_frame, )?; + set_up_checkbox( + &mut panel, + "stereo_adjust_mouse_box", + cb_assign_stereo_adjust_mouse, + )?; set_up_slider(&mut panel, "lerp_slider", cb_assign_lerp)?; set_up_slider(&mut panel, "alpha_slider", cb_assign_alpha)?; set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?; @@ -546,6 +551,16 @@ fn reset_panel( c.set_checked(&mut common, full_frame); } + if let Some(adjust_mouse) = attrib_value!( + owc.backend.get_attrib(BackendAttrib::StereoAdjustMouse), + BackendAttribValue::StereoAdjustMouse + ) { + let c = panel + .parser_state + .fetch_component_as::("stereo_adjust_mouse_box")?; + c.set_checked(&mut common, adjust_mouse); + } + panel.layout.process_alterables(alterables)?; Ok(()) @@ -596,6 +611,16 @@ fn cb_assign_stereo_full_frame( owc.backend.set_attrib(_app, attrib); } +fn cb_assign_stereo_adjust_mouse( + _app: &mut AppState, + owc: &mut OverlayWindowConfig, + adjust_mouse: bool, +) { + owc.dirty = true; + let attrib = BackendAttribValue::StereoAdjustMouse(adjust_mouse); + owc.backend.set_attrib(_app, attrib); +} + fn set_up_slider( panel: &mut EditModeWrapPanel, id: &str, diff --git a/wayvr/src/overlays/screen/backend.rs b/wayvr/src/overlays/screen/backend.rs index c55f3eb8..1e0bd63a 100644 --- a/wayvr/src/overlays/screen/backend.rs +++ b/wayvr/src/overlays/screen/backend.rs @@ -58,6 +58,7 @@ pub struct ScreenBackend { interaction_transform: Option, stereo: Option, stereo_full_frame: bool, + stereo_adjust_mouse: bool, pub(super) logical_pos: Vec2, pub(super) logical_size: Vec2, pub(super) mouse_transform_original: Transform, @@ -87,6 +88,7 @@ impl ScreenBackend { None }, stereo_full_frame: false, + stereo_adjust_mouse: false, logical_pos: Vec2::ZERO, logical_size: Vec2::ZERO, mouse_transform_original: Transform::Undefined, @@ -96,9 +98,19 @@ impl ScreenBackend { } pub(super) fn apply_mouse_transform_with_override(&mut self, override_transform: Transform) { - let size = self.logical_size; + let mut size = self.logical_size; let pos = self.logical_pos; + if self.stereo_adjust_mouse + && let Some(stereo) = self.stereo.as_ref() + { + match stereo { + StereoMode::LeftRight | StereoMode::RightLeft => size.x *= 0.5, + StereoMode::TopBottom | StereoMode::BottomTop => size.y *= 0.5, + _ => {} + } + } + let transform = match override_transform { Transform::Undefined => self.mouse_transform_original, other => other, @@ -351,6 +363,9 @@ impl OverlayBackend for ScreenBackend { BackendAttrib::StereoFullFrame => { Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) } + BackendAttrib::StereoAdjustMouse => Some(BackendAttribValue::StereoAdjustMouse( + self.stereo_adjust_mouse, + )), _ => None, } } @@ -370,17 +385,7 @@ impl OverlayBackend for ScreenBackend { } BackendAttribValue::MouseTransform(new) => { self.mouse_transform_override = new; - let frame_transform = match new { - MouseTransform::Default => Transform::Undefined, - MouseTransform::Normal => Transform::Normal, - MouseTransform::Rotated90 => Transform::Rotated90, - MouseTransform::Rotated180 => Transform::Rotated180, - MouseTransform::Rotated270 => Transform::Rotated270, - MouseTransform::Flipped => Transform::Flipped, - MouseTransform::Flipped90 => Transform::Flipped90, - MouseTransform::Flipped180 => Transform::Flipped180, - MouseTransform::Flipped270 => Transform::Flipped270, - }; + let frame_transform = mouse_transform_to_transform(new); self.apply_mouse_transform_with_override(frame_transform); true } @@ -388,7 +393,27 @@ impl OverlayBackend for ScreenBackend { self.stereo_full_frame = new; true } + BackendAttribValue::StereoAdjustMouse(new) => { + self.stereo_adjust_mouse = new; + let frame_transform = mouse_transform_to_transform(self.mouse_transform_override); + self.apply_mouse_transform_with_override(frame_transform); + true + } _ => false, } } } + +fn mouse_transform_to_transform(mouse_transform: MouseTransform) -> Transform { + match mouse_transform { + MouseTransform::Default => Transform::Undefined, + MouseTransform::Normal => Transform::Normal, + MouseTransform::Rotated90 => Transform::Rotated90, + MouseTransform::Rotated180 => Transform::Rotated180, + MouseTransform::Rotated270 => Transform::Rotated270, + MouseTransform::Flipped => Transform::Flipped, + MouseTransform::Flipped90 => Transform::Flipped90, + MouseTransform::Flipped180 => Transform::Flipped180, + MouseTransform::Flipped270 => Transform::Flipped270, + } +} diff --git a/wayvr/src/overlays/wayvr.rs b/wayvr/src/overlays/wayvr.rs index a52fed77..cf90ba82 100644 --- a/wayvr/src/overlays/wayvr.rs +++ b/wayvr/src/overlays/wayvr.rs @@ -110,6 +110,7 @@ pub struct WvrWindowBackend { mouse: Option, stereo: Option, stereo_full_frame: bool, + stereo_adjust_mouse: bool, cur_image: Option>, panel: GuiPanel, inner_extent: [u32; 2], @@ -209,6 +210,7 @@ impl WvrWindowBackend { None }, stereo_full_frame: false, + stereo_adjust_mouse: false, cur_image: None, inner_extent: [0, 0], panel, @@ -221,11 +223,21 @@ impl WvrWindowBackend { fn apply_extent(&mut self, app: &mut AppState, meta: &FrameMeta) -> anyhow::Result<()> { self.interaction_transform = Some(ui_transform(meta.extent)); - let scale = vec2( + let mut scale = vec2( ((meta.extent[0] + BORDER_SIZE * 2) as f32) / (meta.extent[0] as f32), ((meta.extent[1] + BORDER_SIZE * 2 + BAR_SIZE) as f32) / (meta.extent[1] as f32), ); + if self.stereo_adjust_mouse + && let Some(stereo) = self.stereo + { + match stereo { + StereoMode::LeftRight | StereoMode::RightLeft => scale.x *= 0.5, + StereoMode::TopBottom | StereoMode::BottomTop => scale.y *= 0.5, + _ => {} + } + } + let translation = vec2( -(BORDER_SIZE as f32) / (meta.extent[0] as f32), -((BORDER_SIZE + BAR_SIZE) as f32) / (meta.extent[1] as f32), @@ -577,10 +589,13 @@ impl OverlayBackend for WvrWindowBackend { BackendAttrib::StereoFullFrame => { Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) } + BackendAttrib::StereoAdjustMouse => Some(BackendAttribValue::StereoAdjustMouse( + self.stereo_adjust_mouse, + )), _ => None, } } - fn set_attrib(&mut self, _app: &mut AppState, value: BackendAttribValue) -> bool { + fn set_attrib(&mut self, app: &mut AppState, value: BackendAttribValue) -> bool { match value { BackendAttribValue::Stereo(new) => { if let Some(stereo) = self.stereo.as_mut() { @@ -598,6 +613,14 @@ impl OverlayBackend for WvrWindowBackend { self.stereo_full_frame = new; true } + BackendAttribValue::StereoAdjustMouse(new) => { + self.stereo_adjust_mouse = new; + if let Some(meta) = self.meta.take() { + let _ = self.apply_extent(app, &meta); + self.meta = Some(meta); + } + true + } _ => false, } } diff --git a/wlx-common/src/overlays.rs b/wlx-common/src/overlays.rs index af992837..f166aa60 100644 --- a/wlx-common/src/overlays.rs +++ b/wlx-common/src/overlays.rs @@ -23,6 +23,7 @@ pub enum ToastDisplayMethod { pub enum BackendAttrib { Stereo, StereoFullFrame, + StereoAdjustMouse, MouseTransform, Icon, } @@ -31,6 +32,7 @@ pub enum BackendAttrib { pub enum BackendAttribValue { Stereo(StereoMode), StereoFullFrame(bool), + StereoAdjustMouse(bool), MouseTransform(MouseTransform), #[serde(skip_serializing, skip_deserializing)] Icon(Arc),