Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge the Windowing proposal #5

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

tareksander
Copy link

I changed mini-canvas to window and consolidated the event listeners into it, as well as adding my event definitions from the Windowing proposal. I also made my events pollable-based like you suggested and made a pollable for each event type. Creating resources for each event listener seems too much, I kept the functions in the window resource.

I also added an alternative display API as an example that more display APIs are possible and for possible embedded use.

…l as an alternative display API intended for embedded use.
Copy link
Collaborator

@MendyBerger MendyBerger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @tareksander for putting this together, I like where this is going!

I've added my questions and suggestions.

Creating resources for each event listener seems too much, I kept the functions in the window resource.

Good idea! I didn't think of it.

}

/// Checks whether window functionality is available at all in the runtime.
available: func() -> bool;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this mean? Why would you even be able to get here, when there's no windowing capabilities?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah. You talked about the possibility of having multiple presentation APIs, and I also added an API intended for raw framebuffer access on connected screens, for embedded devices. If this were Rust, I'd just make the window constructor return an option, but I don't think that's possible in WIT?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wit does support options: e.g. option<bool> instead of bool.

But I'm not sure I'm following why this is necessary. If another presentation api is used, how would you reach this point at all?
You would use wasi-windowing-other instead of wasi-windowing, and wasi-windowing-other would have a completely different set of functions.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently the unit of implementation is a world. So if something is included in the world, you have to implement it, even if it's stubbed. Since I can't make the constructor fail gracefully, there needs to be a function to query runtime support. Of course each display API could get its own world, too.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this were Rust, I'd just make the window constructor return an option, but I don't think that's possible in WIT?

The way to do that in WIT is to use a static factory function:

ctor: static func([...]) -> option<the-type>;

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Of course each display API could get its own world, too.

That's what I'd prefer.

wit/window.wit Show resolved Hide resolved
wit/window.wit Outdated Show resolved Hide resolved
wit/window.wit Show resolved Hide resolved


subscribe-mouse-down: func() -> pollable;
get-mouse-down: func() -> option<mouse>;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason you're calling these mouse instead of pointer? I would opt for pointer, like the web, because we wanna cover all kinds of inputs, like touch and pencil.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Touch input is a bit more complicated, with multi touch and all, I haven't looked at touch yet. There will be separate events for pointers, but implementations are free to convert e.g. a tap into mouse-down + mouse-up.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd start with pointer since it covers all the basics (mouse, pen, touch). We can later add in things like multi touch, but I'd prefer if we can start with something broad rather than something narrow.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我会从指针开始,因为它涵盖了所有基本功能(鼠标、笔、触摸)。我们稍后可以添加多点触摸等功能,但我更希望我们能从广泛的内容开始,而不是从狭窄的内容开始。

strongly agree like https://developer.mozilla.org/zh-CN/docs/Web/API/Pointer_events

@@ -0,0 +1,37 @@
package wasi:webgpu;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How's this different from frame-buffer.wit?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a display API, frame-buffer is a graphics API. But you're right, the intended use is to connect a display to a frame-buffer to draw into, primarily for embedded devices. The difference is that frame-buffer is an arbitrary framebuffer, but this maps to hardware displays and their framebuffers. This is just a proof that multiple display APIs are supported, we don't have to actually include it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason we can't use frame-buffer for both?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

frame-buffer has no way to specify a screen, or which screen.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see.
But I'd much rather have one interface for both.
Wanna open a separate issue or PR to discuss?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants