r13299 jmb - in /branches/jmb/dom-alloc-purge: include/dom/events/ src/core/ src/events/
by netsurf@semichrome.net
Author: jmb
Date: Mon Dec 19 16:44:57 2011
New Revision: 13299
URL: http://source.netsurf-browser.org?rev=13299&view=rev
Log:
Fix event dispatch.
Fixup event implementations.
Added:
branches/jmb/dom-alloc-purge/src/events/dispatch.c
branches/jmb/dom-alloc-purge/src/events/dispatch.h
Modified:
branches/jmb/dom-alloc-purge/include/dom/events/document_event.h
branches/jmb/dom-alloc-purge/src/core/element.c
branches/jmb/dom-alloc-purge/src/core/node.c
branches/jmb/dom-alloc-purge/src/core/node.h
branches/jmb/dom-alloc-purge/src/events/Makefile
branches/jmb/dom-alloc-purge/src/events/custom_event.c
branches/jmb/dom-alloc-purge/src/events/custom_event.h
branches/jmb/dom-alloc-purge/src/events/document_event.c
branches/jmb/dom-alloc-purge/src/events/event_listener.c
branches/jmb/dom-alloc-purge/src/events/event_target.c
branches/jmb/dom-alloc-purge/src/events/event_target.h
branches/jmb/dom-alloc-purge/src/events/keyboard_event.c
branches/jmb/dom-alloc-purge/src/events/keyboard_event.h
branches/jmb/dom-alloc-purge/src/events/mouse_event.c
branches/jmb/dom-alloc-purge/src/events/mouse_event.h
branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.c
branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.h
branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.c
branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.h
branches/jmb/dom-alloc-purge/src/events/mutation_event.c
branches/jmb/dom-alloc-purge/src/events/mutation_event.h
branches/jmb/dom-alloc-purge/src/events/mutation_name_event.c
branches/jmb/dom-alloc-purge/src/events/mutation_name_event.h
branches/jmb/dom-alloc-purge/src/events/text_event.c
branches/jmb/dom-alloc-purge/src/events/text_event.h
branches/jmb/dom-alloc-purge/src/events/ui_event.c
branches/jmb/dom-alloc-purge/src/events/ui_event.h
Modified: branches/jmb/dom-alloc-purge/include/dom/events/document_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/include/do...
==============================================================================
--- branches/jmb/dom-alloc-purge/include/dom/events/document_event.h (original)
+++ branches/jmb/dom-alloc-purge/include/dom/events/document_event.h Mon Dec 19 16:44:57 2011
@@ -15,7 +15,6 @@
struct dom_event;
struct dom_document;
-struct lwc_string_s;
typedef struct dom_document dom_document_event;
@@ -80,7 +79,7 @@
* \return a callback function, NULL if there is none.
*/
typedef dom_default_action_callback (*dom_events_default_action_fetcher)
- (struct lwc_string_s *type, dom_default_action_phase phase,
+ (dom_string *type, dom_default_action_phase phase,
void **pw);
dom_exception _dom_document_event_create_event(dom_document_event *de,
Modified: branches/jmb/dom-alloc-purge/src/core/element.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/core/e...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/core/element.c (original)
+++ branches/jmb/dom-alloc-purge/src/core/element.c Mon Dec 19 16:44:57 2011
@@ -1229,10 +1229,8 @@
return err;
}
- err = _dom_dispatch_node_change_event(doc,
- (dom_event_target *) attr,
- (dom_event_target *) element,
- DOM_MUTATION_ADDITION, &success);
+ err = dom_node_dispatch_node_change_event(doc,
+ attr, element, DOM_MUTATION_ADDITION, &success);
if (err != DOM_NO_ERR) {
dom_node_set_parent(attr, NULL);
dom_node_unref(attr);
@@ -1286,10 +1284,8 @@
/* Disptach DOMNodeRemoval event */
bool success = true;
struct dom_document *doc = dom_node_get_owner(element);
- err = _dom_dispatch_node_change_event(doc,
- (dom_event_target *) a,
- (dom_event_target *) element,
- DOM_MUTATION_REMOVAL, &success);
+ err = dom_node_dispatch_node_change_event(doc,
+ a, element, DOM_MUTATION_REMOVAL, &success);
if (err != DOM_NO_ERR)
return err;
@@ -1416,10 +1412,8 @@
/* Disptach DOMNodeRemoval event */
bool success = true;
struct dom_document *doc = dom_node_get_owner(element);
- err = _dom_dispatch_node_change_event(doc,
- (dom_event_target *) a,
- (dom_event_target *) element,
- DOM_MUTATION_REMOVAL, &success);
+ err = dom_node_dispatch_node_change_event(doc,
+ a, element, DOM_MUTATION_REMOVAL, &success);
if (err != DOM_NO_ERR) {
dom_string_unref(name);
return err;
@@ -1490,9 +1484,8 @@
return err;
}
- err = _dom_dispatch_node_change_event(doc, (dom_event_target *) attr,
- (dom_event_target *) element, DOM_MUTATION_ADDITION,
- &success);
+ err = dom_node_dispatch_node_change_event(doc, attr, element,
+ DOM_MUTATION_ADDITION, &success);
if (err != DOM_NO_ERR)
return err;
@@ -1549,9 +1542,8 @@
/* Dispatch a DOMNodeRemoved event */
bool success = true;
struct dom_document *doc = dom_node_get_owner(element);
- err = _dom_dispatch_node_change_event(doc, (dom_event_target *) a,
- (dom_event_target *) element, DOM_MUTATION_REMOVAL,
- &success);
+ err = dom_node_dispatch_node_change_event(doc, a, element,
+ DOM_MUTATION_REMOVAL, &success);
if (err != DOM_NO_ERR) {
dom_string_unref(name);
return err;
Modified: branches/jmb/dom-alloc-purge/src/core/node.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/core/n...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/core/node.c (original)
+++ branches/jmb/dom-alloc-purge/src/core/node.c Mon Dec 19 16:44:57 2011
@@ -34,6 +34,7 @@
#include "core/pi.h"
#include "core/text.h"
#include "utils/utils.h"
+#include "utils/validate.h"
#include "events/mutation_event.h"
static bool _dom_node_permitted_child(const dom_node_internal *parent,
@@ -969,7 +970,7 @@
/* Dispatch a DOMNodeRemoval event */
dom_exception err;
bool success = true;
- err = _dom_dispatch_node_change_event(node->owner, old_child, node,
+ err = dom_node_dispatch_node_change_event(node->owner, old_child, node,
DOM_MUTATION_REMOVAL, &success);
if (err != DOM_NO_ERR)
return err;
@@ -2051,8 +2052,8 @@
for (dom_node_internal *n = first; n != last->next; n = n->next) {
n->parent = parent;
/* Dispatch a DOMNodeInserted event */
- err = _dom_dispatch_node_change_event(parent->owner, n, parent,
- DOM_MUTATION_ADDITION, &success);
+ err = dom_node_dispatch_node_change_event(parent->owner,
+ n, parent, DOM_MUTATION_ADDITION, &success);
if (err != DOM_NO_ERR)
return err;
}
@@ -2091,7 +2092,7 @@
dom_node_internal *parent = first->parent;
for (dom_node_internal *n = first; n != last->next; n = n->next) {
/* Dispatch a DOMNodeRemoval event */
- _dom_dispatch_node_change_event(n->owner, n, n->parent,
+ dom_node_dispatch_node_change_event(n->owner, n, n->parent,
DOM_MUTATION_REMOVAL, &success);
n->parent = NULL;
@@ -2246,3 +2247,262 @@
}
}
+/******************************************************************************
+ * Event Target API *
+ ******************************************************************************/
+
+dom_exception _dom_node_add_event_listener(dom_event_target *et,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture)
+{
+ dom_node_internal *node = (dom_node_internal *) et;
+
+ return _dom_event_target_add_event_listener(&node->eti, type,
+ listener, capture);
+}
+
+dom_exception _dom_node_remove_event_listener(dom_event_target *et,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture)
+{
+ dom_node_internal *node = (dom_node_internal *) et;
+
+ return _dom_event_target_remove_event_listener(&node->eti,
+ type, listener, capture);
+}
+
+dom_exception _dom_node_add_event_listener_ns(dom_event_target *et,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture)
+{
+ dom_node_internal *node = (dom_node_internal *) et;
+
+ return _dom_event_target_add_event_listener_ns(&node->eti,
+ namespace, type, listener, capture);
+}
+
+dom_exception _dom_node_remove_event_listener_ns(dom_event_target *et,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture)
+{
+ dom_node_internal *node = (dom_node_internal *) et;
+
+ return _dom_event_target_remove_event_listener_ns(&node->eti,
+ namespace, type, listener, capture);
+}
+
+/**
+ * Dispatch an event into the implementation's event model
+ *
+ * \param et The EventTarget object
+ * \param eti Internal EventTarget
+ * \param evt The event object
+ * \param success Indicates whether any of the listeners which handled the
+ * event called Event.preventDefault(). If
+ * Event.preventDefault() was called the returned value is
+ * false, else it is true.
+ * \return DOM_NO_ERR on success
+ * DOM_DISPATCH_REQUEST_ERR If the event is already in dispatch
+ * DOM_UNSPECIFIED_EVENT_TYPE_ERR If the type of the event is Null or
+ * empty string.
+ * DOM_NOT_SUPPORTED_ERR If the event is not created by
+ * Document.createEvent
+ * DOM_INVALID_CHARACTER_ERR If the type of this event is not a
+ * valid NCName.
+ */
+dom_exception _dom_node_dispatch_event(dom_event_target *et,
+ struct dom_event *evt, bool *success)
+{
+ dom_exception err, ret = DOM_NO_ERR;
+
+ assert(et != NULL);
+ assert(evt != NULL);
+
+ /* To test whether this event is in dispatch */
+ if (evt->in_dispatch == true) {
+ return DOM_DISPATCH_REQUEST_ERR;
+ } else {
+ evt->in_dispatch = true;
+ }
+
+ if (evt->type == NULL || dom_string_length(evt->type) == 0) {
+ return DOM_UNSPECIFIED_EVENT_TYPE_ERR;
+ }
+
+ if (evt->doc == NULL)
+ return DOM_NOT_SUPPORTED_ERR;
+
+ dom_document *doc = dom_node_get_owner(et);
+ if (doc == NULL) {
+ /* TODO: In the progress of parsing, many Nodes in the DTD has
+ * no document at all, do nothing for this kind of node */
+ return DOM_NO_ERR;
+ }
+
+ if (_dom_validate_ncname(evt->type) == false) {
+ return DOM_INVALID_CHARACTER_ERR;
+ }
+
+ dom_event_target_entry list;
+ dom_node_internal *target = (dom_node_internal *) et;
+
+ *success = true;
+
+ /* Compose the event target list */
+ list_init(&list.entry);
+ list.et = et;
+ dom_node_ref(et);
+ target = target->parent;
+
+ while (target != NULL) {
+ dom_event_target_entry *l = malloc(
+ sizeof(dom_event_target_entry));
+ if (l == NULL) {
+ ret = DOM_NO_MEM_ERR;
+ goto cleanup;
+ }
+ list_append(&list.entry, &l->entry);
+ l->et = (dom_event_target *) target;
+ dom_node_ref(target);
+ target = target->parent;
+ }
+
+ /* Fill the target of the event */
+ evt->target = et;
+ evt->phase = DOM_CAPTURING_PHASE;
+
+ /* The started callback of default action */
+ dom_document_event_internal *dei = &doc->dei;
+ void *pw = NULL;
+ if (dei->actions != NULL) {
+ dom_default_action_callback cb = dei->actions(evt->type,
+ DOM_DEFAULT_ACTION_STARTED, &pw);
+ if (cb != NULL) {
+ cb(evt, pw);
+ }
+ }
+
+ /* The capture phase */
+ struct list_entry *e = list.entry.prev;
+ for (; e != &list.entry; e = e->prev) {
+ dom_event_target_entry *l = (dom_event_target_entry *) e;
+ dom_node_internal *node = (dom_node_internal *) l->et;
+
+ err = _dom_event_target_dispatch(l->et, &node->eti, evt,
+ DOM_CAPTURING_PHASE, success);
+ if (err != DOM_NO_ERR) {
+ ret = err;
+ goto cleanup;
+ }
+ /* If the stopImmediatePropagation or stopPropagation is
+ * called, we should break */
+ if (evt->stop_now == true || evt->stop == true)
+ goto cleanup;
+ }
+
+ /* Target phase */
+ evt->phase = DOM_AT_TARGET;
+ evt->current = et;
+ err = _dom_event_target_dispatch(et, &((dom_node_internal *) et)->eti,
+ evt, DOM_AT_TARGET, success);
+ if (evt->stop_now == true || evt->stop == true)
+ goto cleanup;
+
+ /* Bubbling phase */
+ evt->phase = DOM_BUBBLING_PHASE;
+
+ e = list.entry.next;
+ for (; e != &list.entry; e = e->next) {
+ dom_event_target_entry *l = (dom_event_target_entry *) e;
+ dom_node_internal *node = (dom_node_internal *) l->et;
+ err = _dom_event_target_dispatch(l->et, &node->eti, evt,
+ DOM_BUBBLING_PHASE, success);
+ if (err != DOM_NO_ERR) {
+ ret = err;
+ goto cleanup;
+ }
+ /* If the stopImmediatePropagation or stopPropagation is
+ * called, we should break */
+ if (evt->stop_now == true || evt->stop == true)
+ goto cleanup;
+ }
+
+ if (dei->actions == NULL)
+ goto cleanup;
+
+ /* The end callback of default action */
+ if (evt->prevent_default != true) {
+ dom_default_action_callback cb = dei->actions(evt->type,
+ DOM_DEFAULT_ACTION_END, &pw);
+ if (cb != NULL) {
+ cb(evt, pw);
+ }
+ }
+
+ /* The prevented callback of default action */
+ if (evt->prevent_default != true) {
+ dom_default_action_callback cb = dei->actions(evt->type,
+ DOM_DEFAULT_ACTION_PREVENTED, &pw);
+ if (cb != NULL) {
+ cb(evt, pw);
+ }
+ }
+
+cleanup:
+ if (evt->prevent_default == true) {
+ *success = false;
+ }
+
+ while (list.entry.next != &list.entry) {
+ dom_event_target_entry *e = (dom_event_target_entry *)
+ list.entry.next;
+ dom_node_unref(e->et);
+ list_del(list.entry.next);
+ free(e);
+ }
+
+ dom_node_unref(et);
+
+ return ret;
+}
+
+dom_exception _dom_node_dispatch_node_change_event(dom_document *doc,
+ dom_node_internal *node, dom_node_internal *related,
+ dom_mutation_type change, bool *success)
+{
+ dom_node_internal *target;
+ dom_exception err;
+
+ /* Fire change event at immediate target */
+ err = _dom_dispatch_node_change_event(doc, node, related,
+ change, success);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ /* Fire document change event at subtree */
+ target = node->first_child;
+ while (target != NULL) {
+ err = _dom_dispatch_node_change_document_event(doc, target,
+ change, success);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ if (target->first_child != NULL) {
+ target = target->first_child;
+ } else if (target->next != NULL) {
+ target = target->next;
+ } else {
+ dom_node_internal *parent = target->parent;
+
+ while (parent != node && target == parent->last_child) {
+ target = parent;
+ parent = target->parent;
+ }
+
+ target = target->next;
+ }
+ }
+
+ return DOM_NO_ERR;
+}
+
Modified: branches/jmb/dom-alloc-purge/src/core/node.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/core/n...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/core/node.h (original)
+++ branches/jmb/dom-alloc-purge/src/core/node.h Mon Dec 19 16:44:57 2011
@@ -90,6 +90,22 @@
void _dom_node_finalise(dom_node_internal *node);
bool _dom_node_readonly(const dom_node_internal *node);
+
+/* Event Target implementation */
+dom_exception _dom_node_add_event_listener(dom_event_target *et,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture);
+dom_exception _dom_node_remove_event_listener(dom_event_target *et,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture);
+dom_exception _dom_node_add_event_listener_ns(dom_event_target *et,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture);
+dom_exception _dom_node_remove_event_listener_ns(dom_event_target *et,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture);
+dom_exception _dom_node_dispatch_event(dom_event_target *et,
+ struct dom_event *evt, bool *success);
/* The DOM Node's vtable methods */
dom_exception _dom_node_get_node_name(dom_node_internal *node,
@@ -171,13 +187,12 @@
dom_exception _dom_node_get_user_data(dom_node_internal *node,
dom_string *key, void **result);
-/** \todo EventTarget */
#define DOM_NODE_EVENT_TARGET_VTABLE \
- NULL, /* add_event_listener */ \
- NULL, /* remove_event_listener */ \
- NULL, /* dispatch_event */ \
- NULL, /* add_event_listener_ns */ \
- NULL /* remove_event_listener_ns */
+ _dom_node_add_event_listener, \
+ _dom_node_remove_event_listener, \
+ _dom_node_dispatch_event, \
+ _dom_node_add_event_listener_ns, \
+ _dom_node_remove_event_listener_ns
#define DOM_NODE_VTABLE \
_dom_node_get_node_name, \
@@ -281,4 +296,15 @@
#define dom_node_remove_pending(n) _dom_node_remove_pending(\
(dom_node_internal *) (n))
+dom_exception _dom_node_dispatch_node_change_event(dom_document *doc,
+ dom_node_internal *node, dom_node_internal *related,
+ dom_mutation_type change, bool *success);
+#define dom_node_dispatch_node_change_event( \
+ doc, node, related, change, success) \
+ _dom_node_dispatch_node_change_event((dom_document *) (doc), \
+ (dom_node_internal *) (node), \
+ (dom_node_internal *) (related), \
+ (dom_mutation_type) (change), \
+ (bool *) (success))
+
#endif
Modified: branches/jmb/dom-alloc-purge/src/events/Makefile
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/Makefile (original)
+++ branches/jmb/dom-alloc-purge/src/events/Makefile Mon Dec 19 16:44:57 2011
@@ -1,5 +1,5 @@
# Sources
-DIR_SOURCES := event.c event_target.c document_event.c \
+DIR_SOURCES := event.c dispatch.c event_target.c document_event.c \
custom_event.c keyboard_event.c mouse_wheel_event.c \
text_event.c event_listener.c mouse_event.c mutation_event.c \
ui_event.c mouse_multi_wheel_event.c mutation_name_event.c
Modified: branches/jmb/dom-alloc-purge/src/events/custom_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/custom_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/custom_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/custom_event.h"
@@ -19,7 +21,7 @@
dom_exception _dom_custom_event_create(struct dom_document *doc,
struct dom_custom_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_custom_event));
+ *evt = malloc(sizeof(dom_custom_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -29,12 +31,11 @@
}
/* Destructor */
-void _dom_custom_event_destroy(struct dom_document *doc,
- struct dom_custom_event *evt)
+void _dom_custom_event_destroy(struct dom_custom_event *evt)
{
- _dom_custom_event_finalise(doc, evt);
+ _dom_custom_event_finalise(evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -46,17 +47,16 @@
}
/* Finalise function */
-void _dom_custom_event_finalise(struct dom_document *doc,
- struct dom_custom_event *evt)
+void _dom_custom_event_finalise(struct dom_custom_event *evt)
{
evt->detail = NULL;
- _dom_event_finalise(doc, &evt->base);
+ _dom_event_finalise(&evt->base);
}
/* The virtual destroy function */
void _virtual_dom_custom_event_destroy(struct dom_event *evt)
{
- _dom_custom_event_destroy(evt->doc, (dom_custom_event *) evt);
+ _dom_custom_event_destroy((dom_custom_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/custom_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/custom_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/custom_event.h Mon Dec 19 16:44:57 2011
@@ -22,15 +22,13 @@
struct dom_custom_event **evt);
/* Destructor */
-void _dom_custom_event_destroy(struct dom_document *doc,
- struct dom_custom_event *evt);
+void _dom_custom_event_destroy(struct dom_custom_event *evt);
/* Initialise function */
dom_exception _dom_custom_event_initialise(struct dom_document *doc,
struct dom_custom_event *evt);
/* Finalise function */
-void _dom_custom_event_finalise(struct dom_document *doc,
- struct dom_custom_event *evt);
+void _dom_custom_event_finalise(struct dom_custom_event *evt);
#endif
Added: branches/jmb/dom-alloc-purge/src/events/dispatch.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/dispatch.c (added)
+++ branches/jmb/dom-alloc-purge/src/events/dispatch.c Mon Dec 19 16:44:57 2011
@@ -1,0 +1,296 @@
+/*
+ * 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(a)gmail.com>
+ */
+
+#include <assert.h>
+
+#include "events/dispatch.h"
+#include "events/mutation_event.h"
+
+#include "utils/utils.h"
+
+/**
+ * Dispatch a DOMNodeInserted/DOMNodeRemoved event
+ *
+ * \param doc The document object
+ * \param et The EventTarget object
+ * \param type "DOMNodeInserted" or "DOMNodeRemoved"
+ * \param related The parent of the removed/inserted node
+ * \param success Whether this event's default action get called
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception __dom_dispatch_node_change_event(dom_document *doc,
+ dom_event_target *et, dom_event_target *related,
+ dom_mutation_type change, bool *success)
+{
+ struct dom_mutation_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_mutation_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ if (change == DOM_MUTATION_ADDITION) {
+ err = dom_string_create((const uint8_t *) "DOMNodeInserted",
+ SLEN("DOMNodeInserted"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+ } else if (change == DOM_MUTATION_REMOVAL) {
+ err = dom_string_create((const uint8_t *) "DOMNodeRemoval",
+ SLEN("DOMNodeRemoved"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+ } else {
+ assert("Should never be here" == NULL);
+ }
+
+ /* Initialise the event with corresponding parameters */
+ err = dom_mutation_event_init(evt, type, true, false,
+ related, NULL, NULL, NULL, change);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR) {
+ goto cleanup;
+ }
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+cleanup:
+ _dom_mutation_event_destroy(evt);
+
+ return err;
+}
+
+/**
+ * Dispatch a DOMNodeInsertedIntoDocument/DOMNodeRemovedFromDocument event
+ *
+ * \param doc The document object
+ * \param et The EventTarget object
+ * \param type "DOMNodeInserted" or "DOMNodeRemoved"
+ * \param success Whether this event's default action get called
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception __dom_dispatch_node_change_document_event(dom_document *doc,
+ dom_event_target *et, dom_mutation_type change, bool *success)
+{
+ struct dom_mutation_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_mutation_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ if (change == DOM_MUTATION_ADDITION) {
+ err = dom_string_create(
+ (const uint8_t *)
+ "DOMNodeInsertedIntoDocument",
+ SLEN("DOMNodeInsertedIntoDocument"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+ } else if (change == DOM_MUTATION_REMOVAL) {
+ err = dom_string_create(
+ (const uint8_t *) "DOMNodeRemovedFromDocument",
+ SLEN("DOMNodeRemovedFromDocument"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+ } else {
+ assert("Should never be here" == NULL);
+ }
+
+ /* Initialise the event with corresponding parameters */
+ err = dom_mutation_event_init(evt, type, true, false, NULL,
+ NULL, NULL, NULL, change);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+cleanup:
+ _dom_mutation_event_destroy(evt);
+
+ return err;
+}
+
+/**
+ * Dispatch a DOMAttrModified event
+ *
+ * \param doc The Document object
+ * \param et The EventTarget
+ * \param prev The previous value before change
+ * \param new The new value after change
+ * \param related The related EventTarget
+ * \param attr_name The Attribute name
+ * \param change How this attribute change
+ * \param success Whether this event's default handler get called
+ * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
+ */
+dom_exception __dom_dispatch_attr_modified_event(dom_document *doc,
+ dom_event_target *et, dom_string *prev, dom_string *new,
+ dom_event_target *related, dom_string *attr_name,
+ dom_mutation_type change, bool *success)
+{
+ struct dom_mutation_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_mutation_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ err = dom_string_create((const uint8_t *) "DOMAttrModified",
+ SLEN("DOMAttrModified"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+ /* Initialise the event with corresponding parameters */
+ err = dom_mutation_event_init(evt, type, true, false, related,
+ prev, new, attr_name, change);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR) {
+ goto cleanup;
+ }
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+
+cleanup:
+ _dom_mutation_event_destroy(evt);
+
+ return err;
+}
+
+/**
+ * Dispatch a DOMCharacterDataModified event
+ *
+ * \param et The EventTarget object
+ * \param prev The preValue of the DOMCharacterData
+ * \param new The newValue of the DOMCharacterData
+ * \param success Whether this event's default handler get called
+ * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
+ *
+ * TODO:
+ * The character_data object may be a part of a Attr node, if so, another
+ * DOMAttrModified event should be dispatched, too. But for now, we did not
+ * support any XML feature, so just leave it as this.
+ */
+dom_exception __dom_dispatch_characterdata_modified_event(
+ dom_document *doc, dom_event_target *et,
+ dom_string *prev, dom_string *new, bool *success)
+{
+ struct dom_mutation_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_mutation_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ err = dom_string_create((const uint8_t *) "DOMCharacterDataModified",
+ SLEN("DOMCharacterDataModified"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+ err = dom_mutation_event_init(evt, type, true, false, et, prev,
+ new, NULL, DOM_MUTATION_MODIFICATION);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR) {
+ goto cleanup;
+ }
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+
+cleanup:
+ _dom_mutation_event_destroy(evt);
+
+ return err;
+}
+
+/**
+ * Dispatch a DOMSubtreeModified event
+ *
+ * \param doc The Document
+ * \param et The EventTarget object
+ * \param success Whether this event's default handler get called
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception __dom_dispatch_subtree_modified_event(dom_document *doc,
+ dom_event_target *et, bool *success)
+{
+ struct dom_mutation_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_mutation_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ err = dom_string_create((const uint8_t *) "DOMSubtreeModified",
+ SLEN("DOMSubtreeModified"), &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+ err = dom_mutation_event_init(evt, type, true, false, et, NULL,
+ NULL, NULL, DOM_MUTATION_MODIFICATION);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR) {
+ goto cleanup;
+ }
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+
+cleanup:
+ _dom_mutation_event_destroy(evt);
+
+ return err;
+}
+
+/**
+ * Dispatch a generic event
+ *
+ * \param doc The Document
+ * \param et The EventTarget object
+ * \param name The name of the event
+ * \param len The length of the name string
+ * \param bubble Whether this event bubbles
+ * \param cancelable Whether this event can be cancelable
+ * \param success Whether this event's default handler get called
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception _dom_dispatch_generic_event(dom_document *doc,
+ dom_event_target *et, const uint8_t *name, size_t len,
+ bool bubble, bool cancelable, bool *success)
+{
+ struct dom_event *evt;
+ dom_string *type = NULL;
+ dom_exception err;
+
+ err = _dom_event_create(doc, &evt);
+ if (err != DOM_NO_ERR)
+ return err;
+
+ err = dom_string_create(name, len, &type);
+ if (err != DOM_NO_ERR)
+ goto cleanup;
+
+ err = dom_event_init(evt, type, bubble, cancelable);
+ dom_string_unref(type);
+ if (err != DOM_NO_ERR) {
+ goto cleanup;
+ }
+
+ err = dom_event_target_dispatch_event(et, evt, success);
+
+cleanup:
+ _dom_event_destroy(evt);
+
+ return err;
+}
+
Added: branches/jmb/dom-alloc-purge/src/events/dispatch.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/dispatch.h (added)
+++ branches/jmb/dom-alloc-purge/src/events/dispatch.h Mon Dec 19 16:44:57 2011
@@ -1,0 +1,77 @@
+/*
+ * 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(a)gmail.com>
+ */
+
+#ifndef dom_internal_events_dispatch_h_
+#define dom_internal_events_dispatch_h_
+
+#include <dom/core/document.h>
+#include <dom/events/event.h>
+#include <dom/events/mutation_event.h>
+
+/* Dispatch a DOMNodeInserted/DOMNodeRemoved event */
+dom_exception __dom_dispatch_node_change_event(dom_document *doc,
+ dom_event_target *et, dom_event_target *related,
+ dom_mutation_type change, bool *success);
+#define _dom_dispatch_node_change_event(doc, et, related, change, success) \
+ __dom_dispatch_node_change_event((dom_document *) (doc), \
+ (dom_event_target *) (et), \
+ (dom_event_target *) (related), \
+ (dom_mutation_type) (change), \
+ (bool *) (success))
+
+/* Dispatch a DOMNodeInsertedIntoDocument/DOMNodeRemovedFromDocument event */
+dom_exception __dom_dispatch_node_change_document_event(dom_document *doc,
+ dom_event_target *et, dom_mutation_type change, bool *success);
+#define _dom_dispatch_node_change_document_event(doc, et, change, success) \
+ __dom_dispatch_node_change_document_event((dom_document *) (doc), \
+ (dom_event_target *) (et), \
+ (dom_mutation_type) (change), \
+ (bool *) (success))
+
+/* Dispatch a DOMCharacterDataModified event */
+dom_exception __dom_dispatch_characterdata_modified_event(
+ dom_document *doc, dom_event_target *et,
+ dom_string *prev, dom_string *new, bool *success);
+#define _dom_dispatch_characterdata_modified_event(doc, et, \
+ prev, new, success) \
+ __dom_dispatch_characterdata_modified_event((dom_document *) (doc), \
+ (dom_event_target *) (et), \
+ (dom_string *) (prev), \
+ (dom_string *) (new), \
+ (bool *) (success))
+
+/* Dispatch a DOMAttrModified event */
+dom_exception __dom_dispatch_attr_modified_event(dom_document *doc,
+ dom_event_target *et, dom_string *prev,
+ dom_string *new, dom_event_target *related,
+ dom_string *attr_name, dom_mutation_type change,
+ bool *success);
+#define _dom_dispatch_attr_modified_event(doc, et, prev, new, \
+ related, attr_name, change, success) \
+ __dom_dispatch_attr_modified_event((dom_document *) (doc), \
+ (dom_event_target *) (et), \
+ (dom_string *) (prev), \
+ (dom_string *) (new), \
+ (dom_event_target *) (related), \
+ (dom_string *) (attr_name), \
+ (dom_mutation_type) (change), \
+ (bool *) (success))
+
+/* Dispatch a DOMSubtreeModified event */
+dom_exception __dom_dispatch_subtree_modified_event(dom_document *doc,
+ dom_event_target *et, bool *success);
+#define _dom_dispatch_subtree_modified_event(doc, et, success) \
+ __dom_dispatch_subtree_modified_event((dom_document *) (doc), \
+ (dom_event_target *) (et), \
+ (bool *) (success))
+
+/* Dispatch a generic event */
+dom_exception _dom_dispatch_generic_event(dom_document *doc,
+ dom_event_target *et, const uint8_t *name, size_t len,
+ bool bubble, bool cancelable, bool *success);
+
+#endif
Modified: branches/jmb/dom-alloc-purge/src/events/document_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/document_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/document_event.c Mon Dec 19 16:44:57 2011
@@ -97,12 +97,9 @@
dom_exception err;
struct dom_document *doc = de;
- dom_string_get_intern(type, &t);
- if (t == NULL) {
- err = _dom_string_intern(type, &t);
- if (err != DOM_NO_ERR)
- return err;
- }
+ err = dom_string_intern(type, &t);
+ if (err != DOM_NO_ERR)
+ return err;
assert(t != NULL);
Modified: branches/jmb/dom-alloc-purge/src/events/event_listener.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/event_listener.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/event_listener.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/event_listener.h"
#include "core/document.h"
@@ -20,8 +22,7 @@
dom_exception dom_event_listener_create(struct dom_document *doc,
handle_event handler, void *pw, dom_event_listener **listener)
{
- dom_event_listener *ret = (dom_event_listener *) _dom_document_alloc(
- doc, NULL, sizeof(dom_event_listener));
+ dom_event_listener *ret = malloc(sizeof(dom_event_listener));
if (ret == NULL)
return DOM_NO_MEM_ERR;
@@ -56,7 +57,6 @@
listener->refcnt--;
if (listener->refcnt == 0)
- _dom_document_alloc(listener->doc, listener,
- sizeof(dom_event_listener));
+ free(listener);
}
Modified: branches/jmb/dom-alloc-purge/src/events/event_target.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/event_target.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/event_target.c Mon Dec 19 16:44:57 2011
@@ -21,12 +21,6 @@
/* The number of chains in the hash table used for hash event types */
#define CHAINS 11
-
-/* Entry for a EventTarget, used to record the bubbling list */
-typedef struct dom_event_target_entry {
- struct list_entry entry; /**< The list entry */
- dom_event_target *et; /**< The node */
-} dom_event_target_entry;
/* Hash key/value functions */
static void *_key(void *key, void *pw, bool clone);
@@ -68,14 +62,13 @@
* \param capture Whether add this listener in the capturing phase
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
-dom_exception _dom_event_target_add_event_listener(dom_event_target *et,
+dom_exception _dom_event_target_add_event_listener(
+ dom_event_target_internal *eti,
dom_string *type, struct dom_event_listener *listener,
bool capture)
{
struct listener_entry *le = NULL;
dom_string *t = NULL;
-
- struct dom_event_target_internal *eti = &et->eti;
/* If there is no hash table, we should create one firstly */
if (eti->listeners == NULL) {
@@ -121,19 +114,12 @@
* \param capture Whether the listener is registered at the capturing phase
* \return DOM_NO_ERR on success, appropriate dom_exception on failure.
*/
-dom_exception _dom_event_target_remove_event_listener(dom_event_target *et,
+dom_exception _dom_event_target_remove_event_listener(
+ dom_event_target_internal *eti,
dom_string *type, struct dom_event_listener *listener,
bool capture)
{
struct listener_entry *le = NULL;
- dom_document *doc = dom_node_get_owner(et);
- if (doc == NULL) {
- /* TODO: In the progress of parsing, many Nodes in the DTD
- * has no document at all, do nothing for this kind of node */
- return DOM_NO_ERR;
- }
-
- struct dom_event_target_internal *eti = &et->eti;
/* Find the type of this event */
struct list_entry *item = (struct list_entry *) _dom_hash_get(
@@ -161,289 +147,119 @@
}
/**
- * Dispatch an event into the implementation's event model
+ * Add an EventListener
+ *
+ * \param et The EventTarget object
+ * \param namespace The namespace of this listener
+ * \param type The event type which this event listener listens for
+ * \param listener The event listener object
+ * \param capture Whether add this listener in the capturing phase
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ *
+ * We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
+ */
+dom_exception _dom_event_target_add_event_listener_ns(
+ dom_event_target_internal *eti,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture)
+{
+ UNUSED(eti);
+ UNUSED(namespace);
+ UNUSED(type);
+ UNUSED(listener);
+ UNUSED(capture);
+
+ return DOM_NOT_SUPPORTED_ERR;
+}
+
+/**
+ * Remove an EventListener
+ *
+ * \param et The EventTarget object
+ * \param namespace The namespace of this listener
+ * \param type The event type which this event listener listens for
+ * \param listener The event listener object
+ * \param capture Whether add this listener in the capturing phase
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ *
+ * We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
+ */
+dom_exception _dom_event_target_remove_event_listener_ns(
+ dom_event_target_internal *eti,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture)
+{
+ UNUSED(eti);
+ UNUSED(namespace);
+ UNUSED(type);
+ UNUSED(listener);
+ UNUSED(capture);
+
+ return DOM_NOT_SUPPORTED_ERR;
+}
+
+/*-------------------------------------------------------------------------*/
+
+/* The key process function of the hash table, see utils/hash_table.h for
+ * detail */
+static void *_key(void *key, void *pw, bool clone)
+{
+ UNUSED(pw);
+ /* There should never be the requirement of clone the event listener
+ * list */
+ assert(clone == false);
+ UNUSED(clone);
+
+ lwc_string_unref((lwc_string *) key);
+
+ return NULL;
+}
+
+/* The value process function of the hash table, see utils/hash_table.h for
+ * detail */
+static void *_value(void *value, void *pw, bool clone)
+{
+ /* There should never be the requirement of clone the event listener
+ * list */
+ UNUSED(pw);
+ assert(clone == false);
+ UNUSED(clone);
+
+ struct listener_entry *le = NULL;
+ struct list_entry *i = (struct list_entry *) value;
+
+ while (i != i->next) {
+ le = (struct listener_entry *) i->next;
+ list_del(i->next);
+ dom_event_listener_unref(le->listener);
+ le = malloc(sizeof(struct listener_entry));
+ }
+
+ le = (struct listener_entry *) i;
+ list_del(i);
+ dom_event_listener_unref(le->listener);
+ le = malloc(sizeof(struct listener_entry));
+
+ return NULL;
+}
+
+/**
+ * Dispatch an event on certain EventTarget
*
* \param et The EventTarget object
+ * \param eti Internal EventTarget object
* \param evt The event object
* \param success Indicates whether any of the listeners which handled the
* event called Event.preventDefault(). If
* Event.preventDefault() was called the returned value is
* false, else it is true.
- * \return DOM_NO_ERR on success
- * DOM_DISPATCH_REQUEST_ERR If the event is already in dispatch
- * DOM_UNSPECIFIED_EVENT_TYPE_ERR If the type of the event is Null or
- * empty string.
- * DOM_NOT_SUPPORTED_ERR If the event is not created by
- * Document.createEvent
- * DOM_INVALID_CHARACTER_ERR If the type of this event is not a
- * valid NCName.
- */
-dom_exception _dom_event_target_dispatch_event(dom_event_target *et,
- struct dom_event *evt, bool *success)
-{
- assert(et != NULL);
- assert(evt != NULL);
-
- dom_exception err, ret = DOM_NO_ERR;
-
- /* To test whether this event is in dispatch */
- if (evt->in_dispatch == true) {
- return DOM_DISPATCH_REQUEST_ERR;
- } else {
- evt->in_dispatch = true;
- }
-
- if (evt->type == NULL || dom_string_length(evt->type) == 0) {
- return DOM_UNSPECIFIED_EVENT_TYPE_ERR;
- }
-
- if (evt->doc == NULL)
- return DOM_NOT_SUPPORTED_ERR;
-
- dom_document *doc = dom_node_get_owner(et);
- if (doc == NULL) {
- /* TODO: In the progress of parsing, many Nodes in the DTD has
- * no document at all, do nothing for this kind of node */
- return DOM_NO_ERR;
- }
-
- if (_dom_validate_ncname(evt->type) == false) {
- return DOM_INVALID_CHARACTER_ERR;
- }
-
- dom_event_target_entry list;
- dom_event_target *target = et;
-
- *success = true;
-
- /* Compose the event target list */
- list_init(&list.entry);
- list.et = et;
- dom_node_ref(et);
- target = target->parent;
-
- while (target != NULL) {
- dom_event_target_entry *l = malloc(
- sizeof(dom_event_target_entry));
- if (l == NULL) {
- ret = DOM_NO_MEM_ERR;
- goto cleanup;
- }
- list_append(&list.entry, &l->entry);
- l->et = target;
- dom_node_ref(target);
- target = target->parent;
- }
-
- /* Fill the target of the event */
- evt->target = et;
- evt->phase = DOM_CAPTURING_PHASE;
-
- /* The started callback of default action */
- dom_document_event_internal *dei = &doc->dei;
- void *pw = NULL;
- if (dei->actions != NULL) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_STARTED, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
- /* The capture phase */
- struct list_entry *e = list.entry.prev;
- for (; e != &list.entry; e = e->prev) {
- dom_event_target_entry *l = (dom_event_target_entry *) e;
- err = _dom_event_target_dispatch(l->et, evt,
- DOM_CAPTURING_PHASE, success);
- if (err != DOM_NO_ERR) {
- ret = err;
- goto cleanup;
- }
- /* If the stopImmediatePropagation or stopPropagation is
- * called, we should break */
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
- }
-
- /* Target phase */
- evt->phase = DOM_AT_TARGET;
- evt->current = et;
- err = _dom_event_target_dispatch(et, evt, DOM_AT_TARGET,
- success);
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
-
- /* Bubbling phase */
- evt->phase = DOM_BUBBLING_PHASE;
-
- e = list.entry.next;
- for (; e != &list.entry; e = e->next) {
- dom_event_target_entry *l = (dom_event_target_entry *) e;
- err = _dom_event_target_dispatch(l->et, evt,
- DOM_BUBBLING_PHASE, success);
- if (err != DOM_NO_ERR) {
- ret = err;
- goto cleanup;
- }
- /* If the stopImmediatePropagation or stopPropagation is
- * called, we should break */
- if (evt->stop_now == true || evt->stop == true)
- goto cleanup;
- }
-
- if (dei->actions == NULL)
- goto cleanup;
-
- /* The end callback of default action */
- if (evt->prevent_default != true) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_END, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
- /* The prevented callback of default action */
- if (evt->prevent_default != true) {
- dom_default_action_callback cb = dei->actions(evt->type,
- DOM_DEFAULT_ACTION_PREVENTED, &pw);
- if (cb != NULL) {
- cb(evt, pw);
- }
- }
-
-cleanup:
- if (evt->prevent_default == true) {
- *success = false;
- }
-
- while (list.entry.next != &list.entry) {
- dom_event_target_entry *e = (dom_event_target_entry *)
- list.entry.next;
- dom_node_unref(e->et);
- list_del(list.entry.next);
- free(e);
- }
-
- dom_node_unref(et);
-
- return ret;
-}
-
-/**
- * Add an EventListener
- *
- * \param et The EventTarget object
- * \param namespace The namespace of this listener
- * \param type The event type which this event listener listens for
- * \param listener The event listener object
- * \param capture Whether add this listener in the capturing phase
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- *
- * We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
- */
-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)
-{
- UNUSED(et);
- UNUSED(namespace);
- UNUSED(type);
- UNUSED(listener);
- UNUSED(capture);
-
- return DOM_NOT_SUPPORTED_ERR;
-}
-
-/**
- * Remove an EventListener
- *
- * \param et The EventTarget object
- * \param namespace The namespace of this listener
- * \param type The event type which this event listener listens for
- * \param listener The event listener object
- * \param capture Whether add this listener in the capturing phase
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- *
- * We don't support this API now, so it always return DOM_NOT_SUPPORTED_ERR.
- */
-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)
-{
- UNUSED(et);
- UNUSED(namespace);
- UNUSED(type);
- UNUSED(listener);
- UNUSED(capture);
-
- return DOM_NOT_SUPPORTED_ERR;
-}
-
-/*-------------------------------------------------------------------------*/
-
-/* The key process function of the hash table, see utils/hash_table.h for
- * detail */
-static void *_key(void *key, void *pw, bool clone)
-{
- UNUSED(pw);
- /* There should never be the requirement of clone the event listener
- * list */
- assert(clone == false);
- UNUSED(clone);
-
- lwc_string_unref((lwc_string *) key);
-
- return NULL;
-}
-
-/* The value process function of the hash table, see utils/hash_table.h for
- * detail */
-static void *_value(void *value, void *pw, bool clone)
-{
- /* There should never be the requirement of clone the event listener
- * list */
- UNUSED(pw);
- assert(clone == false);
- UNUSED(clone);
-
- struct listener_entry *le = NULL;
- struct list_entry *i = (struct list_entry *) value;
-
- while (i != i->next) {
- le = (struct listener_entry *) i->next;
- list_del(i->next);
- dom_event_listener_unref(le->listener);
- le = malloc(sizeof(struct listener_entry));
- }
-
- le = (struct listener_entry *) i;
- list_del(i);
- dom_event_listener_unref(le->listener);
- le = malloc(sizeof(struct listener_entry));
-
- return NULL;
-}
-
-/*-------------------------------------------------------------------------*/
-
-/**
- * Dispatch an event on certain EventTarget
- *
- * \param et The EventTarget object
- * \param evt The event object
- * \param success Indicates whether any of the listeners which handled the
- * event called Event.preventDefault(). If
- * Event.preventDefault() was called the returned value is
- * false, else it is true.
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_event_target_dispatch(dom_event_target *et,
+ * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
+ */
+dom_exception _dom_event_target_dispatch(dom_event_target *et,
+ dom_event_target_internal *eti,
struct dom_event *evt, dom_event_flow_phase phase,
bool *success)
{
- struct dom_event_target_internal *eti = &et->eti;
dom_string *t = evt->type;
struct list_entry *item = (struct list_entry *) _dom_hash_get(
@@ -484,321 +300,3 @@
return DOM_NO_ERR;
}
-/**
- * Dispatch a DOMNodeInserted/DOMNodeRemoved event
- *
- * \param doc The document object
- * \param et The EventTarget object
- * \param type "DOMNodeInserted" or "DOMNodeRemoved"
- * \param related The parent of the removed/inserted node
- * \param success Whether this event's default action get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_node_change_event(dom_document *doc,
- dom_event_target *et, dom_event_target *related,
- dom_mutation_type change, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- if (change == DOM_MUTATION_ADDITION) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeInserted",
- SLEN("DOMNodeInserted"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else if (change == DOM_MUTATION_REMOVAL) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeRemoval",
- SLEN("DOMNodeRemoved"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else {
- assert("Should never be here" == NULL);
- }
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Initiliase the event with corresponding parameters */
- err = dom_mutation_event_init(evt, t, true, false, related, NULL, NULL,
- NULL, change);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Finalise the evt, and reuse it */
- _dom_mutation_event_finalise(doc, evt);
- /* Dispatch the DOMNodeInsertedIntoDocument/DOMNodeRemovedFromDocument
- * event */
- if (change == DOM_MUTATION_ADDITION) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *)
- "DOMNodeInsertedIntoDocument",
- SLEN("DOMNodeInsertedIntoDocument"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else if (change == DOM_MUTATION_REMOVAL) {
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMNodeRemovedFromDocument",
- SLEN("DOMNodeRemovedFromDocument"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
- } else {
- assert("Should never be here" == NULL);
- }
-
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Dispatch the events for its children */
- dom_event_target *target = et->first_child;
- while (target != NULL) {
- err = dom_mutation_event_init(evt, t, true, false, NULL,
- NULL, NULL, NULL, change);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_event_target_dispatch_event(target, evt, success);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_event_target *p = dom_node_get_parent(target);
- if (target->first_child != NULL) {
- target = target->first_child;
- } else if (target->next != NULL) {
- target = target->next;
- } else {
- while (p != et && target == p->last_child) {
- target = p;
- p = dom_node_get_parent(p);
- }
-
- target = target->next;
- }
- /* Finalise the event for reuse in next iteration */
- _dom_mutation_event_finalise(doc, evt);
- }
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMAttrModified event
- *
- * \param doc The Document object
- * \param et The EventTarget
- * \param prev The previous value before change
- * \param new The new value after change
- * \param related The related EventTarget
- * \param attr_name The Attribute name
- * \param change How this attribute change
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
- */
-dom_exception _dom_dispatch_attr_modified_event(dom_document *doc,
- dom_event_target *et, dom_string *prev, dom_string *new,
- dom_event_target *related, dom_string *attr_name,
- dom_mutation_type change, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMAttrModified",
- SLEN("DOMAttrModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- /* Initiliase the event with corresponding parameters */
- err = dom_mutation_event_init(evt, t, true, false, related, prev, new,
- attr_name, change);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMCharacterDataModified event
- *
- * \param et The EventTarget object
- * \param prev The preValue of the DOMCharacterData
- * \param new The newValue of the DOMCharacterData
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropirate dom_exception on failure.
- *
- * TODO:
- * The character_data object may be a part of a Attr node, if so, another
- * DOMAttrModified event should be dispatched, too. But for now, we did not
- * support any XML feature, so just leave it as this.
- */
-dom_exception _dom_dispatch_characterdata_modified_event(
- dom_document *doc, dom_event_target *et,
- dom_string *prev, dom_string *new, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMCharacterDataModified",
- SLEN("DOMCharacterDataModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_mutation_event_init(evt, t, true, false, et, prev, new, NULL,
- DOM_MUTATION_MODIFICATION);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a DOMSubtreeModified event
- *
- * \param doc The Document
- * \param et The EventTarget object
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_subtree_modified_event(dom_document *doc,
- dom_event_target *et, bool *success)
-{
- struct dom_mutation_event *evt;
- dom_exception err;
-
- err = _dom_mutation_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc,
- (const uint8_t *) "DOMSubtreeModified",
- SLEN("DOMSubtreeModified"), &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_mutation_event_init(evt, t, true, false, et, NULL, NULL, NULL,
- DOM_MUTATION_MODIFICATION);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_mutation_event_destroy(doc, evt);
-
- return err;
-}
-
-/**
- * Dispatch a generic event
- *
- * \param doc The Document
- * \param et The EventTarget object
- * \param name The name of the event
- * \param len The length of the name string
- * \param bubble Whether this event bubbles
- * \param cancelable Whether this event can be cancelable
- * \param success Whether this event's default handler get called
- * \return DOM_NO_ERR on success, appropriate dom_exception on failure.
- */
-dom_exception _dom_dispatch_generic_event(dom_document *doc,
- dom_event_target *et, const uint8_t *name, size_t len,
- bool bubble, bool cancelable, bool *success)
-{
- struct dom_event *evt;
- dom_exception err;
-
- err = _dom_event_create(doc, &evt);
- if (err != DOM_NO_ERR)
- return err;
-
- lwc_string *type = NULL;
- err = _dom_document_create_lwcstring(doc, name, len, &type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- dom_string *t = NULL;
- err = _dom_document_create_string_from_lwcstring(doc, type, &t);
- _dom_document_unref_lwcstring(doc, type);
- if (err != DOM_NO_ERR)
- goto cleanup;
-
- err = dom_event_init(evt, t, bubble, cancelable);
- dom_string_unref(t);
- if (err != DOM_NO_ERR) {
- goto cleanup;
- }
-
- err = dom_event_target_dispatch_event(et, evt, success);
-
-cleanup:
- _dom_event_destroy(evt);
-
- return err;
-}
-
Modified: branches/jmb/dom-alloc-purge/src/events/event_target.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/event_target.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/event_target.h Mon Dec 19 16:44:57 2011
@@ -13,6 +13,8 @@
#include <dom/events/mutation_event.h>
#include <dom/events/event_target.h>
#include <dom/events/event_listener.h>
+
+#include "events/dispatch.h"
#include "utils/list.h"
#include "utils/hashtable.h"
@@ -43,6 +45,12 @@
typedef struct dom_event_target_internal dom_event_target_internal;
+/* Entry for a EventTarget, used to record the bubbling list */
+typedef struct dom_event_target_entry {
+ struct list_entry entry; /**< The list entry */
+ dom_event_target *et; /**< The node */
+} dom_event_target_entry;
+
/**
* Constructor and destructor: Since this object is not intended to be
* allocated alone, it should be embedded into the Node object, there is
@@ -57,61 +65,29 @@
void _dom_event_target_internal_finalise(dom_document *doc,
dom_event_target_internal *eti);
-/* Dispatch the event on this node */
-dom_exception _dom_event_target_dispatch(dom_event_target *et,
+dom_exception _dom_event_target_add_event_listener(
+ dom_event_target_internal *eti,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture);
+
+dom_exception _dom_event_target_remove_event_listener(
+ dom_event_target_internal *eti,
+ dom_string *type, struct dom_event_listener *listener,
+ bool capture);
+
+dom_exception _dom_event_target_add_event_listener_ns(
+ dom_event_target_internal *eti,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture);
+
+dom_exception _dom_event_target_remove_event_listener_ns(
+ dom_event_target_internal *eti,
+ dom_string *namespace, dom_string *type,
+ struct dom_event_listener *listener, bool capture);
+
+dom_exception _dom_event_target_dispatch(dom_event_target *et,
+ dom_event_target_internal *eti,
struct dom_event *evt, dom_event_flow_phase phase,
bool *success);
-/* Dispatch a DOMNodeInserted/DOMNodeRemoved event */
-dom_exception _dom_dispatch_node_change_event(dom_document *doc,
- dom_event_target *et, dom_event_target *related,
- dom_mutation_type change, bool *success);
-#define _dom_dispatch_node_change_event(doc, et, related, change, success) \
- _dom_dispatch_node_change_event((dom_document *) (doc), \
- (dom_event_target *) (et), \
- (dom_event_target *) (related), \
- (dom_mutation_type) (change), \
- (bool *) (success))
-
-/* Dispatch a DOMCharacterDataModified event */
-dom_exception _dom_dispatch_characterdata_modified_event(
- dom_document *doc, dom_event_target *et,
- dom_string *prev, dom_string *new, bool *success);
-#define _dom_dispatch_characterdata_modified_event(doc, et, \
- prev, new, success) \
- _dom_dispatch_characterdata_modified_event((dom_document *) (doc), \
- (dom_event_target *) (et), \
- (dom_string *) (prev), \
- (dom_string *) (new), \
- (bool *) (success))
-
-/* Dispatch a DOMAttrModified event */
-dom_exception _dom_dispatch_attr_modified_event(dom_document *doc,
- dom_event_target *et, dom_string *prev,
- dom_string *new, dom_event_target *related,
- dom_string *attr_name, dom_mutation_type change,
- bool *success);
-#define _dom_dispatch_attr_modified_event(doc, et, prev, new, \
- related, attr_name, change, success) \
- _dom_dispatch_attr_modified_event((dom_document *) (doc), \
- (dom_event_target *) (et), \
- (dom_string *) (prev), \
- (dom_string *) (new), \
- (dom_event_target *) (related), \
- (dom_string *) (attr_name), \
- (dom_mutation_type) (change), \
- (bool *) (success))
-
-/* Dispatch a DOMSubtreeModified event */
-dom_exception _dom_dispatch_subtree_modified_event(dom_document *doc,
- dom_event_target *et, bool *success);
-#define _dom_dispatch_subtree_modified_event(doc, et, success) \
- _dom_dispatch_subtree_modified_event((dom_document *) (doc), \
- (dom_event_target *) (et), \
- (bool *) (success))
-
-/* Dispatch a generic event */
-dom_exception _dom_dispatch_generic_event(dom_document *doc,
- dom_event_target *et, const uint8_t *name, size_t len,
- bool bubble, bool cancelable, bool *success);
#endif
Modified: branches/jmb/dom-alloc-purge/src/events/keyboard_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/keyboard_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/keyboard_event.c Mon Dec 19 16:44:57 2011
@@ -5,6 +5,7 @@
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+#include <stdlib.h>
#include <string.h>
#include "events/keyboard_event.h"
@@ -22,7 +23,7 @@
dom_exception _dom_keyboard_event_create(struct dom_document *doc,
struct dom_keyboard_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_keyboard_event));
+ *evt = malloc(sizeof(dom_keyboard_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -32,12 +33,11 @@
}
/* Destructor */
-void _dom_keyboard_event_destroy(struct dom_document *doc,
- struct dom_keyboard_event *evt)
-{
- _dom_keyboard_event_finalise(doc, evt);
-
- _dom_document_alloc(doc, evt, 0);
+void _dom_keyboard_event_destroy(struct dom_keyboard_event *evt)
+{
+ _dom_keyboard_event_finalise(evt);
+
+ free(evt);
}
/* Initialise function */
@@ -51,16 +51,15 @@
}
/* Finalise function */
-void _dom_keyboard_event_finalise(struct dom_document *doc,
- struct dom_keyboard_event *evt)
-{
- _dom_ui_event_finalise(doc, &evt->base);
+void _dom_keyboard_event_finalise(struct dom_keyboard_event *evt)
+{
+ _dom_ui_event_finalise(&evt->base);
}
/* The virtual destroy function */
void _virtual_dom_keyboard_event_destroy(struct dom_event *evt)
{
- _dom_keyboard_event_destroy(evt->doc, (dom_keyboard_event *) evt);
+ _dom_keyboard_event_destroy((dom_keyboard_event *) evt);
}
/*----------------------------------------------------------------------*/
@@ -179,7 +178,7 @@
}
const char *data = _dom_string_data(m);
- size_t len = _dom_string_length(m);
+ size_t len = _dom_string_byte_length(m);
if (len == SLEN("AltGraph") && strncmp(data, "AltGraph", len) == 0) {
*state = ((evt->modifier_state & DOM_MOD_ALT_GRAPH) != 0);
@@ -292,8 +291,8 @@
if (modifier_list == NULL)
return DOM_NO_ERR;
- char *data = _dom_string_data(modifier_list);
- char *m = data;
+ const char *data = _dom_string_data(modifier_list);
+ const char *m = data;
size_t len = 0;
while (true) {
Modified: branches/jmb/dom-alloc-purge/src/events/keyboard_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/keyboard_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/keyboard_event.h Mon Dec 19 16:44:57 2011
@@ -36,16 +36,14 @@
struct dom_keyboard_event **evt);
/* Destructor */
-void _dom_keyboard_event_destroy(struct dom_document *doc,
- struct dom_keyboard_event *evt);
+void _dom_keyboard_event_destroy(struct dom_keyboard_event *evt);
/* Initialise function */
dom_exception _dom_keyboard_event_initialise(struct dom_document *doc,
struct dom_keyboard_event *evt);
/* Finalise function */
-void _dom_keyboard_event_finalise(struct dom_document *doc,
- struct dom_keyboard_event *evt);
+void _dom_keyboard_event_finalise(struct dom_keyboard_event *evt);
/* Parse the modifier list string to corresponding bool variable state */
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_event.c Mon Dec 19 16:44:57 2011
@@ -5,6 +5,7 @@
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+#include <stdlib.h>
#include <string.h>
#include "events/mouse_event.h"
@@ -22,7 +23,7 @@
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));
+ *evt = malloc(sizeof(dom_mouse_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -32,12 +33,11 @@
}
/* 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);
+void _dom_mouse_event_destroy(struct dom_mouse_event *evt)
+{
+ _dom_mouse_event_finalise((dom_ui_event *) evt);
+
+ free(evt);
}
/* Initialise function */
@@ -52,7 +52,7 @@
/* The virtual destroy function */
void _virtual_dom_mouse_event_destroy(struct dom_event *evt)
{
- _dom_mouse_event_destroy(evt->doc, (dom_mouse_event *) evt);
+ _dom_mouse_event_destroy((dom_mouse_event *) evt);
}
/*----------------------------------------------------------------------*/
@@ -230,7 +230,7 @@
}
const char *data = _dom_string_data(m);
- size_t len = _dom_string_length(m);
+ size_t len = _dom_string_byte_length(m);
if (len == SLEN("AltGraph") && strncmp(data, "AltGraph", len) == 0) {
*state = ((evt->modifier_state & DOM_MOD_ALT_GRAPH) != 0);
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_event.h Mon Dec 19 16:44:57 2011
@@ -34,8 +34,7 @@
struct dom_mouse_event **evt);
/* Destructor */
-void _dom_mouse_event_destroy(struct dom_document *doc,
- struct dom_mouse_event *evt);
+void _dom_mouse_event_destroy(struct dom_mouse_event *evt);
/* Initialise function */
dom_exception _dom_mouse_event_initialise(struct dom_document *doc,
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/mouse_multi_wheel_event.h"
#include "events/keyboard_event.h"
@@ -22,8 +24,7 @@
dom_exception _dom_mouse_multi_wheel_event_create(struct dom_document *doc,
struct dom_mouse_multi_wheel_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL,
- sizeof(dom_mouse_multi_wheel_event));
+ *evt = malloc(sizeof(dom_mouse_multi_wheel_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -33,12 +34,12 @@
}
/* Destructor */
-void _dom_mouse_multi_wheel_event_destroy(struct dom_document *doc,
+void _dom_mouse_multi_wheel_event_destroy(
struct dom_mouse_multi_wheel_event *evt)
{
- _dom_mouse_multi_wheel_event_finalise(doc, (dom_ui_event *) evt);
+ _dom_mouse_multi_wheel_event_finalise((dom_ui_event *) evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -51,7 +52,7 @@
/* The virtual destroy function */
void _virtual_dom_mouse_multi_wheel_event_destroy(struct dom_event *evt)
{
- _dom_mouse_multi_wheel_event_destroy(evt->doc,
+ _dom_mouse_multi_wheel_event_destroy(
(dom_mouse_multi_wheel_event *) evt);
}
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_multi_wheel_event.h Mon Dec 19 16:44:57 2011
@@ -28,7 +28,7 @@
struct dom_mouse_multi_wheel_event **evt);
/* Destructor */
-void _dom_mouse_multi_wheel_event_destroy(struct dom_document *doc,
+void _dom_mouse_multi_wheel_event_destroy(
struct dom_mouse_multi_wheel_event *evt);
/* Initialise function */
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/mouse_wheel_event.h"
#include "events/keyboard_event.h"
@@ -21,7 +23,7 @@
dom_exception _dom_mouse_wheel_event_create(struct dom_document *doc,
struct dom_mouse_wheel_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_mouse_wheel_event));
+ *evt = malloc(sizeof(dom_mouse_wheel_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -32,12 +34,11 @@
}
/* Destructor */
-void _dom_mouse_wheel_event_destroy(struct dom_document *doc,
- struct dom_mouse_wheel_event *evt)
+void _dom_mouse_wheel_event_destroy(struct dom_mouse_wheel_event *evt)
{
- _dom_mouse_wheel_event_finalise(doc, (dom_ui_event *) evt);
+ _dom_mouse_wheel_event_finalise((dom_ui_event *) evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -50,7 +51,7 @@
/* The virtual destroy function */
void _virtual_dom_mouse_wheel_event_destroy(struct dom_event *evt)
{
- _dom_mouse_wheel_event_destroy(evt->doc, (dom_mouse_wheel_event *) evt);
+ _dom_mouse_wheel_event_destroy((dom_mouse_wheel_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/mouse_wheel_event.h Mon Dec 19 16:44:57 2011
@@ -26,8 +26,7 @@
struct dom_mouse_wheel_event **evt);
/* Destructor */
-void _dom_mouse_wheel_event_destroy(struct dom_document *doc,
- struct dom_mouse_wheel_event *evt);
+void _dom_mouse_wheel_event_destroy(struct dom_mouse_wheel_event *evt);
/* Initialise function */
dom_exception _dom_mouse_wheel_event_initialise(struct dom_document *doc,
Modified: branches/jmb/dom-alloc-purge/src/events/mutation_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mutation_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/mutation_event.c Mon Dec 19 16:44:57 2011
@@ -5,6 +5,8 @@
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+#include <stdlib.h>
+
#include "events/mutation_event.h"
#include "core/document.h"
@@ -18,7 +20,7 @@
dom_exception _dom_mutation_event_create(struct dom_document *doc,
struct dom_mutation_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_mutation_event));
+ *evt = malloc(sizeof(dom_mutation_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -28,12 +30,11 @@
}
/* Destructor */
-void _dom_mutation_event_destroy(struct dom_document *doc,
- struct dom_mutation_event *evt)
-{
- _dom_mutation_event_finalise(doc, evt);
-
- _dom_document_alloc(doc, evt, 0);
+void _dom_mutation_event_destroy(struct dom_mutation_event *evt)
+{
+ _dom_mutation_event_finalise(evt);
+
+ free(evt);
}
/* Initialise function */
@@ -49,8 +50,7 @@
}
/* Finalise function */
-void _dom_mutation_event_finalise(struct dom_document *doc,
- struct dom_mutation_event *evt)
+void _dom_mutation_event_finalise(struct dom_mutation_event *evt)
{
dom_node_unref(evt->related_node);
dom_string_unref(evt->prev_value);
@@ -62,13 +62,13 @@
evt->new_value = NULL;
evt->attr_name = NULL;
- _dom_event_finalise(doc, &evt->base);
+ _dom_event_finalise(&evt->base);
}
/* The virtual destroy function */
void _virtual_dom_mutation_event_destroy(struct dom_event *evt)
{
- _dom_mutation_event_destroy(evt->doc, (dom_mutation_event *) evt);
+ _dom_mutation_event_destroy((dom_mutation_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/mutation_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mutation_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/mutation_event.h Mon Dec 19 16:44:57 2011
@@ -30,16 +30,14 @@
struct dom_mutation_event **evt);
/* Destructor */
-void _dom_mutation_event_destroy(struct dom_document *doc,
- struct dom_mutation_event *evt);
+void _dom_mutation_event_destroy(struct dom_mutation_event *evt);
/* Initialise function */
dom_exception _dom_mutation_event_initialise(struct dom_document *doc,
struct dom_mutation_event *evt);
/* Finalise function */
-void _dom_mutation_event_finalise(struct dom_document *doc,
- struct dom_mutation_event *evt);
+void _dom_mutation_event_finalise(struct dom_mutation_event *evt);
#endif
Modified: branches/jmb/dom-alloc-purge/src/events/mutation_name_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mutation_name_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/mutation_name_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/mutation_name_event.h"
#include "core/document.h"
@@ -20,7 +22,7 @@
dom_exception _dom_mutation_name_event_create(struct dom_document *doc,
struct dom_mutation_name_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_mutation_name_event));
+ *evt = malloc(sizeof(dom_mutation_name_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -30,12 +32,11 @@
}
/* Destructor */
-void _dom_mutation_name_event_destroy(struct dom_document *doc,
- struct dom_mutation_name_event *evt)
+void _dom_mutation_name_event_destroy(struct dom_mutation_name_event *evt)
{
- _dom_mutation_name_event_finalise(doc, evt);
+ _dom_mutation_name_event_finalise(evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -49,20 +50,18 @@
}
/* Finalise function */
-void _dom_mutation_name_event_finalise(struct dom_document *doc,
- struct dom_mutation_name_event *evt)
+void _dom_mutation_name_event_finalise(struct dom_mutation_name_event *evt)
{
dom_string_unref(evt->prev_namespace);
dom_string_unref(evt->prev_nodename);
- _dom_event_finalise(doc, (dom_event *) evt);
+ _dom_event_finalise((dom_event *) evt);
}
/* The virtual destroy function */
void _virtual_dom_mutation_name_event_destroy(struct dom_event *evt)
{
- _dom_mutation_name_event_destroy(evt->doc,
- (dom_mutation_name_event *) evt);
+ _dom_mutation_name_event_destroy((dom_mutation_name_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/mutation_name_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/mutation_name_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/mutation_name_event.h Mon Dec 19 16:44:57 2011
@@ -27,16 +27,14 @@
struct dom_mutation_name_event **evt);
/* Destructor */
-void _dom_mutation_name_event_destroy(struct dom_document *doc,
- struct dom_mutation_name_event *evt);
+void _dom_mutation_name_event_destroy(struct dom_mutation_name_event *evt);
/* Initialise function */
dom_exception _dom_mutation_name_event_initialise(struct dom_document *doc,
struct dom_mutation_name_event *evt);
/* Finalise function */
-void _dom_mutation_name_event_finalise(struct dom_document *doc,
- struct dom_mutation_name_event *evt);
+void _dom_mutation_name_event_finalise(struct dom_mutation_name_event *evt);
#endif
Modified: branches/jmb/dom-alloc-purge/src/events/text_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/text_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/text_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/text_event.h"
#include "core/document.h"
@@ -18,7 +20,7 @@
dom_exception _dom_text_event_create(struct dom_document *doc,
struct dom_text_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_text_event));
+ *evt = malloc(sizeof(dom_text_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -28,12 +30,11 @@
}
/* Destructor */
-void _dom_text_event_destroy(struct dom_document *doc,
- struct dom_text_event *evt)
+void _dom_text_event_destroy(struct dom_text_event *evt)
{
- _dom_text_event_finalise(doc, evt);
+ _dom_text_event_finalise(evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -45,17 +46,16 @@
}
/* Finalise function */
-void _dom_text_event_finalise(struct dom_document *doc,
- struct dom_text_event *evt)
+void _dom_text_event_finalise(struct dom_text_event *evt)
{
dom_string_unref(evt->data);
- _dom_ui_event_finalise(doc, &evt->base);
+ _dom_ui_event_finalise(&evt->base);
}
/* The virtual destroy function */
void _virtual_dom_text_event_destroy(struct dom_event *evt)
{
- _dom_text_event_destroy(evt->doc, (dom_text_event *) evt);
+ _dom_text_event_destroy((dom_text_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/text_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/text_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/text_event.h Mon Dec 19 16:44:57 2011
@@ -25,16 +25,14 @@
struct dom_text_event **evt);
/* Destructor */
-void _dom_text_event_destroy(struct dom_document *doc,
- struct dom_text_event *evt);
+void _dom_text_event_destroy(struct dom_text_event *evt);
/* Initialise function */
dom_exception _dom_text_event_initialise(struct dom_document *doc,
struct dom_text_event *evt);
/* Finalise function */
-void _dom_text_event_finalise(struct dom_document *doc,
- struct dom_text_event *evt);
+void _dom_text_event_finalise(struct dom_text_event *evt);
#endif
Modified: branches/jmb/dom-alloc-purge/src/events/ui_event.c
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/ui_event.c (original)
+++ branches/jmb/dom-alloc-purge/src/events/ui_event.c Mon Dec 19 16:44:57 2011
@@ -4,6 +4,8 @@
* http://www.opensource.org/licenses/mit-license.php
* Copyright 2009 Bo Yang <struggleyb.nku(a)gmail.com>
*/
+
+#include <stdlib.h>
#include "events/ui_event.h"
#include "core/document.h"
@@ -18,7 +20,7 @@
dom_exception _dom_ui_event_create(struct dom_document *doc,
struct dom_ui_event **evt)
{
- *evt = _dom_document_alloc(doc, NULL, sizeof(dom_ui_event));
+ *evt = malloc(sizeof(dom_ui_event));
if (*evt == NULL)
return DOM_NO_MEM_ERR;
@@ -28,12 +30,11 @@
}
/* Destructor */
-void _dom_ui_event_destroy(struct dom_document *doc,
- struct dom_ui_event *evt)
+void _dom_ui_event_destroy(struct dom_ui_event *evt)
{
- _dom_ui_event_finalise(doc, evt);
+ _dom_ui_event_finalise(evt);
- _dom_document_alloc(doc, evt, 0);
+ free(evt);
}
/* Initialise function */
@@ -45,17 +46,16 @@
}
/* Finalise function */
-void _dom_ui_event_finalise(struct dom_document *doc,
- struct dom_ui_event *evt)
+void _dom_ui_event_finalise(struct dom_ui_event *evt)
{
evt->view = NULL;
- _dom_event_finalise(doc, &evt->base);
+ _dom_event_finalise(&evt->base);
}
/* The virtual destroy function */
void _virtual_dom_ui_event_destroy(struct dom_event *evt)
{
- _dom_ui_event_destroy(evt->doc, (dom_ui_event *) evt);
+ _dom_ui_event_destroy((dom_ui_event *) evt);
}
/*----------------------------------------------------------------------*/
Modified: branches/jmb/dom-alloc-purge/src/events/ui_event.h
URL: http://source.netsurf-browser.org/branches/jmb/dom-alloc-purge/src/events...
==============================================================================
--- branches/jmb/dom-alloc-purge/src/events/ui_event.h (original)
+++ branches/jmb/dom-alloc-purge/src/events/ui_event.h Mon Dec 19 16:44:57 2011
@@ -40,15 +40,13 @@
struct dom_ui_event **evt);
/* Destructor */
-void _dom_ui_event_destroy(struct dom_document *doc,
- struct dom_ui_event *evt);
+void _dom_ui_event_destroy(struct dom_ui_event *evt);
/* Initialise function */
dom_exception _dom_ui_event_initialise(struct dom_document *doc,
struct dom_ui_event *evt);
/* Finalise function */
-void _dom_ui_event_finalise(struct dom_document *doc,
- struct dom_ui_event *evt);
+void _dom_ui_event_finalise(struct dom_ui_event *evt);
#endif
11 years, 9 months
r13298 stevef - /trunk/netsurf/riscos/window.c
by netsurf@semichrome.net
Author: stevef
Date: Sun Dec 18 17:53:20 2011
New Revision: 13298
URL: http://source.netsurf-browser.org?rev=13298&view=rev
Log:
Fix comments.
Modified:
trunk/netsurf/riscos/window.c
Modified: trunk/netsurf/riscos/window.c
URL: http://source.netsurf-browser.org/trunk/netsurf/riscos/window.c?rev=13298...
==============================================================================
--- trunk/netsurf/riscos/window.c (original)
+++ trunk/netsurf/riscos/window.c Sun Dec 18 17:53:20 2011
@@ -3002,7 +3002,7 @@
/**
* Scroll a browser window, either via the core or directly using the
- * normal Wimp scoll interface.
+ * normal Wimp_OpenWindow interface.
*
* Scroll steps are supplied in terms of the (extended) Scroll Event direction
* values returned by Wimp_Poll. Special values of 0x7fffffff and 0x80000000
@@ -3029,6 +3029,8 @@
if (g == NULL)
return;
+ /* Get the current window, toolbar and pointer details. */
+
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
@@ -3052,6 +3054,10 @@
warn_user("WimpError", error->errmess);
return;
}
+
+ /* Turn the scroll requirement from Scroll Event codes into coordinates
+ * that the core can understand.
+ */
switch (scroll_x) {
case wimp_SCROLL_PAGE_LEFT:
11 years, 9 months
r13297 stevef - /trunk/netsurf/riscos/window.c
by netsurf@semichrome.net
Author: stevef
Date: Sun Dec 18 17:46:30 2011
New Revision: 13297
URL: http://source.netsurf-browser.org?rev=13297&view=rev
Log:
Lose unnecessary intermediate variable assignments.
Modified:
trunk/netsurf/riscos/window.c
Modified: trunk/netsurf/riscos/window.c
URL: http://source.netsurf-browser.org/trunk/netsurf/riscos/window.c?rev=13297...
==============================================================================
--- trunk/netsurf/riscos/window.c (original)
+++ trunk/netsurf/riscos/window.c Sun Dec 18 17:46:30 2011
@@ -3128,42 +3128,39 @@
if (!handled && g->bw->children == NULL) {
switch (step_x) {
case SCROLL_TOP:
- step_x = -0x10000000;
+ state.xscroll -= 0x10000000;
break;
case SCROLL_BOTTOM:
- step_x = 0x10000000;
+ state.xscroll += 0x10000000;
break;
case SCROLL_PAGE_UP:
- step_x = - visible_x;
+ state.xscroll -= visible_x;
break;
case SCROLL_PAGE_DOWN:
- step_x = visible_x;
+ state.xscroll += visible_x;
break;
default:
- step_x = 2 * step_x;
+ state.xscroll += 2 * step_x;
break;
}
switch (step_y) {
case SCROLL_TOP:
- step_y = 0x10000000;
+ state.yscroll += 0x10000000;
break;
case SCROLL_BOTTOM:
- step_y = -0x10000000;
+ state.yscroll -= 0x10000000;
break;
case SCROLL_PAGE_UP:
- step_y = visible_y;
+ state.yscroll += visible_y;
break;
case SCROLL_PAGE_DOWN:
- step_y = -visible_y;
+ state.yscroll -= visible_y;
break;
default:
- step_y = -2 * step_y;
+ state.yscroll -= 2 * step_y;
break;
}
-
- state.xscroll += step_x;
- state.yscroll += step_y;
error = xwimp_open_window((wimp_open *) &state);
if (error) {
11 years, 9 months
r13296 stevef - /trunk/netsurf/riscos/window.c
by netsurf@semichrome.net
Author: stevef
Date: Sun Dec 18 17:36:54 2011
New Revision: 13296
URL: http://source.netsurf-browser.org?rev=13296&view=rev
Log:
Pass Page Up/Down info to the core for scrolling.
Modified:
trunk/netsurf/riscos/window.c
Modified: trunk/netsurf/riscos/window.c
URL: http://source.netsurf-browser.org/trunk/netsurf/riscos/window.c?rev=13296...
==============================================================================
--- trunk/netsurf/riscos/window.c (original)
+++ trunk/netsurf/riscos/window.c Sun Dec 18 17:36:54 2011
@@ -47,6 +47,7 @@
#include "css/css.h"
#include "desktop/browser.h"
#include "desktop/cookies.h"
+#include "desktop/scrollbar.h"
#include "desktop/frames.h"
#include "desktop/history_core.h"
#include "desktop/hotlist.h"
@@ -3054,24 +3055,24 @@
switch (scroll_x) {
case wimp_SCROLL_PAGE_LEFT:
- step_x = -visible_x;
+ step_x = SCROLL_PAGE_DOWN;
break;
case wimp_SCROLL_AUTO_LEFT:
case wimp_SCROLL_COLUMN_LEFT:
- step_x = -32;
+ step_x = -16;
break;
case wimp_SCROLL_AUTO_RIGHT:
case wimp_SCROLL_COLUMN_RIGHT:
- step_x = 32;
+ step_x = 16;
break;
case wimp_SCROLL_PAGE_RIGHT:
- step_x = visible_x;
+ step_x = SCROLL_PAGE_UP;
break;
case 0x80000000:
- step_x = -0x10000000;
+ step_x = SCROLL_BOTTOM;
break;
case 0x7fffffff:
- step_x = 0x10000000;
+ step_x = SCROLL_TOP;
break;
default:
step_x = (visible_x * (scroll_x>>2)) >> 2;
@@ -3080,27 +3081,27 @@
switch (scroll_y) {
case wimp_SCROLL_PAGE_UP:
- step_y = visible_y;
+ step_y = SCROLL_PAGE_UP;
break;
case wimp_SCROLL_AUTO_UP:
case wimp_SCROLL_LINE_UP:
- step_y = 32;
+ step_y = -16;
break;
case wimp_SCROLL_AUTO_DOWN:
case wimp_SCROLL_LINE_DOWN:
- step_y = -32;
+ step_y = 16;
break;
case wimp_SCROLL_PAGE_DOWN:
- step_y = -visible_y;
+ step_y = SCROLL_PAGE_DOWN;
break;
case 0x80000000:
- step_y = -0x10000000;
+ step_y = SCROLL_BOTTOM;
break;
case 0x7fffffff:
- step_y = 0x10000000;
+ step_y = SCROLL_TOP;
break;
default:
- step_y = (visible_y * (scroll_y>>2)) >> 2;
+ step_y = -((visible_y * (scroll_y>>2)) >> 2);
break;
}
@@ -3117,7 +3118,7 @@
ro_gui_window_to_window_pos(g,
pointer.pos.x, pointer.pos.y, &pos))
handled = browser_window_scroll_at_point(g->bw, pos.x, pos.y,
- step_x / 2, -step_y / 2);
+ step_x, step_y);
/* If the core didn't do the scrolling, handle it via the Wimp.
* Windows which contain frames can only be scrolled by the core,
@@ -3125,6 +3126,42 @@
*/
if (!handled && g->bw->children == NULL) {
+ switch (step_x) {
+ case SCROLL_TOP:
+ step_x = -0x10000000;
+ break;
+ case SCROLL_BOTTOM:
+ step_x = 0x10000000;
+ break;
+ case SCROLL_PAGE_UP:
+ step_x = - visible_x;
+ break;
+ case SCROLL_PAGE_DOWN:
+ step_x = visible_x;
+ break;
+ default:
+ step_x = 2 * step_x;
+ break;
+ }
+
+ switch (step_y) {
+ case SCROLL_TOP:
+ step_y = 0x10000000;
+ break;
+ case SCROLL_BOTTOM:
+ step_y = -0x10000000;
+ break;
+ case SCROLL_PAGE_UP:
+ step_y = visible_y;
+ break;
+ case SCROLL_PAGE_DOWN:
+ step_y = -visible_y;
+ break;
+ default:
+ step_y = -2 * step_y;
+ break;
+ }
+
state.xscroll += step_x;
state.yscroll += step_y;
11 years, 9 months
r13295 chris_y - in /trunk/netsurf/amiga: context_menu.c tree.c
by netsurf@semichrome.net
Author: chris_y
Date: Sun Dec 18 11:59:23 2011
New Revision: 13295
URL: http://source.netsurf-browser.org?rev=13295&view=rev
Log:
Complete treeview context menu.
Fix mouse trapping.
Remove remaining buttons (from non-SSL trees). May return as a graphical toolbar at
some point, but for now I'm glad to be rid of them. All the options are in the
context menu.
Modified:
trunk/netsurf/amiga/context_menu.c
trunk/netsurf/amiga/tree.c
Modified: trunk/netsurf/amiga/context_menu.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/context_menu.c?rev=...
==============================================================================
--- trunk/netsurf/amiga/context_menu.c (original)
+++ trunk/netsurf/amiga/context_menu.c Sun Dec 18 11:59:23 2011
@@ -44,6 +44,7 @@
#include "desktop/selection.h"
#include "desktop/searchweb.h"
#include "desktop/textinput.h"
+#include "desktop/tree_url_node.h"
#include "render/box.h"
#include "render/form.h"
#include "utils/utf8.h"
@@ -943,6 +944,7 @@
struct node *root = tree_get_root(tree);
struct node *sel_node = tree_get_selected_node(root);
bool has_selection = tree_node_has_selection(root);
+ bool menu_content = false;
if(ctxmenuobj) DisposeObject(ctxmenuobj);
@@ -964,15 +966,61 @@
PMIA_UserData, NULL,
TAG_DONE),
~0);
- }
-
+
+ menu_content = true;
+ }
if(type == AMI_TREE_HOTLIST) {
- IDoMethod(ctxmenuobj, PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- ~0);
+ if(menu_content == true) {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ ~0);
+
+ menu_content = false;
+ }
+
+ if(has_selection && (sel_node != NULL)) {
+ if(tree_node_is_folder(sel_node) == true) {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITFOLDER],
+ PMIA_ID, CMID_TREE_EDITFOLDER,
+ PMIA_UserData, NULL,
+ TAG_DONE),
+ ~0);
+ }
+ else
+ {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITTITLE],
+ PMIA_ID, CMID_TREE_EDITTITLE,
+ PMIA_UserData, sel_node,
+ TAG_DONE),
+ ~0);
+
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_EDITLINK],
+ PMIA_ID, CMID_TREE_EDITLINK,
+ PMIA_UserData, sel_node,
+ TAG_DONE),
+ ~0);
+ }
+ menu_content = true;
+ }
+
+ if(menu_content == true) {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ ~0);
+
+ menu_content = false;
+ }
IDoMethod(ctxmenuobj, PM_INSERT,
NewObject(POPUPMENU_GetItemClass(), NULL,
@@ -989,9 +1037,84 @@
PMIA_UserData, NULL,
TAG_DONE),
~0);
- }
-
- IDoMethod(ctxmenuobj, PM_OPEN, win);
+
+ if(has_selection && (sel_node != NULL) &&
+ (tree_node_is_folder(sel_node) == true)) {
+
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ ~0);
+
+ if(tree_node_is_default(sel_node) == true)
+ {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_CLEARDEFAULT],
+ PMIA_ID, CMID_TREE_CLEARDEFAULT,
+ PMIA_UserData, NULL,
+ TAG_DONE),
+ ~0);
+ }
+ else
+ {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_SETDEFAULT],
+ PMIA_ID, CMID_TREE_SETDEFAULT,
+ PMIA_UserData, NULL,
+ TAG_DONE),
+ ~0);
+ }
+ }
+
+ menu_content = true;
+ }
+
+ if((type == AMI_TREE_HISTORY) && has_selection &&
+ (sel_node != NULL) && (tree_node_is_folder(sel_node) == false)) {
+ if(menu_content == true) {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ ~0);
+ }
+
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_ADDHOTLIST],
+ PMIA_ID, CMID_TREE_ADDHOTLIST,
+ PMIA_UserData, sel_node,
+ TAG_DONE),
+ ~0);
+
+ menu_content = true;
+ }
+
+ if(has_selection) {
+ if(menu_content == true) {
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ ~0);
+ }
+
+ IDoMethod(ctxmenuobj, PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_TREE_DELETE],
+ PMIA_ID, CMID_TREE_DELETE,
+ PMIA_UserData, root,
+ TAG_DONE),
+ ~0);
+
+ menu_content = true;
+ }
+
+ if(menu_content == true)
+ IDoMethod(ctxmenuobj, PM_OPEN, win);
}
static uint32 ami_context_menu_hook_tree(struct Hook *hook, Object *item, APTR reserved)
@@ -1010,12 +1133,40 @@
tree_launch_selected(tree, true);
break;
+ case CMID_TREE_EDITFOLDER:
+ hotlist_edit_selected();
+ break;
+
+ case CMID_TREE_EDITTITLE:
+ tree_url_node_edit_title(tree, userdata);
+ break;
+
+ case CMID_TREE_EDITLINK:
+ tree_url_node_edit_url(tree, userdata);
+ break;
+
case CMID_TREE_NEWFOLDER:
hotlist_add_folder(true);
break;
case CMID_TREE_NEWITEM:
hotlist_add_entry(true);
+ break;
+
+ case CMID_TREE_SETDEFAULT:
+ hotlist_set_default_folder(false);
+ break;
+
+ case CMID_TREE_CLEARDEFAULT:
+ hotlist_set_default_folder(true);
+ break;
+
+ case CMID_TREE_ADDHOTLIST:
+ hotlist_add_page(tree_url_node_get_url(userdata));
+ break;
+
+ case CMID_TREE_DELETE:
+ tree_delete_selected_nodes(tree, userdata);
break;
}
}
Modified: trunk/netsurf/amiga/tree.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/tree.c?rev=13295&r1...
==============================================================================
--- trunk/netsurf/amiga/tree.c (original)
+++ trunk/netsurf/amiga/tree.c Sun Dec 18 11:59:23 2011
@@ -70,8 +70,6 @@
enum {
GID_OPEN = GID_LAST,
- GID_DEL,
- GID_DEFAULT,
GID_TREE_LAST
};
@@ -467,66 +465,22 @@
void ami_tree_update_buttons(struct treeview_window *twin)
{
- BOOL launch_disable = FALSE;
- BOOL set_default_disable = TRUE;
-
if(twin->type == AMI_TREE_SSLCERT) return;
if(tree_node_has_selection(tree_get_root(twin->tree)))
{
- struct node *selected_node =
- tree_get_selected_node(tree_get_root(twin->tree));
-
OnMenu(twin->win, AMI_TREE_MENU_DELETE);
OnMenu(twin->win, AMI_TREE_MENU_CLEAR);
-
- RefreshSetGadgetAttrs((struct Gadget *)twin->objects[GID_DEL],
- twin->win, NULL,
- GA_Disabled, FALSE,
- TAG_DONE);
-
- if((selected_node && (tree_node_is_folder(selected_node) == true)))
- {
- launch_disable = TRUE;
- set_default_disable = FALSE;
- }
}
else
{
OffMenu(twin->win, AMI_TREE_MENU_DELETE);
OffMenu(twin->win, AMI_TREE_MENU_CLEAR);
-
- RefreshSetGadgetAttrs((struct Gadget *)twin->objects[GID_DEL],
- twin->win, NULL,
- GA_Disabled, TRUE,
- TAG_DONE);
-
- launch_disable = TRUE;
- }
-
- if(twin->type != AMI_TREE_COOKIES)
- {
- RefreshSetGadgetAttrs((struct Gadget *)twin->objects[GID_OPEN],
- twin->win, NULL,
- GA_Disabled, launch_disable,
- TAG_DONE);
- }
-
- if(twin->type == AMI_TREE_HOTLIST)
- {
- RefreshSetGadgetAttrs((struct Gadget *)twin->objects[GID_DEFAULT],
- twin->win, NULL,
- GA_Disabled, set_default_disable,
- TAG_DONE);
}
}
void ami_tree_open(struct treeview_window *twin,int type)
{
- BOOL msel = TRUE,nothl = TRUE,launchdisable=FALSE;
- static WORD gen=0;
- char folderclosed[100],folderopen[100],item[100];
-
if(twin->win)
{
WindowToFront(twin->win);
@@ -539,20 +493,15 @@
switch(twin->type)
{
case AMI_TREE_HOTLIST:
- nothl = FALSE;
twin->wintitle = ami_utf8_easy((char *)messages_get("Hotlist"));
break;
case AMI_TREE_COOKIES:
- nothl = TRUE;
- launchdisable=TRUE;
twin->wintitle = ami_utf8_easy((char *)messages_get("Cookies"));
break;
case AMI_TREE_HISTORY:
- nothl = TRUE;
twin->wintitle = ami_utf8_easy((char *)messages_get("GlobalHistory"));
break;
case AMI_TREE_SSLCERT:
- nothl = TRUE;
twin->wintitle = ami_utf8_easy((char *)messages_get("SSLCerts"));
twin->sslerr = ami_utf8_easy((char *)messages_get("SSLError"));
twin->sslaccept = ami_utf8_easy((char *)messages_get("Accept"));
@@ -677,26 +626,6 @@
SPACE_Transparent,TRUE,
SPACE_BevelStyle, BVS_DISPLAY,
SpaceEnd,
- LAYOUT_AddChild, HGroupObject,
- LAYOUT_AddChild, twin->objects[GID_OPEN] = ButtonObject,
- GA_ID,GID_OPEN,
- GA_Text,messages_get("TreeLaunch"),
- GA_RelVerify,TRUE,
- GA_Disabled,launchdisable,
- ButtonEnd,
- LAYOUT_AddChild, twin->objects[GID_DEL] = ButtonObject,
- GA_ID,GID_DEL,
- GA_Text,messages_get("TreeDelete"),
- GA_RelVerify,TRUE,
- ButtonEnd,
- LAYOUT_AddChild, twin->objects[GID_DEFAULT] = ButtonObject,
- GA_ID, GID_DEFAULT,
- GA_Text, messages_get("TreeDefault"),
- GA_RelVerify, TRUE,
- GA_Disabled, TRUE,
- ButtonEnd,
- EndGroup,
- CHILD_WeightedHeight,0,
EndGroup,
EndWindow;
}
@@ -800,13 +729,9 @@
switch(result & WMHI_GADGETMASK)
{
case GID_OPEN:
- if(twin->type == AMI_TREE_SSLCERT)
- {
- sslcert_accept(twin->ssl_data);
- ami_tree_close(twin);
- return TRUE;
- }
- else tree_launch_selected(twin->tree, true);
+ sslcert_accept(twin->ssl_data);
+ ami_tree_close(twin);
+ return TRUE;
break;
case GID_CANCEL:
@@ -814,25 +739,6 @@
ami_tree_close(twin);
return TRUE;
break;
-
- case GID_DEFAULT:
- hotlist_set_default_folder(false);
- break;
-
- case GID_DEL:
- switch(twin->type)
- {
- case AMI_TREE_HISTORY:
- history_global_delete_selected();
- break;
- case AMI_TREE_COOKIES:
- cookies_delete_selected();
- break;
- case AMI_TREE_HOTLIST:
- hotlist_delete_selected();
- break;
- }
- break;
}
break;
@@ -847,10 +753,11 @@
(twin->win->MouseY - bbox->Top >=0) &&
(twin->win->MouseY - bbox->Height - bbox->Top <=0))
{
- if(twin->rmbtrapped == FALSE)
+ if((twin->type != AMI_TREE_SSLCERT) &&
+ (twin->rmbtrapped == FALSE))
{
SetWindowAttr(twin->win, WA_RMBTrap, (APTR)(BOOL)TRUE, sizeof(BOOL));
- twin->rmbtrapped = FALSE;
+ twin->rmbtrapped = TRUE;
}
}
else
@@ -858,7 +765,7 @@
if(twin->rmbtrapped == TRUE)
{
SetWindowAttr(twin->win, WA_RMBTrap, (APTR)(BOOL)FALSE, sizeof(BOOL));
- twin->rmbtrapped = TRUE;
+ twin->rmbtrapped = FALSE;
}
}
11 years, 9 months
r13294 mono - /trunk/netsurf/atari/settings.c
by netsurf@semichrome.net
Author: mono
Date: Sun Dec 18 10:46:36 2011
New Revision: 13294
URL: http://source.netsurf-browser.org?rev=13294&view=rev
Log:
Fix assignment of option_target_blank
Modified:
trunk/netsurf/atari/settings.c
Modified: trunk/netsurf/atari/settings.c
URL: http://source.netsurf-browser.org/trunk/netsurf/atari/settings.c?rev=1329...
==============================================================================
--- trunk/netsurf/atari/settings.c (original)
+++ trunk/netsurf/atari/settings.c Sun Dec 18 10:46:36 2011
@@ -625,7 +625,7 @@
option_memory_cache_size = tmp_option_memory_cache_size * 100000;
/* "Browser" tab: */
- option_target_blank = OBJ_SELECTED(CHOICES_CB_DISABLE_POPUP_WINDOWS);
+ option_target_blank = !OBJ_SELECTED(CHOICES_CB_DISABLE_POPUP_WINDOWS);
option_block_ads = OBJ_SELECTED(CHOICES_CB_HIDE_ADVERTISEMENT);
option_accept_language = ObjcString( dlgtree, CHOICES_BT_SEL_LOCALE, NULL);
option_expire_url = atoi(ObjcString( dlgtree, CHOICES_EDIT_HISTORY_AGE,
11 years, 9 months
r13293 tlsa - in /trunk/netsurf/desktop: scrollbar.c scrollbar.h
by netsurf@semichrome.net
Author: tlsa
Date: Sun Dec 18 09:36:38 2011
New Revision: 13293
URL: http://source.netsurf-browser.org?rev=13293&view=rev
Log:
Add named scroll offset values for page up, page down, top and bottom.
Modified:
trunk/netsurf/desktop/scrollbar.c
trunk/netsurf/desktop/scrollbar.h
Modified: trunk/netsurf/desktop/scrollbar.c
URL: http://source.netsurf-browser.org/trunk/netsurf/desktop/scrollbar.c?rev=1...
==============================================================================
--- trunk/netsurf/desktop/scrollbar.c (original)
+++ trunk/netsurf/desktop/scrollbar.c Sun Dec 18 09:36:38 2011
@@ -461,6 +461,30 @@
/* zero scroll step, or unscrollable */
return false;
+ /* Convert named change values to appropriate pixel offset value */
+ switch (change) {
+ case SCROLL_TOP:
+ change = -s->full_size;
+ break;
+
+ case SCROLL_PAGE_UP:
+ change = -s->visible_size;
+ break;
+
+ case SCROLL_PAGE_DOWN:
+ change = s->visible_size;
+ break;
+
+ case SCROLL_BOTTOM:
+ change = s->full_size;
+ break;
+
+ default:
+ /* Change value is already a pixel offset */
+ break;
+ }
+
+ /* Get new offset */
if (s->offset + change > s->full_size - s->visible_size)
s->offset = s->full_size - s->visible_size;
else if (s->offset + change < 0)
@@ -472,6 +496,7 @@
/* Nothing happened */
return false;
+ /* Update scrollbar */
well_length = s->length - 2 * SCROLLBAR_WIDTH;
s->bar_pos = (s->full_size < 1) ? 0 :
((well_length * s->offset) / s->full_size);
Modified: trunk/netsurf/desktop/scrollbar.h
URL: http://source.netsurf-browser.org/trunk/netsurf/desktop/scrollbar.h?rev=1...
==============================================================================
--- trunk/netsurf/desktop/scrollbar.h (original)
+++ trunk/netsurf/desktop/scrollbar.h Sun Dec 18 09:36:38 2011
@@ -24,10 +24,17 @@
#define _NETSURF_DESKTOP_SCROLLBAR_H_
#include <stdbool.h>
+#include <limits.h>
#include "desktop/browser.h"
#define SCROLLBAR_WIDTH 16
+
+/* Region dependent values for scrollbar_scroll function */
+#define SCROLL_TOP INT_MIN
+#define SCROLL_PAGE_UP INT_MIN + 1
+#define SCROLL_PAGE_DOWN INT_MAX - 1
+#define SCROLL_BOTTOM INT_MAX
struct scrollbar;
11 years, 9 months
r13292 stevef - /trunk/netsurf/riscos/window.c
by netsurf@semichrome.net
Author: stevef
Date: Sun Dec 18 05:18:52 2011
New Revision: 13292
URL: http://source.netsurf-browser.org?rev=13292&view=rev
Log:
Implement Home and End scroll functionality.
Modified:
trunk/netsurf/riscos/window.c
Modified: trunk/netsurf/riscos/window.c
URL: http://source.netsurf-browser.org/trunk/netsurf/riscos/window.c?rev=13292...
==============================================================================
--- trunk/netsurf/riscos/window.c (original)
+++ trunk/netsurf/riscos/window.c Sun Dec 18 05:18:52 2011
@@ -3017,6 +3017,7 @@
{
int visible_x, visible_y;
int step_x = 0, step_y = 0;
+ int toolbar_y;
wimp_window_state state;
wimp_pointer pointer;
os_error *error;
@@ -3035,14 +3036,13 @@
return;
}
- visible_x = state.visible.x1 - state.visible.x0 - 32;
- visible_y = state.visible.y1 - state.visible.y0 - 32;
-
toolbar = ro_toolbar_parent_window_lookup(g->window);
assert(g == NULL || g->toolbar == NULL || g->toolbar == toolbar);
- if (toolbar != NULL)
- visible_y -= ro_toolbar_full_height(toolbar);
+ toolbar_y = (toolbar == NULL) ? 0 : ro_toolbar_full_height(toolbar);
+
+ visible_x = state.visible.x1 - state.visible.x0 - 32;
+ visible_y = state.visible.y1 - state.visible.y0 - 32 - toolbar_y;
error = xwimp_get_pointer_info(&pointer);
if (error) {
@@ -3068,8 +3068,10 @@
step_x = visible_x;
break;
case 0x80000000:
+ step_x = -0x10000000;
break;
case 0x7fffffff:
+ step_x = 0x10000000;
break;
default:
step_x = (visible_x * (scroll_x>>2)) >> 2;
@@ -3092,8 +3094,10 @@
step_y = -visible_y;
break;
case 0x80000000:
+ step_y = -0x10000000;
break;
case 0x7fffffff:
+ step_y = 0x10000000;
break;
default:
step_y = (visible_y * (scroll_y>>2)) >> 2;
11 years, 9 months
r13291 stevef - /trunk/netsurf/riscos/window.c
by netsurf@semichrome.net
Author: stevef
Date: Sat Dec 17 17:25:06 2011
New Revision: 13291
URL: http://source.netsurf-browser.org?rev=13291&view=rev
Log:
Don't allow framesets to scroll out of view.
Modified:
trunk/netsurf/riscos/window.c
Modified: trunk/netsurf/riscos/window.c
URL: http://source.netsurf-browser.org/trunk/netsurf/riscos/window.c?rev=13291...
==============================================================================
--- trunk/netsurf/riscos/window.c (original)
+++ trunk/netsurf/riscos/window.c Sat Dec 17 17:25:06 2011
@@ -1618,6 +1618,16 @@
/* first resize stops any flickering by making the URL window on top */
ro_gui_url_complete_resize(g->toolbar, PTR_WIMP_OPEN(&state));
+ /* Windows containing framesets can only be scrolled via the core, which
+ * is implementing frame scrollbars itself. The x and y offsets are
+ * therefore fixed.
+ */
+
+ if (g->bw->children != NULL) {
+ state.xscroll = 0;
+ state.yscroll = toolbar_height;
+ }
+
error = xwimp_open_window_nested_with_flags(&state, parent, linkage);
if (error) {
LOG(("xwimp_open_window: 0x%x: %s",
@@ -3105,9 +3115,12 @@
handled = browser_window_scroll_at_point(g->bw, pos.x, pos.y,
step_x / 2, -step_y / 2);
- /* If the core didn't do the scrolling, handle it via the Wimp. */
-
- if (!handled) {
+ /* If the core didn't do the scrolling, handle it via the Wimp.
+ * Windows which contain frames can only be scrolled by the core,
+ * because it implements frame scroll bars.
+ */
+
+ if (!handled && g->bw->children == NULL) {
state.xscroll += step_x;
state.yscroll += step_y;
11 years, 9 months