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),