Comments (2)
Okay, here's an actual sketch for this; threading the needle between mac and windows is a bit subtle.
Windows
In win32, context menus are intended to be displayed during handling of the WM_CONTEXTMENU
message. This message is called after WM_RBUTTONUP
; that is, if the application has not handled the right mouse button, then it is called again with a message telling it to display a context menu.
macOS
In Cocoa, the default implementation of rightMouseDown:
calls menuForEvent:
, and presents a menu if it is returned. If it is not returned, the mouse event continues up the responder chain.
A preliminary design
We would like some API that works well in both cases, without interfering with other event flow.
What seems easiest: on right mouse down, we check if the running application would like to display a context menu. We add two new methods to druid-shell::WinHandler
, that look something like:
fn context_menu(&mut self, pos: Point, ctx: &mut dyn WinCtx) -> Option<Menu>;
fn context_menu_end(&mut self, cmd: Option<Action>);
context_menu
is called on right mouse down. If this method returns Some
, then the right mouse up/down/moved events are suppressed while the menu is displayed. If it returns None
, then the right mouse events are sent as normal. context_menu_end
is called anytime the menu is closed, and includes a cmd if one was selected.
What is a menu?
The type of Menu
is not totally clear. There are currently Menu
types declared in each druid-shell
backend, and these may be reused; I'm not sure exactly the state of that code. I could also imagine Menu
being a platform-independent 'menu description', that is then turned into some concrete platform-specific object in druid-shell
. (This pattern echoes the changes to Color
and Gradient
in piet that have been recently discussed.
The type of the cmd
argument is up for discussion.
from druid.
Sounds like a good start. A few other thoughts.
First, to what extent is WM_CONTEXTMENU
and menuForEvent:
actually necessary for correct context menu operation, and to what extent is it the platform helpfully offering assistance for mouse events? In the latter case it's not actually helpful, because we can do dispatching in a platform-independent way.
Second, it's certainly a choice to use platform menus. I'm in favor, but I'll point out that they don't necessarily match the appearance of the rest of the app. I strongly suspect this will be smoother on macOS than Windows.
The current Menu
types need some more work. I suspect it's possible to make them support contextual menus as well as the traditional drop-down menu bar; on Windows it's the same objects underneath.
from druid.
Related Issues (20)
- Option::Unwrap on a None value layout.rs:228:34 HOT 3
- Selecting multiple files HOT 4
- OSX Tab change input field focus breaks rendering HOT 4
- Make it possible to build "standard" dialogs HOT 1
- Can't compile the program in Chapter 2 of druid book HOT 1
- Docs? HOT 2
- Broken links in the book.
- Window name is not null terminated in X11 HOT 3
- Build error of an empty project: `syn::Type` doesn't implement `Debug` HOT 7
- Issue building druid-derive on macos HOT 1
- Require widget to implement compute_max_intrinsic HOT 7
- App update upgrade features HOT 1
- do we stop to develop the project? HOT 1
- Read data from an other thread HOT 3
- Looks like the documentation is out of date HOT 1
- Opening another window within a Druid application.
- Dual monitor App invisible
- version `GLIBCXX_3.4.29' not found HOT 2
- assertion 'width >= -1' failed on NixOS/Sway HOT 1
- Prevent closing app with cross
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from druid.