/* * w3m Event System Header * * This file defines the event handling system for JavaScript integration * in w3m. It provides event listener registration, event dispatching, * and integration with w3m's existing input handling system. */ #ifndef W3M_EVENTS_H #define W3M_EVENTS_H #ifdef USE_JAVASCRIPT #include "quickjs/quickjs.h" #include "w3m_javascript.h" #include "w3m_dom.h" /* Forward declarations */ struct _Buffer; struct _anchor; struct form_list; /* Event Types */ typedef enum { W3M_EVENT_CLICK, W3M_EVENT_SUBMIT, W3M_EVENT_LOAD, W3M_EVENT_UNLOAD, W3M_EVENT_FOCUS, W3M_EVENT_BLUR, W3M_EVENT_CHANGE, W3M_EVENT_KEYPRESS, W3M_EVENT_KEYDOWN, W3M_EVENT_KEYUP, W3M_EVENT_MOUSEOVER, W3M_EVENT_MOUSEOUT, W3M_EVENT_TYPE_COUNT } W3MEventType; /* Event Listener Structure */ typedef struct W3MEventListener { W3MEventType type; JSValue callback; /* JavaScript callback function */ W3MElement *target; /* Target element */ int use_capture; /* Capture phase flag */ struct W3MEventListener *next; /* Linked list */ } W3MEventListener; /* Event Object Structure */ typedef struct W3MEvent { W3MEventType type; const char *type_string; /* "click", "submit", etc. */ W3MElement *target; /* Event target */ W3MElement *currentTarget; /* Current target during propagation */ /* Event state */ int bubbles; int cancelable; int defaultPrevented; int propagationStopped; /* Event data */ union { struct { int button; /* Mouse button */ int clientX, clientY; /* Mouse coordinates */ } mouse; struct { int keyCode; /* Key code */ int charCode; /* Character code */ int ctrlKey, altKey, shiftKey; } keyboard; struct { char *data; /* Generic data */ } generic; } data; /* JavaScript object reference */ JSValue js_event; } W3MEvent; /* Event System State */ typedef struct { W3MEventListener *listeners[W3M_EVENT_TYPE_COUNT]; W3MEvent **event_queue; int queue_size; int queue_capacity; int processing_events; } W3MEventSystem; /* Event System Management */ W3MEventSystem *w3m_events_create_system(void); void w3m_events_destroy_system(W3MEventSystem *system); void w3m_events_process_queue(W3MEventSystem *system, W3MJSContext *ctx); /* Event Listener Management */ void w3m_events_add_listener(W3MEventSystem *system, W3MElement *target, const char *type, JSValue callback, int use_capture); void w3m_events_remove_listener(W3MEventSystem *system, W3MElement *target, const char *type, JSValue callback, int use_capture); int w3m_events_has_listener(W3MEventSystem *system, W3MElement *target, const char *type); /* Event Creation and Dispatch */ W3MEvent *w3m_events_create_event(W3MEventType type, W3MElement *target); void w3m_events_destroy_event(W3MEvent *event); int w3m_events_dispatch_event(W3MEventSystem *system, W3MJSContext *ctx, W3MEvent *event); /* Event Type Utilities */ W3MEventType w3m_events_string_to_type(const char *type_string); const char *w3m_events_type_to_string(W3MEventType type); /* Integration with w3m Input System */ int w3m_events_handle_click(Buffer *buf, Anchor *anchor); int w3m_events_handle_form_submit(Buffer *buf, FormList *form); int w3m_events_handle_key_press(Buffer *buf, int key); void w3m_events_handle_page_load(Buffer *buf); void w3m_events_handle_page_unload(Buffer *buf); /* JavaScript Event API Functions */ JSValue js_addEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_removeEventListener(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_dispatchEvent(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); /* Event Object JavaScript API */ JSValue js_event_preventDefault(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_event_stopPropagation(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_event_get_target(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_event_get_type(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); /* Event Creation from JavaScript */ JSValue js_createEvent(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); JSValue js_Event_constructor(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); /* Helper Functions */ void w3m_events_bind_to_js(W3MJSContext *ctx, W3MEventSystem *system); JSValue w3m_events_event_to_js(W3MJSContext *ctx, W3MEvent *event); W3MEvent *w3m_events_js_to_event(W3MJSContext *ctx, JSValue val); #endif /* USE_JAVASCRIPT */ #endif /* W3M_EVENTS_H */