diff options
Diffstat (limited to 'include/dom/events/event_target.h')
-rw-r--r-- | include/dom/events/event_target.h | 87 |
1 files changed, 68 insertions, 19 deletions
diff --git a/include/dom/events/event_target.h b/include/dom/events/event_target.h index 51226ed..e55b6cb 100644 --- a/include/dom/events/event_target.h +++ b/include/dom/events/event_target.h @@ -14,46 +14,95 @@ struct dom_event_listener; struct dom_event; -struct dom_node_internal; -typedef struct dom_node_internal dom_event_target; +/* Event target is a mixin interface, thus has no concrete implementation. + * Subclasses must provide implementations of the event target methods. */ +typedef struct dom_event_target { + void *vtable; +} dom_event_target; -dom_exception _dom_event_target_add_event_listener(dom_event_target *et, - dom_string *type, struct dom_event_listener *listener, - bool capture); +typedef struct dom_event_target_vtable { + dom_exception (*add_event_listener)( + dom_event_target *et, dom_string *type, + struct dom_event_listener *listener, + bool capture); + dom_exception (*remove_event_listener)( + dom_event_target *et, dom_string *type, + struct dom_event_listener *listener, + bool capture); + dom_exception (*dispatch_event)( + dom_event_target *et, + struct dom_event *evt, bool *success); + dom_exception (*add_event_listener_ns)( + dom_event_target *et, + dom_string *namespace, dom_string *type, + struct dom_event_listener *listener, + bool capture); + dom_exception (*remove_event_listener_ns)( + dom_event_target *et, + dom_string *namespace, dom_string *type, + struct dom_event_listener *listener, + bool capture); +} dom_event_target_vtable; + +static inline dom_exception dom_event_target_add_event_listener( + dom_event_target *et, dom_string *type, + struct dom_event_listener *listener, bool capture) +{ + return ((dom_event_target_vtable *) et->vtable)->add_event_listener( + et, type, listener, capture); +} #define dom_event_target_add_event_listener(et, t, l, c) \ - _dom_event_target_add_event_listener((dom_event_target *) (et),\ + dom_event_target_add_event_listener((dom_event_target *) (et),\ (dom_string *) (t), (struct dom_event_listener *) (l), \ (bool) (c)) -dom_exception _dom_event_target_remove_event_listener(dom_event_target *et, - dom_string *type, struct dom_event_listener *listener, - bool capture); +static inline dom_exception dom_event_target_remove_event_listener( + dom_event_target *et, dom_string *type, + struct dom_event_listener *listener, bool capture) +{ + return ((dom_event_target_vtable *) et->vtable)->remove_event_listener( + et, type, listener, capture); +} #define dom_event_target_remove_event_listener(et, t, l, c) \ - _dom_event_target_remove_event_listener(\ + dom_event_target_remove_event_listener(\ (dom_event_target *) (et), (dom_string *) (t),\ (struct dom_event_listener *) (l), (bool) (c)) -dom_exception _dom_event_target_dispatch_event(dom_event_target *et, - struct dom_event *evt, bool *success); +static inline dom_exception dom_event_target_dispatch_event( + dom_event_target *et, struct dom_event *evt, bool *success) +{ + return ((dom_event_target_vtable *) et->vtable)->dispatch_event( + et, evt, success); +} #define dom_event_target_dispatch_event(et, e, s) \ - _dom_event_target_dispatch_event((dom_event_target *) (et),\ + dom_event_target_dispatch_event((dom_event_target *) (et),\ (struct dom_event *) (e), (bool *) (s)) -dom_exception _dom_event_target_add_event_listener_ns(dom_event_target *et, +static inline dom_exception dom_event_target_add_event_listener_ns( + dom_event_target *et, dom_string *namespace, dom_string *type, - struct dom_event_listener *listener, bool capture); + struct dom_event_listener *listener, bool capture) +{ + return ((dom_event_target_vtable *) et->vtable)->add_event_listener_ns( + et, namespace, type, listener, capture); +} #define dom_event_target_add_event_listener_ns(et, n, t, l, c) \ - _dom_event_target_add_event_listener_ns(\ + dom_event_target_add_event_listener_ns(\ (dom_event_target *) (et), (dom_string *) (n),\ (dom_string *) (t), (struct dom_event_listener *) (l),\ (bool) (c)) -dom_exception _dom_event_target_remove_event_listener_ns(dom_event_target *et, +static inline dom_exception dom_event_target_remove_event_listener_ns( + dom_event_target *et, dom_string *namespace, dom_string *type, - struct dom_event_listener *listener, bool capture); + struct dom_event_listener *listener, bool capture) +{ + return ((dom_event_target_vtable *) et->vtable)->remove_event_listener_ns( + et, namespace, type, listener, capture); +} #define dom_event_target_remove_event_listener_ns(et, n, t, l, c) \ - _dom_event_target_remove_event_listener_ns(\ + dom_event_target_remove_event_listener_ns(\ (dom_event_target *) (et), (dom_string *) (n),\ (dom_string *) (t), (struct dom_event_listener *) (l),\ (bool) (c)) |