diff options
author | Bo Yang <struggleyb.nku@gmail.com> | 2009-08-13 09:33:24 +0000 |
---|---|---|
committer | Bo Yang <struggleyb.nku@gmail.com> | 2009-08-13 09:33:24 +0000 |
commit | 13fadb12fb400818e0ccb4c38b3bfce70ccfdad2 (patch) | |
tree | 19c55b39d97567a37b88b49aaaac13b21b9f24ee /src/events/document_event.c | |
parent | bf6bc398bd40e39a016725550f5b8446a01ee2d1 (diff) | |
download | libdom-13fadb12fb400818e0ccb4c38b3bfce70ccfdad2.tar.gz libdom-13fadb12fb400818e0ccb4c38b3bfce70ccfdad2.tar.bz2 |
Merge the Events module (branches/struggleyb/libdom-events) back to trunk. :)
svn path=/trunk/dom/; revision=9236
Diffstat (limited to 'src/events/document_event.c')
-rw-r--r-- | src/events/document_event.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/events/document_event.c b/src/events/document_event.c new file mode 100644 index 0000000..47afed6 --- /dev/null +++ b/src/events/document_event.c @@ -0,0 +1,188 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2009 Bo Yang <struggleyb.nku@gmail.com> + */ + +#include <assert.h> + +#include <libwapcaplet/libwapcaplet.h> + +#include "core/string.h" +#include "core/node.h" +#include "core/document.h" +#include "events/document_event.h" +#include "events/event.h" +#include "events/ui_event.h" +#include "events/custom_event.h" +#include "events/text_event.h" +#include "events/keyboard_event.h" +#include "events/mouse_event.h" +#include "events/mouse_multi_wheel_event.h" +#include "events/mouse_wheel_event.h" +#include "events/mutation_event.h" +#include "events/mutation_name_event.h" + +#include "utils/utils.h" + +static const char *__event_types[] = { + "Event", + "CustomEvent", + "UIEvent", + "TextEvent", + "KeyboardEvent", + "MouseEvent", + "MouseMultiWheelEvent", + "MouseWheelEvent", + "MutationEvent", + "MutationNameEvent" +}; + +/** + * Initialise this DocumentEvent + * + * \param doc The document object + * \param dei The DocumentEvent internal object + * \param actions The default action fetcher, the browser should provide such + * a function to Event module. + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_document_event_internal_initialise(struct dom_document *doc, + dom_document_event_internal *dei, + dom_events_default_action_fetcher actions) +{ + lwc_error err; + lwc_context *ctx = _dom_document_get_intern_context(doc); + int i = 0; + + for (; i < DOM_EVENT_COUNT; i++) { + err = lwc_context_intern(ctx, __event_types[i], + SLEN(__event_types[i]), &dei->event_types[i]); + if (err != lwc_error_ok) + return _dom_exception_from_lwc_error(err); + } + + dei->actions = actions; + + return DOM_NO_ERR; +} + +/* Finalise this DocumentEvent */ +void _dom_document_event_internal_finalise(struct dom_document *doc, + dom_document_event_internal *dei) +{ + /* Nothing to do here */ + UNUSED(doc); + UNUSED(dei); + return; +} + +/*-------------------------------------------------------------------------*/ +/* Public API */ + +/** + * Create an Event object + * + * \param de The DocumentEvent object + * \param type The Event type + * \param evt The returned Event object + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_document_event_create_event(dom_document_event *de, + struct dom_string *type, struct dom_event **evt) +{ + lwc_context *ctx = NULL; + lwc_string *t = NULL; + dom_exception err; + struct dom_document *doc = de; + + dom_string_get_intern(type, &ctx, &t); + if (t == NULL) { + ctx = _dom_document_get_intern_context(doc); + err = _dom_string_intern(type, ctx, &t); + if (err != DOM_NO_ERR) + return err; + } + + assert(t != NULL); + + int i, et = 0; + dom_document_event_internal *dei = &de->dei; + for (i = 0; i < DOM_EVENT_COUNT; i++) { + if (dei->event_types[i] == t) { + et = i; + break; + } + } + lwc_context_string_unref(ctx, t); + + switch (et) { + case DOM_EVENT: + err = _dom_event_create(doc, evt); + break; + case DOM_CUSTOM_EVENT: + err = _dom_custom_event_create(doc, + (dom_custom_event **) evt); + break; + case DOM_UI_EVENT: + err = _dom_ui_event_create(doc, (dom_ui_event **) evt); + break; + case DOM_TEXT_EVENT: + err = _dom_text_event_create(doc, + (dom_text_event **) evt); + break; + case DOM_KEYBOARD_EVENT: + err = _dom_keyboard_event_create(doc, + (dom_keyboard_event **) evt); + break; + case DOM_MOUSE_EVENT: + err = _dom_mouse_event_create(doc, + (dom_mouse_event **) evt); + break; + case DOM_MOUSE_MULTI_WHEEL_EVENT: + err = _dom_mouse_multi_wheel_event_create(doc, + (dom_mouse_multi_wheel_event **) evt); + break; + case DOM_MOUSE_WHEEL_EVENT: + err = _dom_mouse_wheel_event_create(doc, + (dom_mouse_wheel_event **) evt); + break; + case DOM_MUTATION_EVENT: + err = _dom_mutation_event_create(doc, + (dom_mutation_event **) evt); + break; + case DOM_MUTATION_NAME_EVENT: + err = _dom_mutation_name_event_create(doc, + (dom_mutation_name_event **) evt); + break; + default: + assert("Should never be here" == NULL); + } + + return err; +} + +/** + * Tests if the implementation can generate events of a specified type + * + * \param de The DocumentEvent + * \param namespace The namespace of the event + * \param type The type of the event + * \param can True if we can generate such an event, false otherwise + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + * + * We don't support this API now, so the return value should always + * DOM_NO_SUPPORTED_ERR. + */ +dom_exception _dom_document_event_can_dispatch(dom_document_event *de, + struct dom_string *namespace, struct dom_string *type, + bool *can) +{ + UNUSED(de); + UNUSED(namespace); + UNUSED(type); + UNUSED(can); + + return DOM_NOT_SUPPORTED_ERR; +} |