events: add EventTargetBase

EventTargetBase implements event target vtable for pure zig struct
This commit is contained in:
Pierre Tachoire
2024-01-17 18:17:40 +01:00
parent 85a8decffc
commit 9050f2586b
3 changed files with 45 additions and 2 deletions

View File

@@ -3,6 +3,7 @@ const std = @import("std");
const c = @cImport({
@cInclude("dom/dom.h");
@cInclude("dom/bindings/hubbub/parser.h");
@cInclude("events/event_target.h");
});
const Callback = @import("jsruntime").Callback;
@@ -622,6 +623,33 @@ pub fn eventTargetDispatchEvent(et: *EventTarget, event: *Event) !bool {
return res;
}
// EventTargetBase is used to implement EventTarget for pure zig struct.
pub const EventTargetTBase = struct {
const Self = @This();
vtable: ?*const c.struct_dom_event_target_vtable = &c.struct_dom_event_target_vtable{
.dispatch_event = dispatch_event,
.remove_event_listener = remove_event_listener,
.add_event_listener = add_event_listener,
},
eti: c.dom_event_target_internal = c.dom_event_target_internal{ .listeners = null },
pub fn add_event_listener(et: [*c]c.dom_event_target, t: [*c]c.dom_string, l: ?*c.struct_dom_event_listener, capture: bool) callconv(.C) c.dom_exception {
const self = @as(*Self, @ptrCast(et));
return c._dom_event_target_add_event_listener(&self.eti, t, l, capture);
}
pub fn dispatch_event(et: [*c]c.dom_event_target, evt: ?*c.struct_dom_event, res: [*c]bool) callconv(.C) c.dom_exception {
const self = @as(*Self, @ptrCast(et));
return c._dom_event_target_dispatch(et, &self.eti, evt, c.DOM_BUBBLING_PHASE, res);
}
pub fn remove_event_listener(et: [*c]c.dom_event_target, t: [*c]c.dom_string, l: ?*c.struct_dom_event_listener, capture: bool) callconv(.C) c.dom_exception {
const self = @as(*Self, @ptrCast(et));
return c._dom_event_target_add_event_listener(&self.eti, t, l, capture);
}
};
// NodeType
pub const NodeType = enum(u4) {