From f93a6d740ac4cb09720bcb502b04e9a3d993bdba Mon Sep 17 00:00:00 2001
From: Ian Douglas Scott <idscott@system76.com>
Date: Fri, 12 Jan 2024 22:57:52 -0800
Subject: 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.
---
 winit/src/application.rs  |  8 ++++++++
 winit/src/multi_window.rs | 15 +++++++++++++++
 2 files changed, 23 insertions(+)

(limited to 'winit/src')

diff --git a/winit/src/application.rs b/winit/src/application.rs
index ad461738..c2bd11e2 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -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()))
diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs
index 72cd939f..64ecb362 100644
--- a/winit/src/multi_window.rs
+++ b/winit/src/multi_window.rs
@@ -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
-- 
cgit