From eea93d543e698bad0dd9734590341bedec1f46ac Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Wed, 19 Jun 2024 20:13:14 +0200 Subject: [PATCH] state: Correctly update primary output --- src/backend/kms/surface/mod.rs | 9 +-- src/state.rs | 107 +++++++++++++++++++-------------- 2 files changed, 67 insertions(+), 49 deletions(-) diff --git a/src/backend/kms/surface/mod.rs b/src/backend/kms/surface/mod.rs index 5cb27c33..2582fcc5 100644 --- a/src/backend/kms/surface/mod.rs +++ b/src/backend/kms/surface/mod.rs @@ -1199,6 +1199,11 @@ impl SurfaceThreadState { } } + if self.mirroring.is_none() { + let states = frame_result.states; + self.send_dmabuf_feedback(states); + } + if x.is_ok() { let new_state = QueueState::WaitingForVBlank { redraw_needed: false, @@ -1218,13 +1223,9 @@ impl SurfaceThreadState { if self.mirroring.is_none() { self.frame_callback_seq = self.frame_callback_seq.wrapping_add(1); - - let states = frame_result.states; self.send_frame_callbacks(); - self.send_dmabuf_feedback(states); } } else { - tracing::debug!("Stopped rendering"); self.queue_estimated_vblank(estimated_presentation); } } diff --git a/src/state.rs b/src/state.rs index 179d841a..e53d7dfc 100644 --- a/src/state.rs +++ b/src/state.rs @@ -608,14 +608,8 @@ impl Common { } // sticky window - shell - .workspaces - .sets - .get(output) - .unwrap() - .sticky_layer - .mapped() - .for_each(|mapped| { + for set in shell.workspaces.sets.values() { + set.sticky_layer.mapped().for_each(|mapped| { for (window, _) in mapped.windows() { window.with_surfaces(|surface, states| { let primary_scanout_output = update_surface_primary_scanout_output( @@ -634,28 +628,49 @@ impl Common { }); } }); + } // normal windows - let active = shell.active_space(output); - active.mapped().for_each(|mapped| { - for (window, _) in mapped.windows() { - window.with_surfaces(|surface, states| { - let primary_scanout_output = update_surface_primary_scanout_output( - surface, - output, - states, - render_element_states, - default_primary_scanout_output_compare, - ); - if let Some(output) = primary_scanout_output { - with_fractional_scale(states, |fraction_scale| { - fraction_scale - .set_preferred_scale(output.current_scale().fractional_scale()); - }); - } - }); - } - }); + for space in shell.workspaces.spaces() { + space.mapped().for_each(|mapped| { + for (window, _) in mapped.windows() { + window.with_surfaces(|surface, states| { + let primary_scanout_output = update_surface_primary_scanout_output( + surface, + output, + states, + render_element_states, + default_primary_scanout_output_compare, + ); + if let Some(output) = primary_scanout_output { + with_fractional_scale(states, |fraction_scale| { + fraction_scale + .set_preferred_scale(output.current_scale().fractional_scale()); + }); + } + }); + } + }); + space.minimized_windows.iter().for_each(|m| { + for (window, _) in m.window.windows() { + window.with_surfaces(|surface, states| { + let primary_scanout_output = update_surface_primary_scanout_output( + surface, + output, + states, + render_element_states, + default_primary_scanout_output_compare, + ); + if let Some(output) = primary_scanout_output { + with_fractional_scale(states, |fraction_scale| { + fraction_scale + .set_preferred_scale(output.current_scale().fractional_scale()); + }); + } + }); + } + }) + } // OR windows shell.override_redirect_windows.iter().for_each(|or| { @@ -679,23 +694,25 @@ impl Common { }); // layer surfaces - let map = smithay::desktop::layer_map_for_output(output); - for layer_surface in map.layers() { - layer_surface.with_surfaces(|surface, states| { - let primary_scanout_output = update_surface_primary_scanout_output( - surface, - output, - states, - render_element_states, - default_primary_scanout_output_compare, - ); - if let Some(output) = primary_scanout_output { - with_fractional_scale(states, |fraction_scale| { - fraction_scale - .set_preferred_scale(output.current_scale().fractional_scale()); - }); - } - }); + for o in shell.outputs() { + let map = smithay::desktop::layer_map_for_output(o); + for layer_surface in map.layers() { + layer_surface.with_surfaces(|surface, states| { + let primary_scanout_output = update_surface_primary_scanout_output( + surface, + output, + states, + render_element_states, + default_primary_scanout_output_compare, + ); + if let Some(output) = primary_scanout_output { + with_fractional_scale(states, |fraction_scale| { + fraction_scale + .set_preferred_scale(output.current_scale().fractional_scale()); + }); + } + }); + } } }