Add show_window_menu action
Winit currently supports this only on Windows and Wayland. This requests that a context menu is shown at the cursor position, like the menu normally triggered by right clicking the title bar. This is important for implementing client side decorations with Iced widgets.
This commit is contained in:
parent
7a1e105036
commit
f93a6d740a
4 changed files with 37 additions and 0 deletions
|
|
@ -160,6 +160,11 @@ pub fn change_level<Message>(id: Id, level: Level) -> Command<Message> {
|
|||
Command::single(command::Action::Window(Action::ChangeLevel(id, level)))
|
||||
}
|
||||
|
||||
/// Show window menu at cursor position.
|
||||
pub fn show_window_menu<Message>(id: Id) -> Command<Message> {
|
||||
Command::single(command::Action::Window(Action::ShowWindowMenu(id)))
|
||||
}
|
||||
|
||||
/// Fetches an identifier unique to the window, provided by the underlying windowing system. This is
|
||||
/// not to be confused with [`Id`].
|
||||
pub fn fetch_id<Message>(
|
||||
|
|
|
|||
|
|
@ -81,6 +81,11 @@ pub enum Action<T> {
|
|||
GainFocus(Id),
|
||||
/// Change the window [`Level`].
|
||||
ChangeLevel(Id, Level),
|
||||
/// Show window menu at cursor position.
|
||||
///
|
||||
/// ## Platform-specific
|
||||
/// Android / iOS / macOS / Orbital / Web / X11: Unsupported.
|
||||
ShowWindowMenu(Id),
|
||||
/// Fetch the raw identifier unique to the window.
|
||||
FetchId(Id, Box<dyn FnOnce(u64) -> T + 'static>),
|
||||
/// Change the window [`Icon`].
|
||||
|
|
@ -141,6 +146,7 @@ impl<T> Action<T> {
|
|||
}
|
||||
Self::GainFocus(id) => Action::GainFocus(id),
|
||||
Self::ChangeLevel(id, level) => Action::ChangeLevel(id, level),
|
||||
Self::ShowWindowMenu(id) => Action::ShowWindowMenu(id),
|
||||
Self::FetchId(id, o) => {
|
||||
Action::FetchId(id, Box::new(move |s| f(o(s))))
|
||||
}
|
||||
|
|
@ -200,6 +206,9 @@ impl<T> fmt::Debug for Action<T> {
|
|||
Self::ChangeLevel(id, level) => {
|
||||
write!(f, "Action::ChangeLevel({id:?}, {level:?})")
|
||||
}
|
||||
Self::ShowWindowMenu(id) => {
|
||||
write!(f, "Action::ShowWindowMenu({id:?})")
|
||||
}
|
||||
Self::FetchId(id, _) => write!(f, "Action::FetchId({id:?})"),
|
||||
Self::ChangeIcon(id, _icon) => {
|
||||
write!(f, "Action::ChangeIcon({id:?})")
|
||||
|
|
|
|||
|
|
@ -807,6 +807,14 @@ pub fn run_command<A, C, E>(
|
|||
window::Action::ChangeLevel(_id, level) => {
|
||||
window.set_window_level(conversion::window_level(level));
|
||||
}
|
||||
window::Action::ShowWindowMenu(_id) => {
|
||||
if let mouse::Cursor::Available(point) = state.cursor() {
|
||||
window.show_window_menu(winit::dpi::LogicalPosition {
|
||||
x: point.x,
|
||||
y: point.y,
|
||||
});
|
||||
}
|
||||
}
|
||||
window::Action::FetchId(_id, tag) => {
|
||||
proxy
|
||||
.send_event(tag(window.id().into()))
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ pub use state::State;
|
|||
|
||||
use crate::conversion;
|
||||
use crate::core;
|
||||
use crate::core::mouse;
|
||||
use crate::core::renderer;
|
||||
use crate::core::widget::operation;
|
||||
use crate::core::window;
|
||||
|
|
@ -1058,6 +1059,20 @@ fn run_command<A, C, E>(
|
|||
.set_window_level(conversion::window_level(level));
|
||||
}
|
||||
}
|
||||
window::Action::ShowWindowMenu(id) => {
|
||||
if let Some(window) = window_manager.get_mut(id) {
|
||||
if let mouse::Cursor::Available(point) =
|
||||
window.state.cursor()
|
||||
{
|
||||
window.raw.show_window_menu(
|
||||
winit::dpi::LogicalPosition {
|
||||
x: point.x,
|
||||
y: point.y,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
window::Action::FetchId(id, tag) => {
|
||||
if let Some(window) = window_manager.get_mut(id) {
|
||||
proxy
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue