Skip to content

Commit 5bfb73c

Browse files
committed
utility function create_event_handler with more options, like preventDefault/stopPropagation
1 parent 7e87531 commit 5bfb73c

3 files changed

Lines changed: 38 additions & 8 deletions

File tree

webgpu/input_handler.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import threading
22
from typing import Callable
33

4-
from .platform import is_pyodide
5-
from .utils import to_js
6-
74

85
class InputHandler:
96
_js_handlers: dict
@@ -96,11 +93,14 @@ def wrapper(event):
9693
return wrapper
9794

9895
def register_callbacks(self):
99-
from .platform import create_proxy
96+
from .platform import create_event_handler
10097

101-
options = to_js({"capture": True})
10298
for event in ["mousedown", "mouseup", "mousemove", "wheel", "mouseout"]:
103-
js_handler = create_proxy(self._handle_js_event(event), ignore_return_value=True)
99+
js_handler = create_event_handler(
100+
self._handle_js_event(event),
101+
prevent_default=True,
102+
stop_propagation=event not in ["mousemove", "mouseout"],
103+
)
104104
self.html_canvas["on" + event] = js_handler
105105
self._js_handlers[event] = js_handler
106106

webgpu/link/link.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class CrossLink {
153153
this.connection.onOpen(() => {
154154
this.expose('importPackage', window.importPackage);
155155
this.expose('addStyleFile', window.addStyleFile);
156+
this.expose('createEventHandler', window.createEventHandler);
156157
console.log('connection open');
157158
resolve();
158159
});
@@ -596,3 +597,19 @@ window.patchedRequestAnimationFrame = (device, context, target) => {
596597
device.queue.submit([encoder.finish()]);
597598
});
598599
};
600+
601+
window.createEventHandler = (callback, options = {}) => {
602+
return (ev) => {
603+
if (options.preventDefault) {
604+
ev.preventDefault();
605+
}
606+
if (options.stopPropagation) {
607+
ev.stopPropagation();
608+
}
609+
if (options.stopImmediatePropagation) {
610+
ev.stopImmediatePropagation();
611+
}
612+
callback(ev);
613+
return options.returnValue;
614+
};
615+
};

webgpu/platform.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,20 @@
1818
link = None
1919

2020

21-
def create_event_handler(func, prevent_default=True):
22-
pass
21+
def create_event_handler(
22+
func,
23+
prevent_default=True,
24+
stop_propagation=False,
25+
stop_immediate_propagation=False,
26+
return_value=None,
27+
):
28+
options = {
29+
"preventDefault": prevent_default,
30+
"stopPropagation": stop_propagation,
31+
"stopImmediatePropagation": stop_immediate_propagation,
32+
"returnValue": return_value,
33+
}
34+
return js.createEventHandler(func, options)
2335

2436

2537
try:
@@ -97,6 +109,7 @@ class JsPromise:
97109

98110
if is_pyodide:
99111
import json
112+
100113
import js as pyodide_js
101114

102115
from .link.base import LinkBase

0 commit comments

Comments
 (0)