From 13fadb12fb400818e0ccb4c38b3bfce70ccfdad2 Mon Sep 17 00:00:00 2001 From: Bo Yang Date: Thu, 13 Aug 2009 09:33:24 +0000 Subject: Merge the Events module (branches/struggleyb/libdom-events) back to trunk. :) svn path=/trunk/dom/; revision=9236 --- src/events/mouse_event.c | 366 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 src/events/mouse_event.c (limited to 'src/events/mouse_event.c') diff --git a/src/events/mouse_event.c b/src/events/mouse_event.c new file mode 100644 index 0000000..1b31012 --- /dev/null +++ b/src/events/mouse_event.c @@ -0,0 +1,366 @@ +/* + * This file is part of libdom. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2009 Bo Yang + */ + +#include + +#include "events/mouse_event.h" +#include "core/document.h" + +#include "utils/utils.h" + +static void _virtual_dom_mouse_event_destroy(struct dom_event *evt); + +static struct dom_event_private_vtable _event_vtable = { + _virtual_dom_mouse_event_destroy +}; + +/* Constructor */ +dom_exception _dom_mouse_event_create(struct dom_document *doc, + struct dom_mouse_event **evt) +{ + *evt = _dom_document_alloc(doc, NULL, sizeof(dom_mouse_event)); + if (*evt == NULL) + return DOM_NO_MEM_ERR; + + ((struct dom_event *) *evt)->vtable = &_event_vtable; + + return _dom_mouse_event_initialise(doc, *evt); +} + +/* Destructor */ +void _dom_mouse_event_destroy(struct dom_document *doc, + struct dom_mouse_event *evt) +{ + _dom_mouse_event_finalise(doc, (dom_ui_event *) evt); + + _dom_document_alloc(doc, evt, 0); +} + +/* Initialise function */ +dom_exception _dom_mouse_event_initialise(struct dom_document *doc, + struct dom_mouse_event *evt) +{ + evt->modifier_state = 0; + + return _dom_ui_event_initialise(doc, (dom_ui_event *) evt); +} + +/* The virtual destroy function */ +void _virtual_dom_mouse_event_destroy(struct dom_event *evt) +{ + _dom_mouse_event_destroy(evt->doc, (dom_mouse_event *) evt); +} + +/*----------------------------------------------------------------------*/ +/* The public API */ + +/** + * Get screenX + * + * \param evt The Event object + * \param x The returned screenX + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_screen_x(dom_mouse_event *evt, + long *x) +{ + *x = evt->sx; + + return DOM_NO_ERR; +} + +/** + * Get screenY + * + * \param evt The Event object + * \param y The returned screenY + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_screen_y(dom_mouse_event *evt, + long *y) +{ + *y = evt->sy; + + return DOM_NO_ERR; +} + +/** + * Get clientX + * + * \param evt The Event object + * \param x The returned clientX + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_client_x(dom_mouse_event *evt, + long *x) +{ + *x = evt->cx; + + return DOM_NO_ERR; +} + +/** + * Get clientY + * + * \param evt The Event object + * \param y The returned clientY + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_client_y(dom_mouse_event *evt, + long *y) +{ + *y = evt->cy; + + return DOM_NO_ERR; +} + +/** + * Get the ctrl key state + * + * \param evt The Event object + * \param key Whether the Control key is pressed down + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_ctrl_key(dom_mouse_event *evt, + bool *key) +{ + *key = ((evt->modifier_state & DOM_MOD_CTRL) != 0); + + return DOM_NO_ERR; +} + +/** + * Get the shift key state + * + * \param evt The Event object + * \param key Whether the Shift key is pressed down + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_shift_key(dom_mouse_event *evt, + bool *key) +{ + *key = ((evt->modifier_state & DOM_MOD_SHIFT) != 0); + + return DOM_NO_ERR; +} + +/** + * Get the alt key state + * + * \param evt The Event object + * \param key Whether the Alt key is pressed down + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_alt_key(dom_mouse_event *evt, + bool *key) +{ + *key = ((evt->modifier_state & DOM_MOD_ALT) != 0); + + return DOM_NO_ERR; +} + +/** + * Get the meta key state + * + * \param evt The Event object + * \param key Whether the Meta key is pressed down + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_meta_key(dom_mouse_event *evt, + bool *key) +{ + *key = ((evt->modifier_state & DOM_MOD_META) != 0); + + return DOM_NO_ERR; +} + +/** + * Get the button which get pressed + * + * \param evt The Event object + * \param button The pressed mouse button + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_button(dom_mouse_event *evt, + unsigned short *button) +{ + *button = evt->button; + + return DOM_NO_ERR; +} + +/** + * Get the related target + * + * \param evt The Event object + * \param et The related EventTarget + * \return DOM_NO_ERR. + */ +dom_exception _dom_mouse_event_get_related_target(dom_mouse_event *evt, + dom_event_target **et) +{ + *et = evt->related_target; + + return DOM_NO_ERR; +} + +/** + * Query the state of a modifier using a key identifier + * + * \param evt The event object + * \param ml The modifier identifier, such as "Alt", "Control", "Meta", + * "AltGraph", "CapsLock", "NumLock", "Scroll", "Shift". + * \param state Whether the modifier key is pressed + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + * + * @note: If an application wishes to distinguish between right and left + * modifiers, this information could be deduced using keyboard events and + * KeyboardEvent.keyLocation. + */ +dom_exception _dom_mouse_event_get_modifier_state(dom_mouse_event *evt, + struct dom_string *m, bool *state) +{ + if (m == NULL) { + *state = false; + return DOM_NO_ERR; + } + + const char *data = _dom_string_data(m); + size_t len = _dom_string_length(m); + + if (len == SLEN("AltGraph") && strncmp(data, "AltGraph", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_ALT_GRAPH) != 0); + } else if (len == SLEN("Alt") && strncmp(data, "Alt", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_ALT) != 0); + } else if (len == SLEN("CapsLock") && + strncmp(data, "CapsLock", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_CAPS_LOCK) != 0); + } else if (len == SLEN("Control") && + strncmp(data, "Control", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_CTRL) != 0); + } else if (len == SLEN("Meta") && strncmp(data, "Meta", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_META) != 0); + } else if (len == SLEN("NumLock") && + strncmp(data, "NumLock", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_NUM_LOCK) != 0); + } else if (len == SLEN("Scroll") && + strncmp(data, "Scroll", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_SCROLL) != 0); + } else if (len == SLEN("Shift") && strncmp(data, "Shift", len) == 0) { + *state = ((evt->modifier_state & DOM_MOD_SHIFT) != 0); + } + + return DOM_NO_ERR; +} + +/** + * Initialise this mouse event + * + * \param evt The Event object + * \param type The event's type + * \param bubble Whether this is a bubbling event + * \param cancelable Whether this is a cancelable event + * \param view The AbstractView associated with this event + * \param detail The detail information of this mouse event + * \param screen_x The x position of the mouse pointer in screen + * \param screen_y The y position of the mouse pointer in screen + * \param client_x The x position of the mouse pointer in client window + * \param client_y The y position of the mouse pointer in client window + * \param alt The state of Alt key, true for pressed, false otherwise + * \param shift The state of Shift key, true for pressed, false otherwise + * \param mata The state of Meta key, true for pressed, false otherwise + * \param button The mouse button pressed + * \param et The related target of this event, may be NULL + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_mouse_event_init(dom_mouse_event *evt, + struct dom_string *type, bool bubble, bool cancelable, + struct dom_abstract_view *view, long detail, long screen_x, + long screen_y, long client_x, long client_y, bool ctrl, + bool alt, bool shift, bool meta, unsigned short button, + dom_event_target *et) +{ + evt->sx = screen_x; + evt->sy = screen_y; + evt->cx = client_x; + evt->cy = client_y; + + evt->modifier_state = 0; + if (ctrl == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_CTRL; + } + if (alt == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_ALT; + } + if (shift == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_SHIFT; + } + if (meta == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_META; + } + + evt->button = button; + evt->related_target = et; + + return _dom_ui_event_init(&evt->base, type, bubble, cancelable, view, + detail); +} + +/** + * Initialise the event with namespace + * + * \param evt The Event object + * \param namespace The namespace of this event + * \param type The event's type + * \param bubble Whether this is a bubbling event + * \param cancelable Whether this is a cancelable event + * \param view The AbstractView associated with this event + * \param detail The detail information of this mouse event + * \param screen_x The x position of the mouse pointer in screen + * \param screen_y The y position of the mouse pointer in screen + * \param client_x The x position of the mouse pointer in client window + * \param client_y The y position of the mouse pointer in client window + * \param alt The state of Alt key, true for pressed, false otherwise + * \param shift The state of Shift key, true for pressed, false otherwise + * \param mata The state of Meta key, true for pressed, false otherwise + * \param button The mouse button pressed + * \param et The related target of this event, may be NULL + * \return DOM_NO_ERR on success, appropriate dom_exception on failure. + */ +dom_exception _dom_mouse_event_init_ns(dom_mouse_event *evt, + struct dom_string *namespace, struct dom_string *type, + bool bubble, bool cancelable, struct dom_abstract_view *view, + long detail, long screen_x, long screen_y, long client_x, + long client_y, bool ctrl, bool alt, bool shift, bool meta, + unsigned short button, dom_event_target *et) +{ + evt->sx = screen_x; + evt->sy = screen_y; + evt->cx = client_x; + evt->cy = client_y; + + evt->modifier_state = 0; + if (ctrl == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_CTRL; + } + if (alt == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_ALT; + } + if (shift == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_SHIFT; + } + if (meta == true) { + evt->modifier_state = evt->modifier_state | DOM_MOD_META; + } + + evt->button = button; + evt->related_target = et; + + return _dom_ui_event_init_ns(&evt->base, namespace, type, bubble, + cancelable, view, detail); +} + -- cgit v1.2.3