chore: Update smithay

This commit is contained in:
Victoria Brekenfeld 2026-01-22 16:10:57 +01:00 committed by Ian Douglas Scott
parent ce5ac893a4
commit 53e0db28ac
10 changed files with 378 additions and 40 deletions

View file

@ -11,7 +11,7 @@ use smithay::{
input::KeyState,
renderer::{
element::{
Element, RenderElement, UnderlyingStorage,
Element, Kind, RenderElement, UnderlyingStorage,
memory::MemoryRenderBufferRenderElement,
utils::{CropRenderElement, RelocateRenderElement, RescaleRenderElement},
},
@ -30,6 +30,7 @@ use smithay::{
space_elements,
utils::{
Buffer as BufferCoords, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size,
user_data::UserDataMap,
},
wayland::seat::WaylandFocus,
xwayland::{X11Surface, xwm::X11Relatable},
@ -1282,6 +1283,44 @@ where
CosmicMappedRenderElement::Egui(elem) => elem.alpha(),
}
}
fn kind(&self) -> Kind {
match self {
CosmicMappedRenderElement::Stack(elem) => elem.kind(),
CosmicMappedRenderElement::Window(elem) => elem.kind(),
CosmicMappedRenderElement::TiledStack(elem) => elem.kind(),
CosmicMappedRenderElement::TiledWindow(elem) => elem.kind(),
CosmicMappedRenderElement::TiledOverlay(elem) => elem.kind(),
CosmicMappedRenderElement::MovingStack(elem) => elem.kind(),
CosmicMappedRenderElement::MovingWindow(elem) => elem.kind(),
CosmicMappedRenderElement::GrabbedStack(elem) => elem.kind(),
CosmicMappedRenderElement::GrabbedWindow(elem) => elem.kind(),
CosmicMappedRenderElement::FocusIndicator(elem) => elem.kind(),
CosmicMappedRenderElement::Overlay(elem) => elem.kind(),
CosmicMappedRenderElement::StackHoverIndicator(elem) => elem.kind(),
#[cfg(feature = "debug")]
CosmicMappedRenderElement::Egui(elem) => elem.kind(),
}
}
fn is_framebuffer_effect(&self) -> bool {
match self {
CosmicMappedRenderElement::Stack(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::Window(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::TiledStack(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::TiledWindow(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::TiledOverlay(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::MovingStack(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::MovingWindow(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::GrabbedStack(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::GrabbedWindow(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::FocusIndicator(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::Overlay(elem) => elem.is_framebuffer_effect(),
CosmicMappedRenderElement::StackHoverIndicator(elem) => elem.is_framebuffer_effect(),
#[cfg(feature = "debug")]
CosmicMappedRenderElement::Egui(elem) => elem.is_framebuffer_effect(),
}
}
}
impl<R> RenderElement<R> for CosmicMappedRenderElement<R>
@ -1297,19 +1336,20 @@ where
dst: Rectangle<i32, Physical>,
damage: &[Rectangle<i32, Physical>],
opaque_regions: &[Rectangle<i32, Physical>],
cache: Option<&UserDataMap>,
) -> Result<(), R::Error> {
match self {
CosmicMappedRenderElement::Stack(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::Window(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::TiledStack(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::TiledWindow(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::TiledOverlay(elem) => RenderElement::<GlowRenderer>::draw(
elem,
@ -1318,19 +1358,20 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error),
CosmicMappedRenderElement::MovingStack(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::MovingWindow(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::GrabbedStack(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::GrabbedWindow(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicMappedRenderElement::FocusIndicator(elem) => RenderElement::<GlowRenderer>::draw(
elem,
@ -1339,6 +1380,7 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error),
CosmicMappedRenderElement::Overlay(elem) => RenderElement::<GlowRenderer>::draw(
@ -1348,10 +1390,11 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error),
CosmicMappedRenderElement::StackHoverIndicator(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
#[cfg(feature = "debug")]
CosmicMappedRenderElement::Egui(elem) => {
@ -1363,6 +1406,7 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
@ -1398,6 +1442,82 @@ where
}
}
}
fn capture_framebuffer(
&self,
frame: &mut R::Frame<'_, '_>,
src: Rectangle<f64, BufferCoords>,
dst: Rectangle<i32, Physical>,
cache: &UserDataMap,
) -> Result<(), R::Error> {
match self {
CosmicMappedRenderElement::Stack(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::Window(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::TiledStack(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::TiledWindow(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::TiledOverlay(elem) => {
RenderElement::<GlowRenderer>::capture_framebuffer(
elem,
R::glow_frame_mut(frame),
src,
dst,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicMappedRenderElement::MovingStack(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::MovingWindow(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::GrabbedStack(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::GrabbedWindow(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicMappedRenderElement::FocusIndicator(elem) => {
RenderElement::<GlowRenderer>::capture_framebuffer(
elem,
R::glow_frame_mut(frame),
src,
dst,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicMappedRenderElement::Overlay(elem) => {
RenderElement::<GlowRenderer>::capture_framebuffer(
elem,
R::glow_frame_mut(frame),
src,
dst,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicMappedRenderElement::StackHoverIndicator(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
#[cfg(feature = "debug")]
CosmicMappedRenderElement::Egui(elem) => {
let glow_frame = R::glow_frame_mut(frame);
RenderElement::<GlowRenderer>::capture_framebuffer(
elem, glow_frame, src, dst, cache,
)
.map_err(FromGlesError::from_gles_error)
}
}
}
}
impl<R> From<stack::CosmicStackRenderElement<R>> for CosmicMappedRenderElement<R>

View file

@ -67,7 +67,10 @@ use smithay::{
},
output::Output,
reexports::wayland_server::protocol::wl_surface::WlSurface,
utils::{Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size, Transform},
utils::{
Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size, Transform,
user_data::UserDataMap,
},
wayland::seat::WaylandFocus,
};
use std::{
@ -1995,6 +1998,16 @@ where
CosmicStackRenderElement::Clipped(elem) => elem.kind(),
}
}
fn is_framebuffer_effect(&self) -> bool {
match self {
CosmicStackRenderElement::Header(elem) => elem.is_framebuffer_effect(),
CosmicStackRenderElement::Shadow(elem) => elem.is_framebuffer_effect(),
CosmicStackRenderElement::Border(elem) => elem.is_framebuffer_effect(),
CosmicStackRenderElement::Window(elem) => elem.is_framebuffer_effect(),
CosmicStackRenderElement::Clipped(elem) => elem.is_framebuffer_effect(),
}
}
}
impl<R> RenderElement<R> for CosmicStackRenderElement<R>
@ -2010,10 +2023,11 @@ where
dst: Rectangle<i32, Physical>,
damage: &[Rectangle<i32, Physical>],
opaque_regions: &[Rectangle<i32, Physical>],
cache: Option<&UserDataMap>,
) -> Result<(), <R>::Error> {
match self {
CosmicStackRenderElement::Header(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicStackRenderElement::Shadow(elem) | CosmicStackRenderElement::Border(elem) => {
RenderElement::<GlowRenderer>::draw(
@ -2023,14 +2037,15 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicStackRenderElement::Window(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicStackRenderElement::Clipped(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
}
}
@ -2045,4 +2060,34 @@ where
CosmicStackRenderElement::Clipped(elem) => elem.underlying_storage(renderer),
}
}
fn capture_framebuffer(
&self,
frame: &mut R::Frame<'_, '_>,
src: Rectangle<f64, Buffer>,
dst: Rectangle<i32, Physical>,
cache: &UserDataMap,
) -> Result<(), <R>::Error> {
match self {
CosmicStackRenderElement::Header(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicStackRenderElement::Shadow(elem) | CosmicStackRenderElement::Border(elem) => {
RenderElement::<GlowRenderer>::capture_framebuffer(
elem,
R::glow_frame_mut(frame),
src,
dst,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicStackRenderElement::Window(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicStackRenderElement::Clipped(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
}
}
}

View file

@ -53,7 +53,10 @@ use smithay::{
},
output::Output,
reexports::wayland_server::protocol::wl_surface::WlSurface,
utils::{Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size, Transform},
utils::{
Buffer, IsAlive, Logical, Physical, Point, Rectangle, Scale, Serial, Size, Transform,
user_data::UserDataMap,
},
wayland::seat::WaylandFocus,
};
use std::{
@ -1366,6 +1369,16 @@ where
CosmicWindowRenderElement::Clipped(elem) => elem.kind(),
}
}
fn is_framebuffer_effect(&self) -> bool {
match self {
CosmicWindowRenderElement::Header(elem) => elem.is_framebuffer_effect(),
CosmicWindowRenderElement::Shadow(elem) => elem.is_framebuffer_effect(),
CosmicWindowRenderElement::Border(elem) => elem.is_framebuffer_effect(),
CosmicWindowRenderElement::Window(elem) => elem.is_framebuffer_effect(),
CosmicWindowRenderElement::Clipped(elem) => elem.is_framebuffer_effect(),
}
}
}
impl<R> RenderElement<R> for CosmicWindowRenderElement<R>
@ -1381,10 +1394,11 @@ where
dst: Rectangle<i32, Physical>,
damage: &[Rectangle<i32, Physical>],
opaque_regions: &[Rectangle<i32, Physical>],
cache: Option<&UserDataMap>,
) -> Result<(), <R>::Error> {
match self {
CosmicWindowRenderElement::Header(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicWindowRenderElement::Shadow(elem) | CosmicWindowRenderElement::Border(elem) => {
RenderElement::<GlowRenderer>::draw(
@ -1394,14 +1408,15 @@ where
dst,
damage,
opaque_regions,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicWindowRenderElement::Window(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
CosmicWindowRenderElement::Clipped(elem) => {
elem.draw(frame, src, dst, damage, opaque_regions)
elem.draw(frame, src, dst, damage, opaque_regions, cache)
}
}
}
@ -1416,4 +1431,34 @@ where
CosmicWindowRenderElement::Clipped(elem) => elem.underlying_storage(renderer),
}
}
fn capture_framebuffer(
&self,
frame: &mut <R>::Frame<'_, '_>,
src: Rectangle<f64, Buffer>,
dst: Rectangle<i32, Physical>,
cache: &UserDataMap,
) -> Result<(), <R>::Error> {
match self {
CosmicWindowRenderElement::Header(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicWindowRenderElement::Shadow(elem) | CosmicWindowRenderElement::Border(elem) => {
RenderElement::<GlowRenderer>::capture_framebuffer(
elem,
R::glow_frame_mut(frame),
src,
dst,
cache,
)
.map_err(FromGlesError::from_gles_error)
}
CosmicWindowRenderElement::Window(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
CosmicWindowRenderElement::Clipped(elem) => {
elem.capture_framebuffer(frame, src, dst, cache)
}
}
}
}