tiling: Animate tree changes
This commit is contained in:
parent
ea1b976076
commit
331b884f1e
23 changed files with 1641 additions and 395 deletions
|
|
@ -11,7 +11,10 @@ use smithay::{
|
|||
backend::{
|
||||
input::KeyState,
|
||||
renderer::{
|
||||
element::{AsRenderElements, Element, RenderElement, UnderlyingStorage},
|
||||
element::{
|
||||
utils::CropRenderElement, AsRenderElements, Element, RenderElement,
|
||||
UnderlyingStorage,
|
||||
},
|
||||
gles::element::PixelShaderElement,
|
||||
glow::GlowRenderer,
|
||||
multigpu::Error as MultiError,
|
||||
|
|
@ -418,15 +421,17 @@ impl CosmicMapped {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn configure(&self) {
|
||||
for window in match &self.element {
|
||||
pub fn configure(&self) -> Option<Serial> {
|
||||
match &self.element {
|
||||
CosmicMappedInternal::Stack(s) => {
|
||||
Box::new(s.surfaces()) as Box<dyn Iterator<Item = CosmicSurface>>
|
||||
let active = s.active();
|
||||
for surface in s.surfaces().filter(|s| s != &active) {
|
||||
surface.send_configure();
|
||||
}
|
||||
active.send_configure()
|
||||
}
|
||||
CosmicMappedInternal::Window(w) => Box::new(std::iter::once(w.surface())),
|
||||
CosmicMappedInternal::Window(w) => w.surface().send_configure(),
|
||||
_ => unreachable!(),
|
||||
} {
|
||||
window.send_configure();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -676,6 +681,8 @@ where
|
|||
{
|
||||
Stack(self::stack::CosmicStackRenderElement<R>),
|
||||
Window(self::window::CosmicWindowRenderElement<R>),
|
||||
CroppedStack(CropRenderElement<self::stack::CosmicStackRenderElement<R>>),
|
||||
CroppedWindow(CropRenderElement<self::window::CosmicWindowRenderElement<R>>),
|
||||
Indicator(PixelShaderElement),
|
||||
#[cfg(feature = "debug")]
|
||||
Egui(TextureRenderElement<GlesTexture>),
|
||||
|
|
@ -690,6 +697,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.id(),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.id(),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.id(),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.id(),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.id(),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.id(),
|
||||
|
|
@ -700,6 +709,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.current_commit(),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.current_commit(),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.current_commit(),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.current_commit(),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.current_commit(),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.current_commit(),
|
||||
|
|
@ -710,6 +721,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.src(),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.src(),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.src(),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.src(),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.src(),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.src(),
|
||||
|
|
@ -720,6 +733,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.geometry(scale),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.geometry(scale),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.geometry(scale),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.geometry(scale),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.geometry(scale),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.geometry(scale),
|
||||
|
|
@ -730,6 +745,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.location(scale),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.location(scale),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.location(scale),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.location(scale),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.location(scale),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.location(scale),
|
||||
|
|
@ -740,6 +757,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.transform(),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.transform(),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.transform(),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.transform(),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.transform(),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.transform(),
|
||||
|
|
@ -754,6 +773,8 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.damage_since(scale, commit),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.damage_since(scale, commit),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.damage_since(scale, commit),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.damage_since(scale, commit),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.damage_since(scale, commit),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.damage_since(scale, commit),
|
||||
|
|
@ -764,11 +785,25 @@ where
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.opaque_regions(scale),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.opaque_regions(scale),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.opaque_regions(scale),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.opaque_regions(scale),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.opaque_regions(scale),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.opaque_regions(scale),
|
||||
}
|
||||
}
|
||||
|
||||
fn alpha(&self) -> f32 {
|
||||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.alpha(),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.alpha(),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.alpha(),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.alpha(),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.alpha(),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.alpha(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl RenderElement<GlowRenderer> for CosmicMappedRenderElement<GlowRenderer> {
|
||||
|
|
@ -782,6 +817,8 @@ impl RenderElement<GlowRenderer> for CosmicMappedRenderElement<GlowRenderer> {
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::Indicator(elem) => {
|
||||
RenderElement::<GlowRenderer>::draw(elem, frame, src, dst, damage)
|
||||
}
|
||||
|
|
@ -796,6 +833,8 @@ impl RenderElement<GlowRenderer> for CosmicMappedRenderElement<GlowRenderer> {
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::Indicator(elem) => elem.underlying_storage(renderer),
|
||||
#[cfg(feature = "debug")]
|
||||
CosmicMappedRenderElement::Egui(elem) => elem.underlying_storage(renderer),
|
||||
|
|
@ -816,6 +855,8 @@ impl<'a, 'b> RenderElement<GlMultiRenderer<'a, 'b>>
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.draw(frame, src, dst, damage),
|
||||
CosmicMappedRenderElement::Indicator(elem) => {
|
||||
RenderElement::<GlowRenderer>::draw(elem, frame.glow_frame_mut(), src, dst, damage)
|
||||
.map_err(|err| MultiError::Render(err))
|
||||
|
|
@ -836,6 +877,8 @@ impl<'a, 'b> RenderElement<GlMultiRenderer<'a, 'b>>
|
|||
match self {
|
||||
CosmicMappedRenderElement::Stack(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::Window(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::CroppedStack(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::CroppedWindow(elem) => elem.underlying_storage(renderer),
|
||||
CosmicMappedRenderElement::Indicator(elem) => {
|
||||
elem.underlying_storage(renderer.glow_renderer_mut())
|
||||
}
|
||||
|
|
@ -910,6 +953,7 @@ where
|
|||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
) -> Vec<C> {
|
||||
#[cfg(feature = "debug")]
|
||||
let mut elements = if let Some(debug) = self.debug.lock().unwrap().as_mut() {
|
||||
|
|
@ -1080,12 +1124,12 @@ where
|
|||
CosmicMappedInternal::Stack(s) => {
|
||||
elements.extend(AsRenderElements::<R>::render_elements::<
|
||||
CosmicMappedRenderElement<R>,
|
||||
>(s, renderer, location, scale))
|
||||
>(s, renderer, location, scale, alpha))
|
||||
}
|
||||
CosmicMappedInternal::Window(w) => {
|
||||
elements.extend(AsRenderElements::<R>::render_elements::<
|
||||
CosmicMappedRenderElement<R>,
|
||||
>(w, renderer, location, scale))
|
||||
>(w, renderer, location, scale, alpha))
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -604,9 +604,10 @@ where
|
|||
renderer: &mut R,
|
||||
mut location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
) -> Vec<C> {
|
||||
let mut elements = AsRenderElements::<R>::render_elements::<CosmicStackRenderElement<R>>(
|
||||
&self.0, renderer, location, scale,
|
||||
&self.0, renderer, location, scale, alpha,
|
||||
);
|
||||
location.y += TAB_HEIGHT;
|
||||
|
||||
|
|
@ -616,6 +617,7 @@ where
|
|||
renderer,
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
);
|
||||
elements
|
||||
}));
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ use smithay::{
|
|||
wayland_server::protocol::wl_surface::WlSurface,
|
||||
},
|
||||
space_elements,
|
||||
utils::{user_data::UserDataMap, Logical, Rectangle, Size},
|
||||
utils::{user_data::UserDataMap, Logical, Rectangle, Serial, Size},
|
||||
wayland::{
|
||||
compositor::{with_states, SurfaceData},
|
||||
seat::WaylandFocus,
|
||||
|
|
@ -345,11 +345,44 @@ impl CosmicSurface {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn send_configure(&self) {
|
||||
pub fn serial_acked(&self, serial: &Serial) -> bool {
|
||||
match self {
|
||||
CosmicSurface::Wayland(window) => window.toplevel().send_configure(),
|
||||
CosmicSurface::Wayland(window) => {
|
||||
with_states(window.toplevel().wl_surface(), |states| {
|
||||
let attrs = states
|
||||
.data_map
|
||||
.get::<XdgToplevelSurfaceData>()
|
||||
.unwrap()
|
||||
.lock()
|
||||
.unwrap();
|
||||
attrs
|
||||
.configure_serial
|
||||
.as_ref()
|
||||
.map(|s| s >= serial)
|
||||
.unwrap_or(false)
|
||||
})
|
||||
}
|
||||
_ => true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn force_configure(&self) -> Option<Serial> {
|
||||
match self {
|
||||
CosmicSurface::Wayland(window) => Some(window.toplevel().send_configure()),
|
||||
CosmicSurface::X11(surface) => {
|
||||
let _ = surface.configure(None);
|
||||
None
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn send_configure(&self) -> Option<Serial> {
|
||||
match self {
|
||||
CosmicSurface::Wayland(window) => window.toplevel().send_pending_configure(),
|
||||
CosmicSurface::X11(surface) => {
|
||||
let _ = surface.configure(None);
|
||||
None
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
|
@ -675,10 +708,15 @@ where
|
|||
renderer: &mut R,
|
||||
location: smithay::utils::Point<i32, smithay::utils::Physical>,
|
||||
scale: smithay::utils::Scale<f64>,
|
||||
alpha: f32,
|
||||
) -> Vec<C> {
|
||||
match self {
|
||||
CosmicSurface::Wayland(window) => window.render_elements(renderer, location, scale),
|
||||
CosmicSurface::X11(surface) => surface.render_elements(renderer, location, scale),
|
||||
CosmicSurface::Wayland(window) => {
|
||||
window.render_elements(renderer, location, scale, alpha)
|
||||
}
|
||||
CosmicSurface::X11(surface) => {
|
||||
surface.render_elements(renderer, location, scale, alpha)
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -640,6 +640,13 @@ where
|
|||
CosmicWindowRenderElement::Window(w) => w.opaque_regions(scale),
|
||||
}
|
||||
}
|
||||
|
||||
fn alpha(&self) -> f32 {
|
||||
match self {
|
||||
CosmicWindowRenderElement::Header(h) => h.alpha(),
|
||||
CosmicWindowRenderElement::Window(w) => w.alpha(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl RenderElement<GlowRenderer> for CosmicWindowRenderElement<GlowRenderer> {
|
||||
|
|
@ -710,6 +717,7 @@ where
|
|||
renderer: &mut R,
|
||||
location: Point<i32, Physical>,
|
||||
scale: Scale<f64>,
|
||||
alpha: f32,
|
||||
) -> Vec<C> {
|
||||
let has_ssd = self.0.with_program(|p| p.has_ssd());
|
||||
|
||||
|
|
@ -721,14 +729,18 @@ where
|
|||
|
||||
let mut elements = self.0.with_program(|p| {
|
||||
AsRenderElements::<R>::render_elements::<CosmicWindowRenderElement<R>>(
|
||||
&p.window, renderer, window_loc, scale,
|
||||
&p.window, renderer, window_loc, scale, alpha,
|
||||
)
|
||||
});
|
||||
if has_ssd {
|
||||
elements.extend(AsRenderElements::<GlowRenderer>::render_elements::<
|
||||
CosmicWindowRenderElement<R>,
|
||||
>(
|
||||
&self.0, renderer.glow_renderer_mut(), location, scale
|
||||
&self.0,
|
||||
renderer.glow_renderer_mut(),
|
||||
location,
|
||||
scale,
|
||||
alpha,
|
||||
))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ impl MoveGrabState {
|
|||
renderer,
|
||||
Rectangle::from_loc_and_size(render_location, self.window.geometry().size),
|
||||
self.indicator_thickness,
|
||||
1.0,
|
||||
))
|
||||
.into(),
|
||||
);
|
||||
|
|
@ -77,6 +78,7 @@ impl MoveGrabState {
|
|||
renderer,
|
||||
(render_location - self.window.geometry().loc).to_physical_precise_round(scale),
|
||||
scale,
|
||||
1.0,
|
||||
));
|
||||
elements
|
||||
}
|
||||
|
|
@ -266,7 +268,7 @@ impl MoveSurfaceGrab {
|
|||
.active_space_mut(&output)
|
||||
.floating_layer
|
||||
.map_internal(grab_state.window, &output, Some(window_location + offset));
|
||||
|
||||
|
||||
let pointer_pos = handle.current_location();
|
||||
let relative_pos = state.common.shell.map_global_to_space(pointer_pos, &output);
|
||||
Some(window_location + offset + (pointer_pos - relative_pos).to_i32_round())
|
||||
|
|
@ -282,7 +284,10 @@ impl MoveSurfaceGrab {
|
|||
if let Some(position) = position {
|
||||
handle.motion(
|
||||
state,
|
||||
Some((PointerFocusTarget::from(self.window.clone()), position - self.window.geometry().loc)),
|
||||
Some((
|
||||
PointerFocusTarget::from(self.window.clone()),
|
||||
position - self.window.geometry().loc,
|
||||
)),
|
||||
&MotionEvent {
|
||||
location: handle.current_location(),
|
||||
serial: serial,
|
||||
|
|
|
|||
|
|
@ -374,6 +374,7 @@ impl FloatingLayout {
|
|||
renderer,
|
||||
render_location.to_physical_precise_round(output_scale),
|
||||
output_scale.into(),
|
||||
1.0,
|
||||
);
|
||||
if focused == Some(elem) {
|
||||
if indicator_thickness > 0 {
|
||||
|
|
@ -384,6 +385,7 @@ impl FloatingLayout {
|
|||
elem.geometry().size,
|
||||
),
|
||||
indicator_thickness,
|
||||
1.0,
|
||||
);
|
||||
elements.insert(0, element.into());
|
||||
}
|
||||
|
|
|
|||
65
src/shell/layout/tiling/blocker.rs
Normal file
65
src/shell/layout/tiling/blocker.rs
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
use crate::{
|
||||
shell::element::CosmicSurface, state::Data,
|
||||
wayland::handlers::compositor::client_compositor_state,
|
||||
};
|
||||
use calloop::LoopHandle;
|
||||
use smithay::{
|
||||
reexports::wayland_server::{backend::ClientId, Client, Resource},
|
||||
utils::Serial,
|
||||
wayland::{
|
||||
compositor::{Blocker, BlockerState},
|
||||
seat::WaylandFocus,
|
||||
},
|
||||
};
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct TilingBlocker {
|
||||
pub necessary_acks: Vec<(CosmicSurface, Serial)>,
|
||||
start: Instant,
|
||||
}
|
||||
|
||||
impl Blocker for TilingBlocker {
|
||||
fn state(&self) -> BlockerState {
|
||||
if self.is_ready() {
|
||||
BlockerState::Released
|
||||
} else {
|
||||
BlockerState::Pending
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl TilingBlocker {
|
||||
pub fn new(configures: impl IntoIterator<Item = (CosmicSurface, Serial)>) -> Self {
|
||||
TilingBlocker {
|
||||
necessary_acks: configures.into_iter().collect(),
|
||||
start: Instant::now(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_ready(&self) -> bool {
|
||||
Instant::now().duration_since(self.start) >= Duration::from_millis(200)
|
||||
|| self
|
||||
.necessary_acks
|
||||
.iter()
|
||||
.all(|(surf, serial)| surf.serial_acked(serial))
|
||||
}
|
||||
|
||||
pub fn signal_ready(&self, handle: &LoopHandle<'static, Data>) {
|
||||
let clients = self
|
||||
.necessary_acks
|
||||
.iter()
|
||||
.flat_map(|(surface, _)| surface.wl_surface().and_then(|s| s.client()))
|
||||
.map(|client| (client.id(), client))
|
||||
.collect::<HashMap<ClientId, Client>>();
|
||||
handle.insert_idle(move |data| {
|
||||
let dh = data.display.handle();
|
||||
for client in clients.values() {
|
||||
client_compositor_state(&client).blocker_cleared(&mut data.state, &dh);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,8 @@ impl PointerGrab<State> for ResizeForkGrab {
|
|||
|
||||
if let Some(output) = self.output.upgrade() {
|
||||
let tiling_layer = &mut data.common.shell.active_space_mut(&output).tiling_layer;
|
||||
if let Some(tree) = tiling_layer.trees.get_mut(&output) {
|
||||
if let Some(queue) = tiling_layer.queues.get_mut(&output) {
|
||||
let tree = &mut queue.trees.back_mut().unwrap().0;
|
||||
if tree.get(&self.node).is_ok() {
|
||||
let orientation = tree.get(&self.node).unwrap().data().orientation();
|
||||
let delta = match orientation {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,3 +1,4 @@
|
|||
use calloop::LoopHandle;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::{cell::RefCell, collections::HashMap};
|
||||
use tracing::warn;
|
||||
|
|
@ -1036,6 +1037,18 @@ impl Shell {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn animations_going(&self) -> bool {
|
||||
self.workspaces
|
||||
.spaces()
|
||||
.any(|workspace| workspace.animations_going())
|
||||
}
|
||||
|
||||
pub fn update_animations(&mut self, handle: &LoopHandle<'static, crate::state::Data>) {
|
||||
for workspace in self.workspaces.spaces_mut() {
|
||||
workspace.update_animations(handle)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn refresh(&mut self) {
|
||||
#[cfg(feature = "debug")]
|
||||
puffin::profile_function!();
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ use crate::{
|
|||
xwayland::XWaylandState,
|
||||
};
|
||||
|
||||
use calloop::LoopHandle;
|
||||
use indexmap::IndexSet;
|
||||
use smithay::{
|
||||
backend::renderer::{
|
||||
|
|
@ -85,6 +86,14 @@ impl Workspace {
|
|||
self.tiling_layer.refresh();
|
||||
}
|
||||
|
||||
pub fn animations_going(&self) -> bool {
|
||||
self.tiling_layer.animations_going()
|
||||
}
|
||||
|
||||
pub fn update_animations(&mut self, handle: &LoopHandle<'static, crate::state::Data>) {
|
||||
self.tiling_layer.update_animation_state(handle)
|
||||
}
|
||||
|
||||
pub fn commit(&mut self, surface: &WlSurface) {
|
||||
if let Some(mapped) = self.element_for_wl_surface(surface) {
|
||||
mapped
|
||||
|
|
@ -484,6 +493,7 @@ impl Workspace {
|
|||
renderer,
|
||||
loc.to_physical_precise_round(output_scale),
|
||||
Scale::from(output_scale),
|
||||
1.0,
|
||||
)
|
||||
}),
|
||||
);
|
||||
|
|
@ -499,6 +509,7 @@ impl Workspace {
|
|||
(or.geometry().loc - output.geometry().loc)
|
||||
.to_physical_precise_round(output_scale),
|
||||
Scale::from(output_scale),
|
||||
1.0,
|
||||
)
|
||||
}),
|
||||
);
|
||||
|
|
@ -507,7 +518,11 @@ impl Workspace {
|
|||
render_elements.extend(AsRenderElements::<R>::render_elements::<
|
||||
WorkspaceRenderElement<R>,
|
||||
>(
|
||||
fullscreen, renderer, (0, 0).into(), output_scale.into()
|
||||
fullscreen,
|
||||
renderer,
|
||||
(0, 0).into(),
|
||||
output_scale.into(),
|
||||
1.0,
|
||||
));
|
||||
|
||||
if let Some(xwm) = xwm_state.and_then(|state| state.xwm.as_mut()) {
|
||||
|
|
@ -551,6 +566,7 @@ impl Workspace {
|
|||
renderer,
|
||||
loc.to_physical_precise_round(output_scale),
|
||||
Scale::from(output_scale),
|
||||
1.0,
|
||||
)
|
||||
}),
|
||||
);
|
||||
|
|
@ -570,6 +586,7 @@ impl Workspace {
|
|||
(or.geometry().loc - output.geometry().loc)
|
||||
.to_physical_precise_round(output_scale),
|
||||
Scale::from(output_scale),
|
||||
1.0,
|
||||
)
|
||||
}),
|
||||
);
|
||||
|
|
@ -620,6 +637,7 @@ impl Workspace {
|
|||
renderer,
|
||||
loc.to_physical_precise_round(output_scale),
|
||||
Scale::from(output_scale),
|
||||
1.0,
|
||||
)
|
||||
}),
|
||||
);
|
||||
|
|
@ -715,6 +733,13 @@ where
|
|||
WorkspaceRenderElement::Window(elem) => elem.opaque_regions(scale),
|
||||
}
|
||||
}
|
||||
|
||||
fn alpha(&self) -> f32 {
|
||||
match self {
|
||||
WorkspaceRenderElement::Wayland(elem) => elem.alpha(),
|
||||
WorkspaceRenderElement::Window(elem) => elem.alpha(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<R> RenderElement<R> for WorkspaceRenderElement<R>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue