persist BackendAttrib across sessions
This commit is contained in:
@@ -14,7 +14,7 @@ use wgui::{
|
||||
parser::Fetchable,
|
||||
widget::EventResult,
|
||||
};
|
||||
use wlx_capture::frame::Transform;
|
||||
use wlx_common::overlays::{BackendAttrib, BackendAttribValue, MouseTransform, StereoMode};
|
||||
|
||||
use crate::{
|
||||
attrib_value,
|
||||
@@ -35,10 +35,7 @@ use crate::{
|
||||
subsystem::hid::WheelDelta,
|
||||
windowing::{
|
||||
OverlayID, OverlaySelector,
|
||||
backend::{
|
||||
BackendAttrib, BackendAttribValue, DummyBackend, OverlayBackend, OverlayEventData,
|
||||
RenderResources, ShouldRender, StereoMode,
|
||||
},
|
||||
backend::{DummyBackend, OverlayBackend, OverlayEventData, RenderResources, ShouldRender},
|
||||
window::OverlayWindowConfig,
|
||||
},
|
||||
};
|
||||
@@ -69,7 +66,7 @@ struct EditModeState {
|
||||
lock: InteractLockHandler,
|
||||
pos: SpriteTabHandler<PosTabState>,
|
||||
stereo: SpriteTabHandler<StereoMode>,
|
||||
mouse: SpriteTabHandler<Transform>,
|
||||
mouse: SpriteTabHandler<MouseTransform>,
|
||||
}
|
||||
|
||||
type EditModeWrapPanel = GuiPanel<EditModeState>;
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
use wlx_capture::frame::Transform;
|
||||
|
||||
use crate::{
|
||||
overlays::edit::{
|
||||
EditModeWrapPanel,
|
||||
sprite_tab::{SpriteTabHandler, SpriteTabKey},
|
||||
},
|
||||
windowing::backend::BackendAttribValue,
|
||||
use crate::overlays::edit::{
|
||||
EditModeWrapPanel,
|
||||
sprite_tab::{SpriteTabHandler, SpriteTabKey},
|
||||
};
|
||||
use wlx_common::overlays::{BackendAttribValue, MouseTransform};
|
||||
|
||||
static MOUSE_NAMES: [&str; 9] = [
|
||||
"default",
|
||||
@@ -22,7 +18,7 @@ static MOUSE_NAMES: [&str; 9] = [
|
||||
|
||||
pub fn new_mouse_tab_handler(
|
||||
panel: &mut EditModeWrapPanel,
|
||||
) -> anyhow::Result<SpriteTabHandler<Transform>> {
|
||||
) -> anyhow::Result<SpriteTabHandler<MouseTransform>> {
|
||||
SpriteTabHandler::new(
|
||||
panel,
|
||||
"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 {
|
||||
match self {
|
||||
Transform::Undefined => "default",
|
||||
Transform::Normal => "normal",
|
||||
Transform::Rotated90 => "rotate90",
|
||||
Transform::Rotated180 => "rotate180",
|
||||
Transform::Rotated270 => "rotate270",
|
||||
Transform::Flipped => "flipped",
|
||||
Transform::Flipped90 => "flip90",
|
||||
Transform::Flipped180 => "flip180",
|
||||
Transform::Flipped270 => "flip270",
|
||||
MouseTransform::Default => "default",
|
||||
MouseTransform::Normal => "normal",
|
||||
MouseTransform::Rotated90 => "rotate90",
|
||||
MouseTransform::Rotated180 => "rotate180",
|
||||
MouseTransform::Rotated270 => "rotate270",
|
||||
MouseTransform::Flipped => "flipped",
|
||||
MouseTransform::Flipped90 => "flip90",
|
||||
MouseTransform::Flipped180 => "flip180",
|
||||
MouseTransform::Flipped270 => "flip270",
|
||||
}
|
||||
}
|
||||
|
||||
fn from_tab_key(key: &str) -> Self {
|
||||
match key {
|
||||
"default" => Transform::Undefined,
|
||||
"normal" => Transform::Normal,
|
||||
"rotate90" => Transform::Rotated90,
|
||||
"rotate180" => Transform::Rotated180,
|
||||
"rotate270" => Transform::Rotated270,
|
||||
"flipped" => Transform::Flipped,
|
||||
"flip90" => Transform::Flipped90,
|
||||
"flip180" => Transform::Flipped180,
|
||||
"flip270" => Transform::Flipped270,
|
||||
"default" => MouseTransform::Default,
|
||||
"normal" => MouseTransform::Normal,
|
||||
"rotate90" => MouseTransform::Rotated90,
|
||||
"rotate180" => MouseTransform::Rotated180,
|
||||
"rotate270" => MouseTransform::Rotated270,
|
||||
"flipped" => MouseTransform::Flipped,
|
||||
"flip90" => MouseTransform::Flipped90,
|
||||
"flip180" => MouseTransform::Flipped180,
|
||||
"flip270" => MouseTransform::Flipped270,
|
||||
_ => {
|
||||
panic!("cannot translate to mouse transform: {key}")
|
||||
}
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
use crate::{
|
||||
overlays::edit::{
|
||||
EditModeWrapPanel,
|
||||
sprite_tab::{SpriteTabHandler, SpriteTabKey},
|
||||
},
|
||||
windowing::backend::{BackendAttribValue, StereoMode},
|
||||
use crate::overlays::edit::{
|
||||
EditModeWrapPanel,
|
||||
sprite_tab::{SpriteTabHandler, SpriteTabKey},
|
||||
};
|
||||
use wlx_common::overlays::{BackendAttribValue, StereoMode};
|
||||
|
||||
static STEREO_NAMES: [&str; 5] = ["none", "leftright", "rightleft", "topbottom", "bottomtop"];
|
||||
|
||||
|
||||
@@ -16,10 +16,7 @@ use crate::{
|
||||
get_keymap_wl, get_keymap_x11,
|
||||
},
|
||||
windowing::{
|
||||
backend::{
|
||||
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData,
|
||||
RenderResources, ShouldRender,
|
||||
},
|
||||
backend::{FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender},
|
||||
window::{OverlayCategory, OverlayWindowConfig},
|
||||
},
|
||||
};
|
||||
@@ -31,6 +28,7 @@ use wgui::{
|
||||
drawing,
|
||||
event::{InternalStateChangeEvent, MouseButton, MouseButtonIndex},
|
||||
};
|
||||
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
|
||||
use wlx_common::windowing::{OverlayWindowState, Positioning};
|
||||
|
||||
pub mod builder;
|
||||
|
||||
@@ -9,7 +9,10 @@ use std::{
|
||||
use futures::{Future, FutureExt};
|
||||
use glam::{Affine2, Affine3A, Quat, Vec3, vec3};
|
||||
use wlx_capture::pipewire::{PipewireCapture, PipewireSelectScreenResult, pipewire_select_screen};
|
||||
use wlx_common::windowing::OverlayWindowState;
|
||||
use wlx_common::{
|
||||
overlays::{BackendAttrib, BackendAttribValue},
|
||||
windowing::OverlayWindowState,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
backend::{
|
||||
@@ -21,8 +24,8 @@ use crate::{
|
||||
windowing::{
|
||||
OverlaySelector,
|
||||
backend::{
|
||||
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData,
|
||||
RenderResources, ShouldRender, ui_transform,
|
||||
FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender,
|
||||
ui_transform,
|
||||
},
|
||||
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
|
||||
log::info!("{}: PipeWire node selected: {}", self.name.clone(), node_id);
|
||||
let capture = PipewireCapture::new(self.name.clone(), node_id);
|
||||
self.renderer =
|
||||
Some(ScreenBackend::new_raw(self.name.clone(), Box::new(capture)));
|
||||
self.renderer = Some(ScreenBackend::new_raw(
|
||||
self.name.clone(),
|
||||
app.xr_backend,
|
||||
Box::new(capture),
|
||||
));
|
||||
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
|
||||
OverlaySelector::Name(self.name.clone()),
|
||||
Box::new(|app, o| {
|
||||
|
||||
@@ -15,10 +15,10 @@ use crate::{
|
||||
state::AppState,
|
||||
subsystem::hid::{MOUSE_LEFT, MOUSE_MIDDLE, MOUSE_RIGHT, WheelDelta},
|
||||
windowing::backend::{
|
||||
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData,
|
||||
RenderResources, ShouldRender, StereoMode, ui_transform,
|
||||
FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender, ui_transform,
|
||||
},
|
||||
};
|
||||
use wlx_common::overlays::{BackendAttrib, BackendAttribValue, MouseTransform, StereoMode};
|
||||
|
||||
use super::capture::{ScreenPipeline, WlxCaptureIn, WlxCaptureOut, receive_callback};
|
||||
|
||||
@@ -50,12 +50,13 @@ pub struct ScreenBackend {
|
||||
pub(super) logical_pos: Vec2,
|
||||
pub(super) logical_size: Vec2,
|
||||
pub(super) mouse_transform_original: Transform,
|
||||
mouse_transform_override: Transform,
|
||||
mouse_transform_override: MouseTransform,
|
||||
}
|
||||
|
||||
impl ScreenBackend {
|
||||
pub fn new_raw(
|
||||
name: Arc<str>,
|
||||
xr_backend: XrBackend,
|
||||
capture: Box<dyn WlxCapture<WlxCaptureIn, WlxCaptureOut>>,
|
||||
) -> Self {
|
||||
Self {
|
||||
@@ -66,11 +67,15 @@ impl ScreenBackend {
|
||||
meta: None,
|
||||
mouse_transform: Affine2::ZERO,
|
||||
interaction_transform: None,
|
||||
stereo: None,
|
||||
stereo: if matches!(xr_backend, XrBackend::OpenXR) {
|
||||
Some(StereoMode::None)
|
||||
} else {
|
||||
None
|
||||
},
|
||||
logical_pos: Vec2::ZERO,
|
||||
logical_size: Vec2::ZERO,
|
||||
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 {
|
||||
fn init(&mut self, app: &mut AppState) -> anyhow::Result<()> {
|
||||
self.stereo = if matches!(app.xr_backend, XrBackend::OpenXR) {
|
||||
Some(StereoMode::None)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
fn init(&mut self, _app: &mut AppState) -> anyhow::Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
fn should_render(&mut self, app: &mut AppState) -> anyhow::Result<ShouldRender> {
|
||||
@@ -317,7 +317,18 @@ impl OverlayBackend for ScreenBackend {
|
||||
}
|
||||
BackendAttribValue::MouseTransform(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
|
||||
}
|
||||
_ => false,
|
||||
|
||||
@@ -20,7 +20,7 @@ use wlx_capture::{
|
||||
WlxCapture,
|
||||
frame::{self as wlx_frame, DrmFormat, FrameFormat, MouseMeta, Transform, WlxFrame},
|
||||
};
|
||||
use wlx_common::config::GeneralConfig;
|
||||
use wlx_common::{config::GeneralConfig, overlays::StereoMode};
|
||||
|
||||
use crate::{
|
||||
graphics::{
|
||||
@@ -29,7 +29,7 @@ use crate::{
|
||||
upload_quad_vertices,
|
||||
},
|
||||
state::AppState,
|
||||
windowing::backend::{FrameMeta, RenderResources, StereoMode},
|
||||
windowing::backend::{FrameMeta, RenderResources},
|
||||
};
|
||||
|
||||
const CURSOR_SIZE: f32 = 16. / 1440.;
|
||||
|
||||
@@ -49,7 +49,7 @@ impl ScreenBackend {
|
||||
PipewireCapture::new(name, node_id)
|
||||
);
|
||||
Ok((
|
||||
Self::new_raw(output.name.clone(), capture),
|
||||
Self::new_raw(output.name.clone(), app.xr_backend, capture),
|
||||
select_screen_result.restore_token,
|
||||
))
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ impl ScreenBackend {
|
||||
app.gfx_extras.queue_capture,
|
||||
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> {
|
||||
@@ -36,7 +36,7 @@ impl ScreenBackend {
|
||||
app.gfx_extras.queue_capture,
|
||||
WlrScreencopyCapture::new(client, output.id)
|
||||
);
|
||||
Some(Self::new_raw(output.name.clone(), capture))
|
||||
Some(Self::new_raw(output.name.clone(), app.xr_backend, capture))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ impl ScreenBackend {
|
||||
app.gfx_extras.queue_capture,
|
||||
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(
|
||||
m.name.clone(),
|
||||
app.xr_backend,
|
||||
new_wlx_capture!(
|
||||
app.gfx_extras.queue_capture,
|
||||
PipewireCapture::new(m.name.clone(), s.node_id)
|
||||
|
||||
@@ -15,6 +15,7 @@ use wgui::gfx::{
|
||||
pipeline::{WGfxPipeline, WPipelineCreateInfo},
|
||||
};
|
||||
use wlx_capture::frame::{DmabufFrame, FourCC, FrameFormat, FramePlane};
|
||||
use wlx_common::overlays::{BackendAttrib, BackendAttribValue};
|
||||
use wlx_common::windowing::OverlayWindowState;
|
||||
|
||||
use crate::{
|
||||
@@ -33,8 +34,8 @@ use crate::{
|
||||
windowing::{
|
||||
OverlayID, OverlaySelector, Z_ORDER_DASHBOARD,
|
||||
backend::{
|
||||
BackendAttrib, BackendAttribValue, FrameMeta, OverlayBackend, OverlayEventData,
|
||||
RenderResources, ShouldRender, ui_transform,
|
||||
FrameMeta, OverlayBackend, OverlayEventData, RenderResources, ShouldRender,
|
||||
ui_transform,
|
||||
},
|
||||
manager::OverlayWindowManager,
|
||||
window::{OverlayCategory, OverlayWindowConfig, OverlayWindowData},
|
||||
|
||||
Reference in New Issue
Block a user