refactor: allow resetting the main window id
This commit is contained in:
parent
b44fe2c0b6
commit
cf3ba4ca07
5 changed files with 29 additions and 24 deletions
|
|
@ -29,7 +29,7 @@ pub mod message {
|
||||||
|
|
||||||
impl crate::app::Core {
|
impl crate::app::Core {
|
||||||
pub fn drag<M: Send + 'static>(&self, id: Option<window::Id>) -> iced::Task<Message<M>> {
|
pub fn drag<M: Send + 'static>(&self, id: Option<window::Id>) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::drag(id).map(Message::Cosmic)
|
crate::command::drag(id).map(Message::Cosmic)
|
||||||
|
|
@ -40,14 +40,14 @@ impl crate::app::Core {
|
||||||
id: Option<window::Id>,
|
id: Option<window::Id>,
|
||||||
maximized: bool,
|
maximized: bool,
|
||||||
) -> iced::Task<Message<M>> {
|
) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::maximize(id, maximized).map(Message::Cosmic)
|
crate::command::maximize(id, maximized).map(Message::Cosmic)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn minimize<M: Send + 'static>(&self, id: Option<window::Id>) -> iced::Task<Message<M>> {
|
pub fn minimize<M: Send + 'static>(&self, id: Option<window::Id>) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::minimize(id).map(Message::Cosmic)
|
crate::command::minimize(id).map(Message::Cosmic)
|
||||||
|
|
@ -62,7 +62,7 @@ impl crate::app::Core {
|
||||||
id: Option<window::Id>,
|
id: Option<window::Id>,
|
||||||
title: String,
|
title: String,
|
||||||
) -> iced::Task<Message<M>> {
|
) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::set_title(id, title).map(Message::Cosmic)
|
crate::command::set_title(id, title).map(Message::Cosmic)
|
||||||
|
|
@ -72,7 +72,7 @@ impl crate::app::Core {
|
||||||
&self,
|
&self,
|
||||||
id: Option<window::Id>,
|
id: Option<window::Id>,
|
||||||
) -> iced::Task<Message<M>> {
|
) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::set_windowed(id).map(Message::Cosmic)
|
crate::command::set_windowed(id).map(Message::Cosmic)
|
||||||
|
|
@ -82,7 +82,7 @@ impl crate::app::Core {
|
||||||
&self,
|
&self,
|
||||||
id: Option<window::Id>,
|
id: Option<window::Id>,
|
||||||
) -> iced::Task<Message<M>> {
|
) -> iced::Task<Message<M>> {
|
||||||
let Some(id) = id.or(self.main_window.get().cloned()) else {
|
let Some(id) = id.or(self.main_window) else {
|
||||||
return iced::Task::none();
|
return iced::Task::none();
|
||||||
};
|
};
|
||||||
crate::command::toggle_maximize(id).map(Message::Cosmic)
|
crate::command::toggle_maximize(id).map(Message::Cosmic)
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ pub struct Core {
|
||||||
#[cfg(feature = "dbus-config")]
|
#[cfg(feature = "dbus-config")]
|
||||||
pub(crate) settings_daemon: Option<cosmic_settings_daemon::CosmicSettingsDaemonProxy<'static>>,
|
pub(crate) settings_daemon: Option<cosmic_settings_daemon::CosmicSettingsDaemonProxy<'static>>,
|
||||||
|
|
||||||
pub(crate) main_window: OnceCell<window::Id>,
|
pub(crate) main_window: Option<window::Id>,
|
||||||
|
|
||||||
pub(crate) exit_on_main_window_closed: bool,
|
pub(crate) exit_on_main_window_closed: bool,
|
||||||
}
|
}
|
||||||
|
|
@ -152,7 +152,7 @@ impl Default for Core {
|
||||||
portal_is_dark: None,
|
portal_is_dark: None,
|
||||||
portal_accent: None,
|
portal_accent: None,
|
||||||
portal_is_high_contrast: None,
|
portal_is_high_contrast: None,
|
||||||
main_window: OnceCell::new(),
|
main_window: None,
|
||||||
exit_on_main_window_closed: true,
|
exit_on_main_window_closed: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -373,9 +373,11 @@ impl Core {
|
||||||
|
|
||||||
/// The [`Id`] of the main window
|
/// The [`Id`] of the main window
|
||||||
pub fn main_window_id(&self) -> Option<window::Id> {
|
pub fn main_window_id(&self) -> Option<window::Id> {
|
||||||
self.main_window
|
self.main_window.filter(|id| iced::window::Id::NONE != *id)
|
||||||
.get()
|
}
|
||||||
.filter(|id| iced::window::Id::NONE != **id)
|
|
||||||
.cloned()
|
/// Reset the tracked main window to a new value
|
||||||
|
pub fn set_main_window_id(&mut self, id: window::Id) -> Option<window::Id> {
|
||||||
|
self.main_window.replace(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ pub enum Message {
|
||||||
#[cfg(feature = "applet")]
|
#[cfg(feature = "applet")]
|
||||||
SuggestedBounds(Option<iced::Size>),
|
SuggestedBounds(Option<iced::Size>),
|
||||||
/// Window Created
|
/// Window Created
|
||||||
MainWindowCreated(window::Id),
|
WindowCreated(window::Id),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
|
@ -167,7 +167,7 @@ where
|
||||||
iced::Event::Window(window::Event::Focused) => return Some(Message::Focus(id)),
|
iced::Event::Window(window::Event::Focused) => return Some(Message::Focus(id)),
|
||||||
iced::Event::Window(window::Event::Unfocused) => return Some(Message::Unfocus(id)),
|
iced::Event::Window(window::Event::Unfocused) => return Some(Message::Unfocus(id)),
|
||||||
iced::Event::Window(window::Event::Opened { .. }) => {
|
iced::Event::Window(window::Event::Opened { .. }) => {
|
||||||
return Some(Message::MainWindowCreated(id));
|
return Some(Message::WindowCreated(id));
|
||||||
}
|
}
|
||||||
#[cfg(feature = "wayland")]
|
#[cfg(feature = "wayland")]
|
||||||
iced::Event::PlatformSpecific(iced::event::PlatformSpecific::Wayland(event)) => {
|
iced::Event::PlatformSpecific(iced::event::PlatformSpecific::Wayland(event)) => {
|
||||||
|
|
@ -660,9 +660,12 @@ impl<T: Application> Cosmic<T> {
|
||||||
core.focused_window = None;
|
core.focused_window = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::MainWindowCreated(id) => {
|
Message::WindowCreated(id) => {
|
||||||
let core = self.app.core_mut();
|
let core = self.app.core_mut();
|
||||||
_ = core.main_window.set(id);
|
// Set the main window if it was not set to something else
|
||||||
|
if core.main_window.is_none() {
|
||||||
|
core.main_window = Some(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "applet")]
|
#[cfg(feature = "applet")]
|
||||||
Message::SuggestedBounds(b) => {
|
Message::SuggestedBounds(b) => {
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ pub(crate) fn iced_settings<App: Application>(
|
||||||
THEME.lock().unwrap().set_theme(settings.theme.theme_type);
|
THEME.lock().unwrap().set_theme(settings.theme.theme_type);
|
||||||
|
|
||||||
if settings.no_main_window {
|
if settings.no_main_window {
|
||||||
core.main_window.set(iced::window::Id::NONE).unwrap();
|
core.main_window = Some(iced::window::Id::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut iced = iced::Settings::default();
|
let mut iced = iced::Settings::default();
|
||||||
|
|
@ -136,7 +136,7 @@ pub(crate) fn iced_settings<App: Application>(
|
||||||
/// Returns error on application failure.
|
/// Returns error on application failure.
|
||||||
pub fn run<App: Application>(settings: Settings, flags: App::Flags) -> iced::Result {
|
pub fn run<App: Application>(settings: Settings, flags: App::Flags) -> iced::Result {
|
||||||
let default_font = settings.default_font;
|
let default_font = settings.default_font;
|
||||||
let (settings, flags) = iced_settings::<App>(settings, flags);
|
let (settings, mut flags) = iced_settings::<App>(settings, flags);
|
||||||
#[cfg(not(feature = "multi-window"))]
|
#[cfg(not(feature = "multi-window"))]
|
||||||
{
|
{
|
||||||
iced::application(
|
iced::application(
|
||||||
|
|
@ -159,9 +159,9 @@ pub fn run<App: Application>(settings: Settings, flags: App::Flags) -> iced::Res
|
||||||
cosmic::Cosmic::update,
|
cosmic::Cosmic::update,
|
||||||
cosmic::Cosmic::view,
|
cosmic::Cosmic::view,
|
||||||
);
|
);
|
||||||
if flags.0.main_window.get().is_none() {
|
if flags.0.main_window.is_none() {
|
||||||
app = app.window(flags.2.clone());
|
app = app.window(flags.2.clone());
|
||||||
_ = flags.0.main_window.set(iced_core::window::Id::RESERVED);
|
flags.0.main_window = Some(iced_core::window::Id::RESERVED);
|
||||||
}
|
}
|
||||||
app.subscription(cosmic::Cosmic::subscription)
|
app.subscription(cosmic::Cosmic::subscription)
|
||||||
.style(cosmic::Cosmic::style)
|
.style(cosmic::Cosmic::style)
|
||||||
|
|
@ -395,9 +395,9 @@ where
|
||||||
cosmic::Cosmic::update,
|
cosmic::Cosmic::update,
|
||||||
cosmic::Cosmic::view,
|
cosmic::Cosmic::view,
|
||||||
);
|
);
|
||||||
if flags.0.main_window.get().is_none() {
|
if flags.0.main_window.is_none() {
|
||||||
app = app.window(flags.2.clone());
|
app = app.window(flags.2.clone());
|
||||||
_ = flags.0.main_window.set(iced_core::window::Id::RESERVED);
|
_ = flags.0.main_window = Some(iced_core::window::Id::RESERVED);
|
||||||
}
|
}
|
||||||
app.subscription(cosmic::Cosmic::subscription)
|
app.subscription(cosmic::Cosmic::subscription)
|
||||||
.style(cosmic::Cosmic::style)
|
.style(cosmic::Cosmic::style)
|
||||||
|
|
|
||||||
|
|
@ -419,9 +419,9 @@ pub fn run<App: Application>(flags: App::Flags) -> iced::Result {
|
||||||
cosmic::Cosmic::update,
|
cosmic::Cosmic::update,
|
||||||
cosmic::Cosmic::view,
|
cosmic::Cosmic::view,
|
||||||
);
|
);
|
||||||
if core.main_window.get().is_none() {
|
if core.main_window.is_none() {
|
||||||
app = app.window(window_settings.clone());
|
app = app.window(window_settings.clone());
|
||||||
_ = core.main_window.set(iced_core::window::Id::RESERVED);
|
core.main_window = Some(iced_core::window::Id::RESERVED);
|
||||||
}
|
}
|
||||||
app.subscription(cosmic::Cosmic::subscription)
|
app.subscription(cosmic::Cosmic::subscription)
|
||||||
.style(cosmic::Cosmic::style)
|
.style(cosmic::Cosmic::style)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue