refactor overlay windowing

This commit is contained in:
galister
2025-10-05 18:49:59 +09:00
parent 40cc27f7b0
commit aa64310d96
46 changed files with 1329 additions and 1342 deletions

View File

@@ -1,23 +1,21 @@
use std::{
sync::{atomic::AtomicU64, Arc, LazyLock},
sync::{Arc, LazyLock, atomic::AtomicU64},
time::Instant,
};
use glam::{vec2, Affine2, Vec2};
use glam::{Affine2, Vec2, vec2};
use vulkano::image::view::ImageView;
use wlx_capture::{frame::Transform, WlxCapture};
use wlx_capture::{WlxCapture, frame::Transform};
use crate::{
backend::{
input::{Haptics, PointerHit, PointerMode},
overlay::{FrameMeta, OverlayBackend, ShouldRender},
},
backend::input::{Haptics, PointerHit, PointerMode},
graphics::{CommandBuffers, ExtentExt},
state::AppState,
subsystem::hid::{MOUSE_LEFT, MOUSE_MIDDLE, MOUSE_RIGHT},
windowing::backend::{FrameMeta, OverlayBackend, ShouldRender},
};
use super::capture::{receive_callback, ScreenPipeline, WlxCaptureIn, WlxCaptureOut};
use super::capture::{ScreenPipeline, WlxCaptureIn, WlxCaptureOut, receive_callback};
const CURSOR_SIZE: f32 = 16. / 1440.;

View File

@@ -7,28 +7,29 @@ use vulkano::{
command_buffer::CommandBufferUsage,
device::Queue,
format::Format,
image::{sampler::Filter, view::ImageView, Image},
image::{Image, sampler::Filter, view::ImageView},
pipeline::graphics::color_blend::AttachmentBlend,
};
use wgui::gfx::{
WGfx,
cmd::WGfxClearMode,
pass::WGfxPass,
pipeline::{WGfxPipeline, WPipelineCreateInfo},
WGfx,
};
use wlx_capture::{
frame::{self as wlx_frame, DrmFormat, FrameFormat, MouseMeta, Transform, WlxFrame},
WlxCapture,
frame::{self as wlx_frame, DrmFormat, FrameFormat, MouseMeta, Transform, WlxFrame},
};
use crate::{
backend::overlay::FrameMeta,
config::GeneralConfig,
graphics::{
dmabuf::{fourcc_to_vk, WGfxDmabuf},
upload_quad_vertices, CommandBuffers, Vert2Uv,
CommandBuffers, Vert2Uv,
dmabuf::{WGfxDmabuf, fourcc_to_vk},
upload_quad_vertices,
},
state::AppState,
windowing::backend::FrameMeta,
};
const CURSOR_SIZE: f32 = 16. / 1440.;

View File

@@ -1,14 +1,15 @@
use std::{f32::consts::PI, sync::Arc};
use backend::ScreenBackend;
use glam::{vec3a, Quat, Vec3};
use wl::create_screens_wayland;
use glam::{vec3, Affine3A, Quat, Vec3};
use wlx_capture::frame::Transform;
use crate::{
backend::overlay::{OverlayState, Positioning},
state::{AppSession, AppState, ScreenMeta},
subsystem::{hid::XkbKeymap, input::KeyboardFocus},
windowing::{
backend::OverlayBackend,
window::{OverlayWindowConfig, OverlayWindowState, Positioning},
},
};
pub mod backend;
@@ -20,7 +21,12 @@ pub mod wl;
#[cfg(feature = "x11")]
pub mod x11;
fn create_screen_state(name: Arc<str>, transform: Transform, session: &AppSession) -> OverlayState {
fn create_screen_from_backend(
name: Arc<str>,
transform: Transform,
session: &AppSession,
backend: Box<dyn OverlayBackend>,
) -> OverlayWindowConfig {
let angle = if session.config.upright_screen_fix {
match transform {
Transform::Rotated90 | Transform::Flipped90 => PI / 2.,
@@ -32,22 +38,27 @@ fn create_screen_state(name: Arc<str>, transform: Transform, session: &AppSessio
0.
};
OverlayState {
OverlayWindowConfig {
name,
default_state: OverlayWindowState {
grabbable: true,
positioning: Positioning::Anchored,
interactable: true,
curvature: Some(0.15),
transform: Affine3A::from_scale_rotation_translation(
Vec3::ONE * 1.5 * session.config.desktop_view_scale,
Quat::from_rotation_z(angle),
vec3(0.0, 0.2, -0.5),
),
..OverlayWindowState::default()
},
keyboard_focus: Some(KeyboardFocus::PhysicalScreen),
grabbable: true,
recenter: true,
positioning: Positioning::Anchored,
interactable: true,
spawn_scale: 1.5 * session.config.desktop_view_scale,
spawn_point: vec3a(0., 0.5, 0.),
spawn_rotation: Quat::from_axis_angle(Vec3::Z, angle),
..Default::default()
..OverlayWindowConfig::from_backend(backend)
}
}
pub struct ScreenCreateData {
pub screens: Vec<(ScreenMeta, OverlayState, Box<ScreenBackend>)>,
pub screens: Vec<(ScreenMeta, OverlayWindowConfig)>,
}
pub fn create_screens(app: &mut AppState) -> anyhow::Result<(ScreenCreateData, Option<XkbKeymap>)> {
@@ -61,7 +72,7 @@ pub fn create_screens(app: &mut AppState) -> anyhow::Result<(ScreenCreateData, O
.map_err(|f| log::warn!("Could not load keyboard layout: {f}"))
.ok();
return Ok((create_screens_wayland(&mut wl, app), keymap));
return Ok((wl::create_screens_wayland(&mut wl, app), keymap));
}
log::info!("Wayland not detected, assuming X11.");
}

View File

@@ -1,22 +1,22 @@
use glam::vec2;
use wlx_capture::{
WlxCapture,
wayland::{WlxClient, WlxOutput},
wlr_dmabuf::WlrDmabufCapture,
wlr_screencopy::WlrScreencopyCapture,
WlxCapture,
};
use crate::{
config::{AStrMapExt, PwTokenMap},
overlays::screen::create_screen_state,
overlays::screen::create_screen_from_backend,
state::{AppState, ScreenMeta},
};
use super::{
backend::ScreenBackend,
capture::{new_wlx_capture, MainThreadWlxCapture},
pw::{load_pw_token_config, save_pw_token_config},
ScreenCreateData,
backend::ScreenBackend,
capture::{MainThreadWlxCapture, new_wlx_capture},
pw::{load_pw_token_config, save_pw_token_config},
};
impl ScreenBackend {
@@ -130,15 +130,19 @@ pub fn create_screens_wayland(wl: &mut WlxClient, app: &mut AppState) -> ScreenC
backend.set_mouse_transform(logical_pos, logical_size, transform);
let state = create_screen_state(output.name.clone(), transform, &app.session);
let window_config = create_screen_from_backend(
output.name.clone(),
transform,
&app.session,
Box::new(backend),
);
let meta = ScreenMeta {
name: wl.outputs[id].name.clone(),
native_handle: *id,
};
let backend = Box::new(backend);
screens.push((meta, state, backend));
screens.push((meta, window_config));
}
}

View File

@@ -2,20 +2,20 @@ use std::sync::Arc;
use glam::vec2;
use wlx_capture::{
WlxCapture,
frame::Transform,
xshm::{XshmCapture, XshmScreen},
WlxCapture,
};
use crate::{
overlays::screen::create_screen_state,
overlays::screen::create_screen_from_backend,
state::{AppState, ScreenMeta},
};
use super::{
backend::ScreenBackend,
capture::{new_wlx_capture, MainThreadWlxCapture},
ScreenCreateData,
backend::ScreenBackend,
capture::{MainThreadWlxCapture, new_wlx_capture},
};
#[cfg(feature = "pipewire")]
@@ -39,7 +39,7 @@ pub fn create_screens_x11pw(app: &mut AppState) -> anyhow::Result<ScreenCreateDa
use crate::{
config::{AStrMapExt, PwTokenMap},
overlays::screen::{
create_screen_state,
create_screen_from_backend,
pw::{load_pw_token_config, save_pw_token_config, select_pw_screen},
},
state::ScreenMeta,
@@ -108,15 +108,19 @@ pub fn create_screens_x11pw(app: &mut AppState) -> anyhow::Result<ScreenCreateDa
Transform::Normal,
);
let state = create_screen_state(m.name.clone(), Transform::Normal, &app.session);
let window_data = create_screen_from_backend(
m.name.clone(),
Transform::Normal,
&app.session,
Box::new(backend),
);
let meta = ScreenMeta {
name: m.name.clone(),
native_handle: 0,
};
let backend = Box::new(backend);
(meta, state, backend)
(meta, window_data)
})
.collect();
@@ -189,15 +193,19 @@ pub fn create_screens_xshm(app: &mut AppState) -> anyhow::Result<ScreenCreateDat
Transform::Normal,
);
let state = create_screen_state(s.name.clone(), Transform::Normal, &app.session);
let window_data = create_screen_from_backend(
s.name.clone(),
Transform::Normal,
&app.session,
Box::new(backend),
);
let meta = ScreenMeta {
name: s.name.clone(),
native_handle: 0,
};
let backend = Box::new(backend);
(meta, state, backend)
(meta, window_data)
})
.collect();