From 74257f4c424ad290439337195387bbee3253584b Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Mon, 5 Feb 2024 02:07:03 +0100 Subject: [PATCH] xshm experiment --- Cargo.lock | 10 +++--- src/backend/common.rs | 2 +- src/overlays/screen.rs | 70 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9227eda..0edb842 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4175,7 +4175,7 @@ dependencies = [ [[package]] name = "wlx-capture" version = "0.1.0" -source = "git+https://github.com/galister/wlx-capture#19fe836043dca52f273a4c487780608c5f56b157" +source = "git+https://github.com/galister/wlx-capture#e7e5217414b716e433fe2d00d8674b46fc10effb" dependencies = [ "ashpd", "drm-fourcc", @@ -4352,9 +4352,9 @@ dependencies = [ [[package]] name = "zbus" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "c45d06ae3b0f9ba1fb2671268b975557d8f5a84bb5ec6e43964f87e763d8bca8" dependencies = [ "async-broadcast", "async-executor", @@ -4393,9 +4393,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "b4a1ba45ed0ad344b85a2bb5a1fe9830aed23d67812ea39a586e7d0136439c7d" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", diff --git a/src/backend/common.rs b/src/backend/common.rs index 97d1935..1c21a0a 100644 --- a/src/backend/common.rs +++ b/src/backend/common.rs @@ -43,7 +43,7 @@ where let (screens, extent) = if std::env::var("WAYLAND_DISPLAY").is_ok() { get_screens_wayland(&app.session) } else { - get_screens_x11() + get_screens_x11(&app.session) }; let mut watch = create_watch::(&app, &screens); diff --git a/src/overlays/screen.rs b/src/overlays/screen.rs index ab6ddd3..768e5ba 100644 --- a/src/overlays/screen.rs +++ b/src/overlays/screen.rs @@ -19,6 +19,7 @@ use wlx_capture::{ pipewire::{pipewire_select_screen, PipewireCapture}, wayland::{wayland_client::protocol::wl_output::Transform, WlxClient, WlxOutput}, wlr_dmabuf::WlrDmabufCapture, + xshm::{XshmCapture, XshmScreen}, WlxCapture, }; @@ -158,6 +159,18 @@ impl ScreenRenderer { extent: extent_from_res(output.size), }) } + + pub fn new_xshm(screen: Arc) -> Option { + let capture = XshmCapture::new(screen.clone()); + + Some(ScreenRenderer { + name: screen.name.clone(), + capture: Box::new(capture), + receiver: None, + last_view: None, + extent: extent_from_res((screen.monitor.width(), screen.monitor.height())), + }) + } } impl OverlayRenderer for ScreenRenderer { @@ -466,11 +479,64 @@ where (overlays, Vec2::new(extent.0 as f32, extent.1 as f32)) } -pub fn get_screens_x11() -> (Vec>, Vec2) +pub fn get_screens_x11(session: &AppSession) -> (Vec>, Vec2) where O: Default, { - todo!() + let mut extent = vec2(0., 0.); + + let overlays = XshmCapture::get_monitors() + .into_iter() + .map(|s| { + log::info!( + "{}: Res {}x{}, Pos {}x{}", + s.name, + s.monitor.width(), + s.monitor.height(), + s.monitor.x(), + s.monitor.y() + ); + let size = (s.monitor.width(), s.monitor.height()); + let capture: ScreenRenderer = ScreenRenderer::new_xshm(s.clone()).unwrap(); + + let backend = Box::new(SplitOverlayBackend { + renderer: Box::new(capture), + interaction: Box::new(ScreenInteractionHandler::new( + vec2(s.monitor.x() as f32, s.monitor.y() as f32), + vec2(s.monitor.width() as f32, s.monitor.height() as f32), + Transform::Normal, + )), + }); + + let interaction_transform = Affine2::from_translation(Vec2 { x: 0.5, y: 0.5 }) + * Affine2::from_scale(Vec2 { + x: 1., + y: -size.0 as f32 / size.1 as f32, + }); + + extent.x = extent.x.max((s.monitor.x() + s.monitor.width()) as f32); + extent.y = extent.y.max((s.monitor.y() + s.monitor.height()) as f32); + OverlayData { + state: OverlayState { + name: s.name.clone(), + size, + want_visible: session.show_screens.iter().any(|x| x == &*s.name), + grabbable: true, + recenter: true, + interactable: true, + spawn_scale: 1.5 * session.config.desktop_view_scale, + spawn_point: vec3a(0., 0.5, -1.), + spawn_rotation: Quat::IDENTITY, + interaction_transform, + ..Default::default() + }, + backend, + ..Default::default() + } + }) + .collect(); + + (overlays, extent) } fn extent_from_res(res: (i32, i32)) -> [u32; 3] {