diff --git a/src/app/cosmic.rs b/src/app/cosmic.rs index 3dec2191f13..8749f42cdbe 100644 --- a/src/app/cosmic.rs +++ b/src/app/cosmic.rs @@ -71,6 +71,7 @@ pub enum Message { SurfaceClosed(window::Id), /// Activate the application Activate(String), + ShowWindowMenu, } #[derive(Default)] @@ -412,6 +413,10 @@ impl Cosmic { return self.app.update(msg); } } + Message::ShowWindowMenu => { + #[cfg(not(feature = "wayland"))] + return window::show_window_menu(window::Id::MAIN); + } } iced::Command::none() diff --git a/src/app/mod.rs b/src/app/mod.rs index b2bb3f4e5d3..b985bb2f789 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -661,7 +661,8 @@ impl ApplicationExt for App { .window_id(window::Id::MAIN) .title(&core.window.header_title) .on_drag(Message::Cosmic(cosmic::Message::Drag)) - .on_close(Message::Cosmic(cosmic::Message::Close)); + .on_close(Message::Cosmic(cosmic::Message::Close)) + .on_right_click(Message::Cosmic(cosmic::Message::ShowWindowMenu)); if self.nav_model().is_some() { let toggle = crate::widget::nav_bar_toggle() diff --git a/src/widget/header_bar.rs b/src/widget/header_bar.rs index 80c43694cb9..6bed98288a3 100644 --- a/src/widget/header_bar.rs +++ b/src/widget/header_bar.rs @@ -16,6 +16,7 @@ pub fn header_bar<'a, Message>() -> HeaderBar<'a, Message> { on_drag: None, on_maximize: None, on_minimize: None, + on_right_click: None, start: Vec::new(), center: Vec::new(), end: Vec::new(), @@ -45,6 +46,10 @@ pub struct HeaderBar<'a, Message> { #[setters(strip_option)] on_minimize: Option, + /// A message emitted when the header is right clicked. + #[setters(strip_option)] + on_right_click: Option, + /// The window id for the headerbar. #[setters(strip_option)] window_id: Option, @@ -337,6 +342,10 @@ impl<'a, Message: Clone + 'static> HeaderBar<'a, Message> { widget = widget.on_release(message); } + if let Some(message) = self.on_right_click.clone() { + widget = widget.on_right_press(message); + } + widget.into() }