Git Product home page Git Product logo

Comments (2)

cmyr avatar cmyr commented on July 22, 2024

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.

raphlinus avatar raphlinus commented on July 22, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.