refactor(surface): type surface actions on the message they carry

This commit is contained in:
Hojjat 2026-09-08 13:04:15 -06:00 • committed by Michael Murphy
parent 376f1b8850
commit a8fe59f388
21 changed files with 194 additions and 181 deletions

View file

@ -45,8 +45,6 @@ pub enum Action {
/// Tracks updates to window suggested size.
#[cfg(feature = "applet")]
SuggestedBounds(Option<iced::Size>),
/// Internal surface message
Surface(surface::Action),
/// Notifies that a surface was closed.
/// Any data relating to the surface should be cleaned up.
SurfaceClosed(iced::window::Id),

View file

@ -154,7 +154,7 @@ where
#[allow(clippy::too_many_lines)]
pub fn surface_update(
&mut self,
_surface_message: crate::surface::Action,
_surface_message: crate::surface::Action<T::Message>,
) -> iced::Task<crate::Action<T::Message>> {
#[cfg(feature = "surface-message")]
match _surface_message {
@ -195,18 +195,7 @@ where
};
let settings = settings();
if let Some(view) = view.and_then(|view| {
match std::sync::Arc::try_unwrap(view).ok()?.downcast::<Box<
dyn Fn() -> Element<'static, crate::Action<T::Message>> + Send + Sync,
>>() {
Ok(v) => Some(v),
Err(err) => {
tracing::error!("Invalid view for subsurface view: {err:?}");
None
}
}
}) {
if let Some(view) = view {
self.get_subsurface(settings, Some(Box::new(move |_| view())))
} else {
self.get_subsurface(settings, None)
@ -302,17 +291,7 @@ where
let settings = settings();
let live_settings = Box::new(move |_: &T| live_settings());
if let Some(view) = view.and_then(|view| {
match std::sync::Arc::try_unwrap(view).ok()?.downcast::<Box<
dyn Fn() -> Element<'static, crate::Action<T::Message>> + Send + Sync,
>>() {
Ok(v) => Some(v),
Err(err) => {
tracing::error!("Invalid view for subsurface view: {err:?}");
None
}
}
}) {
if let Some(view) = view {
self.get_popup(settings, live_settings, Some(Box::new(move |_| view())))
} else {
self.get_popup(settings, live_settings, None)
@ -378,17 +357,7 @@ where
return Task::none();
};
if let Some(view) = view.and_then(|view| {
match std::sync::Arc::try_unwrap(view).ok()?.downcast::<Box<
dyn Fn() -> Element<'static, crate::Action<T::Message>> + Send + Sync,
>>() {
Ok(v) => Some(v),
Err(err) => {
tracing::error!("Invalid view for Window: {err:?}");
None
}
}
}) {
if let Some(view) = view {
let settings = settings();
self.get_window(
@ -410,9 +379,7 @@ where
}
crate::surface::Action::Ignore => iced::Task::none(),
crate::surface::Action::Task(f) => {
f().map(|sm| crate::Action::Cosmic(Action::Surface(sm)))
}
crate::surface::Action::Task(f) => f().map(crate::Action::Surface),
#[cfg(wayland_platform)]
crate::surface::Action::AppLayerShell(settings, live_settings, view) => {
let Some(settings) = std::sync::Arc::try_unwrap(settings)
@ -475,17 +442,7 @@ where
let live_settings = live_settings();
let live_settings = Box::new(move |_app: &T| live_settings);
if let Some(view) = view.and_then(|view| {
match std::sync::Arc::try_unwrap(view).ok()?.downcast::<Box<
dyn Fn() -> Element<'static, crate::Action<T::Message>> + Send + Sync,
>>() {
Ok(v) => Some(v),
Err(err) => {
tracing::error!("Invalid view for layer surface: {err:?}");
None
}
}
}) {
if let Some(view) = view {
self.get_layer_shell(settings, live_settings, Some(Box::new(move |_| view())))
} else {
self.get_layer_shell(settings, live_settings, None)
@ -516,6 +473,7 @@ where
let mut task = match message {
crate::Action::App(message) => self.app.update(message),
crate::Action::Cosmic(message) => self.cosmic_update(message),
crate::Action::Surface(action) => self.surface_update(action),
crate::Action::None => iced::Task::none(),
#[cfg(feature = "single-instance")]
crate::Action::DbusActivation(message) => {
@ -1228,8 +1186,6 @@ impl<T: Application> Cosmic<T> {
}
}
Action::Surface(action) => return self.surface_update(action),
Action::SurfaceClosed(id) => {
if self.opened_surfaces.get_mut(&id).is_some_and(|v| {
*v = v.saturating_sub(1);

View file

@ -394,7 +394,7 @@ where
{
nav = nav
.window_id_maybe(self.core().main_window_id())
.on_surface_action(|m| crate::Action::Cosmic(crate::app::Action::Surface(m)))
.on_surface_action(|action| crate::Action::Surface(action.flatten()))
}
let mut nav = nav
.into_container()