persist BackendAttrib across sessions
This commit is contained in:
@@ -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>,
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
use wlx_capture::frame::Transform;
|
use crate::overlays::edit::{
|
||||||
|
|
||||||
use crate::{
|
|
||||||
overlays::edit::{
|
|
||||||
EditModeWrapPanel,
|
EditModeWrapPanel,
|
||||||
sprite_tab::{SpriteTabHandler, SpriteTabKey},
|
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}")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"];
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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| {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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.;
|
||||||
|
|||||||
@@ -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,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
@@ -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>,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user