xshm experiment
This commit is contained in:
10
Cargo.lock
generated
10
Cargo.lock
generated
@@ -4175,7 +4175,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "wlx-capture"
|
name = "wlx-capture"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/galister/wlx-capture#19fe836043dca52f273a4c487780608c5f56b157"
|
source = "git+https://github.com/galister/wlx-capture#e7e5217414b716e433fe2d00d8674b46fc10effb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ashpd",
|
"ashpd",
|
||||||
"drm-fourcc",
|
"drm-fourcc",
|
||||||
@@ -4352,9 +4352,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zbus"
|
name = "zbus"
|
||||||
version = "3.14.1"
|
version = "3.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948"
|
checksum = "c45d06ae3b0f9ba1fb2671268b975557d8f5a84bb5ec6e43964f87e763d8bca8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-broadcast",
|
"async-broadcast",
|
||||||
"async-executor",
|
"async-executor",
|
||||||
@@ -4393,9 +4393,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zbus_macros"
|
name = "zbus_macros"
|
||||||
version = "3.14.1"
|
version = "3.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d"
|
checksum = "b4a1ba45ed0ad344b85a2bb5a1fe9830aed23d67812ea39a586e7d0136439c7d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro-crate 1.3.1",
|
"proc-macro-crate 1.3.1",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ where
|
|||||||
let (screens, extent) = if std::env::var("WAYLAND_DISPLAY").is_ok() {
|
let (screens, extent) = if std::env::var("WAYLAND_DISPLAY").is_ok() {
|
||||||
get_screens_wayland(&app.session)
|
get_screens_wayland(&app.session)
|
||||||
} else {
|
} else {
|
||||||
get_screens_x11()
|
get_screens_x11(&app.session)
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut watch = create_watch::<T>(&app, &screens);
|
let mut watch = create_watch::<T>(&app, &screens);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ use wlx_capture::{
|
|||||||
pipewire::{pipewire_select_screen, PipewireCapture},
|
pipewire::{pipewire_select_screen, PipewireCapture},
|
||||||
wayland::{wayland_client::protocol::wl_output::Transform, WlxClient, WlxOutput},
|
wayland::{wayland_client::protocol::wl_output::Transform, WlxClient, WlxOutput},
|
||||||
wlr_dmabuf::WlrDmabufCapture,
|
wlr_dmabuf::WlrDmabufCapture,
|
||||||
|
xshm::{XshmCapture, XshmScreen},
|
||||||
WlxCapture,
|
WlxCapture,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -158,6 +159,18 @@ impl ScreenRenderer {
|
|||||||
extent: extent_from_res(output.size),
|
extent: extent_from_res(output.size),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_xshm(screen: Arc<XshmScreen>) -> Option<ScreenRenderer> {
|
||||||
|
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 {
|
impl OverlayRenderer for ScreenRenderer {
|
||||||
@@ -466,11 +479,64 @@ where
|
|||||||
(overlays, Vec2::new(extent.0 as f32, extent.1 as f32))
|
(overlays, Vec2::new(extent.0 as f32, extent.1 as f32))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_screens_x11<O>() -> (Vec<OverlayData<O>>, Vec2)
|
pub fn get_screens_x11<O>(session: &AppSession) -> (Vec<OverlayData<O>>, Vec2)
|
||||||
where
|
where
|
||||||
O: Default,
|
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] {
|
fn extent_from_res(res: (i32, i32)) -> [u32; 3] {
|
||||||
|
|||||||
Reference in New Issue
Block a user