persist BackendAttrib across sessions

This commit is contained in:
galister
2025-12-20 17:42:18 +09:00
parent 9381ebc700
commit 23df9228a9
19 changed files with 158 additions and 114 deletions

View File

@@ -1,13 +1,12 @@
use std::{collections::HashMap, sync::Arc}; use std::{collections::HashMap, sync::Arc};
use chrono::Offset; use chrono::Offset;
use glam::Affine3A;
use idmap::IdMap; use idmap::IdMap;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{ use crate::{
astr_containers::{AStrMap, AStrSet}, astr_containers::{AStrMap, AStrSet},
overlays::{ToastDisplayMethod, ToastTopic}, overlays::{BackendAttribValue, ToastDisplayMethod, ToastTopic},
windowing::OverlayWindowState, windowing::OverlayWindowState,
}; };
@@ -92,11 +91,7 @@ const fn def_astrset_empty() -> AStrSet {
AStrSet::new() AStrSet::new()
} }
const fn def_curve_values() -> AStrMap<f32> { const fn def_attribs() -> AStrMap<Vec<BackendAttribValue>> {
AStrMap::new()
}
const fn def_transforms() -> AStrMap<Affine3A> {
AStrMap::new() AStrMap::new()
} }
@@ -134,6 +129,9 @@ pub struct GeneralConfig {
pub color_faded: Option<String>, pub color_faded: Option<String>,
pub default_keymap: Option<String>, pub default_keymap: Option<String>,
#[serde(default = "def_attribs")]
pub attribs: AStrMap<Vec<BackendAttribValue>>,
#[serde(default = "def_click_freeze_time_ms")] #[serde(default = "def_click_freeze_time_ms")]
pub click_freeze_time_ms: u32, pub click_freeze_time_ms: u32,
@@ -194,15 +192,6 @@ pub struct GeneralConfig {
#[serde(default = "def_astrset_empty")] #[serde(default = "def_astrset_empty")]
pub custom_panels: AStrSet, pub custom_panels: AStrSet,
#[serde(default = "def_astrset_empty")]
pub show_screens: AStrSet,
#[serde(default = "def_curve_values")]
pub curve_values: AStrMap<f32>,
#[serde(default = "def_transforms")]
pub transform_values: AStrMap<Affine3A>,
#[serde(default = "def_auto")] #[serde(default = "def_auto")]
pub capture_method: Arc<str>, pub capture_method: Arc<str>,

View File

@@ -15,3 +15,39 @@ pub enum ToastDisplayMethod {
Center, Center,
Watch, Watch,
} }
#[derive(Clone, Copy)]
pub enum BackendAttrib {
Stereo,
MouseTransform,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BackendAttribValue {
Stereo(StereoMode),
MouseTransform(MouseTransform),
}
#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize)]
pub enum StereoMode {
#[default]
None,
LeftRight,
RightLeft,
TopBottom,
BottomTop,
}
#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize)]
pub enum MouseTransform {
#[default]
Default,
Normal,
Rotated90,
Rotated180,
Rotated270,
Flipped,
Flipped90,
Flipped180,
Flipped270,
}

View File

@@ -15,6 +15,7 @@ pub mod task;
use thiserror::Error; use thiserror::Error;
#[derive(Clone, Copy)]
pub enum XrBackend { pub enum XrBackend {
OpenXR, OpenXR,
OpenVR, OpenVR,

View File

@@ -21,14 +21,14 @@ use vulkano::{
}, },
}; };
use wgui::gfx::WGfx; use wgui::gfx::WGfx;
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
use crate::backend::input::{HoverResult, PointerHit}; use crate::backend::input::{HoverResult, PointerHit};
use crate::state::AppState; use crate::state::AppState;
use crate::subsystem::hid::WheelDelta; use crate::subsystem::hid::WheelDelta;
use crate::windowing::Z_ORDER_LINES; use crate::windowing::Z_ORDER_LINES;
use crate::windowing::backend::{ use crate::windowing::backend::{
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData, FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender,
RenderResources, ShouldRender,
}; };
use crate::windowing::window::{OverlayWindowConfig, OverlayWindowData}; use crate::windowing::window::{OverlayWindowConfig, OverlayWindowData};

View File

@@ -3,7 +3,11 @@ use config::{Config, File};
use log::error; use log::error;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::path::PathBuf; use std::path::PathBuf;
use wlx_common::config::{GeneralConfig, SerializedWindowSet, SerializedWindowStates}; use wlx_common::{
astr_containers::AStrMap,
config::{GeneralConfig, SerializedWindowSet, SerializedWindowStates},
overlays::BackendAttribValue,
};
const FALLBACKS: [&str; 2] = [ const FALLBACKS: [&str; 2] = [
include_str!("res/keyboard.yaml"), include_str!("res/keyboard.yaml"),
@@ -140,6 +144,7 @@ pub struct AutoState {
pub sets: Vec<SerializedWindowSet>, pub sets: Vec<SerializedWindowSet>,
pub global_set: SerializedWindowStates, pub global_set: SerializedWindowStates,
pub last_set: u32, pub last_set: u32,
pub attribs: AStrMap<Vec<BackendAttribValue>>,
} }
fn get_state_path() -> PathBuf { fn get_state_path() -> PathBuf {
@@ -153,6 +158,7 @@ pub fn save_state(config: &GeneralConfig) -> anyhow::Result<()> {
sets: config.sets.clone(), sets: config.sets.clone(),
last_set: config.last_set, last_set: config.last_set,
global_set: config.global_set.clone(), global_set: config.global_set.clone(),
attribs: config.attribs.clone(),
}; };
let json = serde_json::to_string_pretty(&conf).unwrap(); // want panic let json = serde_json::to_string_pretty(&conf).unwrap(); // want panic

View File

@@ -18,6 +18,7 @@ use wgui::{
renderer_vk::context::Context as WguiContext, renderer_vk::context::Context as WguiContext,
widget::{EventResult, label::WidgetLabel}, widget::{EventResult, label::WidgetLabel},
}; };
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
use wlx_common::timestep::Timestep; use wlx_common::timestep::Timestep;
use crate::{ use crate::{
@@ -25,8 +26,7 @@ use crate::{
state::AppState, state::AppState,
subsystem::hid::WheelDelta, subsystem::hid::WheelDelta,
windowing::backend::{ windowing::backend::{
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData, FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender, ui_transform,
RenderResources, ShouldRender, ui_transform,
}, },
}; };

View File

@@ -14,7 +14,7 @@ use wgui::{
parser::Fetchable, parser::Fetchable,
widget::EventResult, widget::EventResult,
}; };
use wlx_capture::frame::Transform; use wlx_common::overlays::{BackendAttrib, BackendAttribValue, MouseTransform, StereoMode};
use crate::{ use crate::{
attrib_value, attrib_value,
@@ -35,10 +35,7 @@ use crate::{
subsystem::hid::WheelDelta, subsystem::hid::WheelDelta,
windowing::{ windowing::{
OverlayID, OverlaySelector, OverlayID, OverlaySelector,
backend::{ backend::{DummyBackend, OverlayBackend, OverlayEventData, RenderResources, ShouldRender},
BackendAttrib, BackendAttribValue, DummyBackend, OverlayBackend, OverlayEventData,
RenderResources, ShouldRender, StereoMode,
},
window::OverlayWindowConfig, window::OverlayWindowConfig,
}, },
}; };
@@ -69,7 +66,7 @@ struct EditModeState {
lock: InteractLockHandler, lock: InteractLockHandler,
pos: SpriteTabHandler<PosTabState>, pos: SpriteTabHandler<PosTabState>,
stereo: SpriteTabHandler<StereoMode>, stereo: SpriteTabHandler<StereoMode>,
mouse: SpriteTabHandler<Transform>, mouse: SpriteTabHandler<MouseTransform>,
} }
type EditModeWrapPanel = GuiPanel<EditModeState>; type EditModeWrapPanel = GuiPanel<EditModeState>;

View File

@@ -1,12 +1,8 @@
use wlx_capture::frame::Transform; use crate::overlays::edit::{
EditModeWrapPanel,
use crate::{ sprite_tab::{SpriteTabHandler, SpriteTabKey},
overlays::edit::{
EditModeWrapPanel,
sprite_tab::{SpriteTabHandler, SpriteTabKey},
},
windowing::backend::BackendAttribValue,
}; };
use wlx_common::overlays::{BackendAttribValue, MouseTransform};
static MOUSE_NAMES: [&str; 9] = [ static MOUSE_NAMES: [&str; 9] = [
"default", "default",
@@ -22,7 +18,7 @@ static MOUSE_NAMES: [&str; 9] = [
pub fn new_mouse_tab_handler( pub fn new_mouse_tab_handler(
panel: &mut EditModeWrapPanel, panel: &mut EditModeWrapPanel,
) -> anyhow::Result<SpriteTabHandler<Transform>> { ) -> anyhow::Result<SpriteTabHandler<MouseTransform>> {
SpriteTabHandler::new( SpriteTabHandler::new(
panel, panel,
"mouse", "mouse",
@@ -38,32 +34,32 @@ pub fn new_mouse_tab_handler(
) )
} }
impl SpriteTabKey for Transform { impl SpriteTabKey for MouseTransform {
fn to_tab_key(&self) -> &'static str { fn to_tab_key(&self) -> &'static str {
match self { match self {
Transform::Undefined => "default", MouseTransform::Default => "default",
Transform::Normal => "normal", MouseTransform::Normal => "normal",
Transform::Rotated90 => "rotate90", MouseTransform::Rotated90 => "rotate90",
Transform::Rotated180 => "rotate180", MouseTransform::Rotated180 => "rotate180",
Transform::Rotated270 => "rotate270", MouseTransform::Rotated270 => "rotate270",
Transform::Flipped => "flipped", MouseTransform::Flipped => "flipped",
Transform::Flipped90 => "flip90", MouseTransform::Flipped90 => "flip90",
Transform::Flipped180 => "flip180", MouseTransform::Flipped180 => "flip180",
Transform::Flipped270 => "flip270", MouseTransform::Flipped270 => "flip270",
} }
} }
fn from_tab_key(key: &str) -> Self { fn from_tab_key(key: &str) -> Self {
match key { match key {
"default" => Transform::Undefined, "default" => MouseTransform::Default,
"normal" => Transform::Normal, "normal" => MouseTransform::Normal,
"rotate90" => Transform::Rotated90, "rotate90" => MouseTransform::Rotated90,
"rotate180" => Transform::Rotated180, "rotate180" => MouseTransform::Rotated180,
"rotate270" => Transform::Rotated270, "rotate270" => MouseTransform::Rotated270,
"flipped" => Transform::Flipped, "flipped" => MouseTransform::Flipped,
"flip90" => Transform::Flipped90, "flip90" => MouseTransform::Flipped90,
"flip180" => Transform::Flipped180, "flip180" => MouseTransform::Flipped180,
"flip270" => Transform::Flipped270, "flip270" => MouseTransform::Flipped270,
_ => { _ => {
panic!("cannot translate to mouse transform: {key}") panic!("cannot translate to mouse transform: {key}")
} }

View File

@@ -1,10 +1,8 @@
use crate::{ use crate::overlays::edit::{
overlays::edit::{ EditModeWrapPanel,
EditModeWrapPanel, sprite_tab::{SpriteTabHandler, SpriteTabKey},
sprite_tab::{SpriteTabHandler, SpriteTabKey},
},
windowing::backend::{BackendAttribValue, StereoMode},
}; };
use wlx_common::overlays::{BackendAttribValue, StereoMode};
static STEREO_NAMES: [&str; 5] = ["none", "leftright", "rightleft", "topbottom", "bottomtop"]; static STEREO_NAMES: [&str; 5] = ["none", "leftright", "rightleft", "topbottom", "bottomtop"];

View File

@@ -16,10 +16,7 @@ use crate::{
get_keymap_wl, get_keymap_x11, get_keymap_wl, get_keymap_x11,
}, },
windowing::{ windowing::{
backend::{ backend::{FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender},
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData,
RenderResources, ShouldRender,
},
window::{OverlayCategory, OverlayWindowConfig}, window::{OverlayCategory, OverlayWindowConfig},
}, },
}; };
@@ -31,6 +28,7 @@ use wgui::{
drawing, drawing,
event::{InternalStateChangeEvent, MouseButton, MouseButtonIndex}, event::{InternalStateChangeEvent, MouseButton, MouseButtonIndex},
}; };
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
use wlx_common::windowing::{OverlayWindowState, Positioning}; use wlx_common::windowing::{OverlayWindowState, Positioning};
pub mod builder; pub mod builder;

View File

@@ -9,7 +9,10 @@ use std::{
use futures::{Future, FutureExt}; use futures::{Future, FutureExt};
use glam::{Affine2, Affine3A, Quat, Vec3, vec3}; use glam::{Affine2, Affine3A, Quat, Vec3, vec3};
use wlx_capture::pipewire::{PipewireCapture, PipewireSelectScreenResult, pipewire_select_screen}; use wlx_capture::pipewire::{PipewireCapture, PipewireSelectScreenResult, pipewire_select_screen};
use wlx_common::windowing::OverlayWindowState; use wlx_common::{
overlays::{BackendAttrib, BackendAttribValue},
windowing::OverlayWindowState,
};
use crate::{ use crate::{
backend::{ backend::{
@@ -21,8 +24,8 @@ use crate::{
windowing::{ windowing::{
OverlaySelector, OverlaySelector,
backend::{ backend::{
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData, FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender,
RenderResources, ShouldRender, ui_transform, ui_transform,
}, },
window::{OverlayCategory, OverlayWindowConfig}, window::{OverlayCategory, OverlayWindowConfig},
}, },
@@ -76,8 +79,11 @@ impl OverlayBackend for MirrorBackend {
let node_id = pw_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element let node_id = pw_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element
log::info!("{}: PipeWire node selected: {}", self.name.clone(), node_id); log::info!("{}: PipeWire node selected: {}", self.name.clone(), node_id);
let capture = PipewireCapture::new(self.name.clone(), node_id); let capture = PipewireCapture::new(self.name.clone(), node_id);
self.renderer = self.renderer = Some(ScreenBackend::new_raw(
Some(ScreenBackend::new_raw(self.name.clone(), Box::new(capture))); self.name.clone(),
app.xr_backend,
Box::new(capture),
));
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify( app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
OverlaySelector::Name(self.name.clone()), OverlaySelector::Name(self.name.clone()),
Box::new(|app, o| { Box::new(|app, o| {

View File

@@ -15,10 +15,10 @@ use crate::{
state::AppState, state::AppState,
subsystem::hid::{MOUSE_LEFT, MOUSE_MIDDLE, MOUSE_RIGHT, WheelDelta}, subsystem::hid::{MOUSE_LEFT, MOUSE_MIDDLE, MOUSE_RIGHT, WheelDelta},
windowing::backend::{ windowing::backend::{
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData, FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender, ui_transform,
RenderResources, ShouldRender, StereoMode, ui_transform,
}, },
}; };
use wlx_common::overlays::{BackendAttrib, BackendAttribValue, MouseTransform, StereoMode};
use super::capture::{ScreenPipeline, WlxCaptureIn, WlxCaptureOut, receive_callback}; use super::capture::{ScreenPipeline, WlxCaptureIn, WlxCaptureOut, receive_callback};
@@ -50,12 +50,13 @@ pub struct ScreenBackend {
pub(super) logical_pos: Vec2, pub(super) logical_pos: Vec2,
pub(super) logical_size: Vec2, pub(super) logical_size: Vec2,
pub(super) mouse_transform_original: Transform, pub(super) mouse_transform_original: Transform,
mouse_transform_override: Transform, mouse_transform_override: MouseTransform,
} }
impl ScreenBackend { impl ScreenBackend {
pub fn new_raw( pub fn new_raw(
name: Arc<str>, name: Arc<str>,
xr_backend: XrBackend,
capture: Box<dyn WlxCapture<WlxCaptureIn, WlxCaptureOut>>, capture: Box<dyn WlxCapture<WlxCaptureIn, WlxCaptureOut>>,
) -> Self { ) -> Self {
Self { Self {
@@ -66,11 +67,15 @@ impl ScreenBackend {
meta: None, meta: None,
mouse_transform: Affine2::ZERO, mouse_transform: Affine2::ZERO,
interaction_transform: None, interaction_transform: None,
stereo: None, stereo: if matches!(xr_backend, XrBackend::OpenXR) {
Some(StereoMode::None)
} else {
None
},
logical_pos: Vec2::ZERO, logical_pos: Vec2::ZERO,
logical_size: Vec2::ZERO, logical_size: Vec2::ZERO,
mouse_transform_original: Transform::Undefined, mouse_transform_original: Transform::Undefined,
mouse_transform_override: Transform::Undefined, mouse_transform_override: MouseTransform::Default,
} }
} }
@@ -125,12 +130,7 @@ impl ScreenBackend {
} }
impl OverlayBackend for ScreenBackend { impl OverlayBackend for ScreenBackend {
fn init(&mut self, app: &mut AppState) -> anyhow::Result<()> { fn init(&mut self, _app: &mut AppState) -> anyhow::Result<()> {
self.stereo = if matches!(app.xr_backend, XrBackend::OpenXR) {
Some(StereoMode::None)
} else {
None
};
Ok(()) Ok(())
} }
fn should_render(&mut self, app: &mut AppState) -> anyhow::Result<ShouldRender> { fn should_render(&mut self, app: &mut AppState) -> anyhow::Result<ShouldRender> {
@@ -317,7 +317,18 @@ impl OverlayBackend for ScreenBackend {
} }
BackendAttribValue::MouseTransform(new) => { BackendAttribValue::MouseTransform(new) => {
self.mouse_transform_override = new; self.mouse_transform_override = new;
self.apply_mouse_transform_with_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,
};
self.apply_mouse_transform_with_override(frame_transform);
true true
} }
_ => false, _ => false,

View File

@@ -20,7 +20,7 @@ use wlx_capture::{
WlxCapture, WlxCapture,
frame::{self as wlx_frame, DrmFormat, FrameFormat, MouseMeta, Transform, WlxFrame}, frame::{self as wlx_frame, DrmFormat, FrameFormat, MouseMeta, Transform, WlxFrame},
}; };
use wlx_common::config::GeneralConfig; use wlx_common::{config::GeneralConfig, overlays::StereoMode};
use crate::{ use crate::{
graphics::{ graphics::{
@@ -29,7 +29,7 @@ use crate::{
upload_quad_vertices, upload_quad_vertices,
}, },
state::AppState, state::AppState,
windowing::backend::{FrameMeta, RenderResources, StereoMode}, windowing::backend::{FrameMeta, RenderResources},
}; };
const CURSOR_SIZE: f32 = 16. / 1440.; const CURSOR_SIZE: f32 = 16. / 1440.;

View File

@@ -49,7 +49,7 @@ impl ScreenBackend {
PipewireCapture::new(name, node_id) PipewireCapture::new(name, node_id)
); );
Ok(( Ok((
Self::new_raw(output.name.clone(), capture), Self::new_raw(output.name.clone(), app.xr_backend, capture),
select_screen_result.restore_token, select_screen_result.restore_token,
)) ))
} }

View File

@@ -27,7 +27,7 @@ impl ScreenBackend {
app.gfx_extras.queue_capture, app.gfx_extras.queue_capture,
WlrDmabufCapture::new(client, output.id) WlrDmabufCapture::new(client, output.id)
); );
Some(Self::new_raw(output.name.clone(), capture)) Some(Self::new_raw(output.name.clone(), app.xr_backend, capture))
} }
pub fn new_wlr_screencopy(output: &WlxOutput, app: &AppState) -> Option<Self> { pub fn new_wlr_screencopy(output: &WlxOutput, app: &AppState) -> Option<Self> {
@@ -36,7 +36,7 @@ impl ScreenBackend {
app.gfx_extras.queue_capture, app.gfx_extras.queue_capture,
WlrScreencopyCapture::new(client, output.id) WlrScreencopyCapture::new(client, output.id)
); );
Some(Self::new_raw(output.name.clone(), capture)) Some(Self::new_raw(output.name.clone(), app.xr_backend, capture))
} }
} }

View File

@@ -27,7 +27,7 @@ impl ScreenBackend {
app.gfx_extras.queue_capture, app.gfx_extras.queue_capture,
XshmCapture::new(screen.clone()) XshmCapture::new(screen.clone())
); );
Self::new_raw(screen.name.clone(), capture) Self::new_raw(screen.name.clone(), app.xr_backend, capture)
} }
} }
@@ -97,6 +97,7 @@ pub fn create_screens_x11pw(app: &mut AppState) -> anyhow::Result<ScreenCreateDa
let mut backend = ScreenBackend::new_raw( let mut backend = ScreenBackend::new_raw(
m.name.clone(), m.name.clone(),
app.xr_backend,
new_wlx_capture!( new_wlx_capture!(
app.gfx_extras.queue_capture, app.gfx_extras.queue_capture,
PipewireCapture::new(m.name.clone(), s.node_id) PipewireCapture::new(m.name.clone(), s.node_id)

View File

@@ -15,6 +15,7 @@ use wgui::gfx::{
pipeline::{WGfxPipeline, WPipelineCreateInfo}, pipeline::{WGfxPipeline, WPipelineCreateInfo},
}; };
use wlx_capture::frame::{DmabufFrame, FourCC, FrameFormat, FramePlane}; use wlx_capture::frame::{DmabufFrame, FourCC, FrameFormat, FramePlane};
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
use wlx_common::windowing::OverlayWindowState; use wlx_common::windowing::OverlayWindowState;
use crate::{ use crate::{
@@ -33,8 +34,8 @@ use crate::{
windowing::{ windowing::{
OverlayID, OverlaySelector, Z_ORDER_DASHBOARD, OverlayID, OverlaySelector, Z_ORDER_DASHBOARD,
backend::{ backend::{
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData, FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender,
RenderResources, ShouldRender, ui_transform, ui_transform,
}, },
manager::OverlayWindowManager, manager::OverlayWindowManager,
window::{OverlayCategory, OverlayWindowConfig, OverlayWindowData}, window::{OverlayCategory, OverlayWindowConfig, OverlayWindowData},

View File

@@ -6,7 +6,7 @@ use wgui::gfx::{
WGfx, WGfx,
cmd::{GfxCommandBuffer, WGfxClearMode}, cmd::{GfxCommandBuffer, WGfxClearMode},
}; };
use wlx_capture::frame::Transform; use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
use crate::{ use crate::{
backend::input::{HoverResult, PointerHit}, backend::input::{HoverResult, PointerHit},
@@ -33,16 +33,6 @@ pub enum ShouldRender {
Unable, Unable,
} }
#[derive(Default, Debug, Clone, Copy)]
pub enum StereoMode {
#[default]
None,
LeftRight,
RightLeft,
TopBottom,
BottomTop,
}
pub struct RenderTarget { pub struct RenderTarget {
pub views: SmallVec<[Arc<ImageView>; 2]>, pub views: SmallVec<[Arc<ImageView>; 2]>,
} }
@@ -109,18 +99,6 @@ macro_rules! attrib_value {
}; };
} }
#[derive(Clone, Copy)]
pub enum BackendAttrib {
Stereo,
MouseTransform,
}
#[derive(Debug, Clone)]
pub enum BackendAttribValue {
Stereo(StereoMode),
MouseTransform(Transform),
}
pub struct OverlayMeta { pub struct OverlayMeta {
pub id: OverlayID, pub id: OverlayID,
pub name: Arc<str>, pub name: Arc<str>,

View File

@@ -8,7 +8,7 @@ use slotmap::{HopSlotMap, Key, SecondaryMap};
use wlx_common::{ use wlx_common::{
astr_containers::{AStrMap, AStrMapExt}, astr_containers::{AStrMap, AStrMapExt},
config::SerializedWindowSet, config::SerializedWindowSet,
overlays::ToastTopic, overlays::{BackendAttrib, ToastTopic},
}; };
use crate::{ use crate::{
@@ -277,6 +277,8 @@ where
} }
} }
const SAVED_ATTRIBS: [BackendAttrib; 2] = [BackendAttrib::Stereo, BackendAttrib::MouseTransform];
impl<T> OverlayWindowManager<T> { impl<T> OverlayWindowManager<T> {
pub fn pop_dropped(&mut self) -> Option<OverlayWindowData<T>> { pub fn pop_dropped(&mut self) -> Option<OverlayWindowData<T>> {
self.dropped_overlays.pop_front() self.dropped_overlays.pop_front()
@@ -334,6 +336,17 @@ impl<T> OverlayWindowManager<T> {
.insert(o.config.name.clone(), state.clone()); .insert(o.config.name.clone(), state.clone());
} }
// BackendAttrib
for o in self.overlays.values() {
app.session.config.attribs.arc_set(
o.config.name.clone(),
SAVED_ATTRIBS
.iter()
.filter_map(|a| o.config.backend.get_attrib(*a))
.collect(),
);
}
if restore_after { if restore_after {
self.switch_to_set(app, Some(self.restore_set)); self.switch_to_set(app, Some(self.restore_set));
} }
@@ -389,6 +402,19 @@ impl<T> OverlayWindowManager<T> {
} }
} }
for (name, attribs) in &app.session.config.attribs.clone() {
let Some(oid) = self.lookup(&*name) else {
continue;
};
let Some(o) = self.mut_by_id(oid) else {
continue;
};
for value in attribs {
o.config.backend.set_attrib(app, value.clone());
}
}
self.restore_set = (app.session.config.last_set as usize).min(self.sets.len() - 1); self.restore_set = (app.session.config.last_set as usize).min(self.sets.len() - 1);
} }