[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: Re: [PATCH] fix event flow to support activate events
From: Tobias Anton <TA () ESC-Electronics ! de>
Date: 2004-07-23 16:30:04
Message-ID: 200407231830.04584.TA () ESC-Electronics ! de
[Download RAW message or body]
On Dienstag, 20. Juli 2004 15:46, bj@altern.org wrote:
> Hi! Didn't have time to read the patch, but it seriously breaks some
> javascript events.
> testcase (doesn't work anymore with your patch) :
D'oh!
This is a side effect of removing the old ecma click event hack.
Making ecma click&doubleclick events bubble solves this problem.
new patch attached.
I'm aware of a minor glitch yet: when a link is focused, it is set active
whenever any key is being pressed.
Cheers
-- Tobias
["form-elements-react-on-activate-not-mouseup.diff" (text/x-diff)]
? temp
? testregression
Index: html/html_formimpl.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/html/html_formimpl.cpp,v
retrieving revision 1.375
diff -u -3 -p -w -r1.375 html_formimpl.cpp
--- html/html_formimpl.cpp 12 Jul 2004 22:39:44 -0000 1.375
+++ html/html_formimpl.cpp 23 Jul 2004 13:29:26 -0000
@@ -850,7 +850,9 @@ void HTMLGenericFormElementImpl::default
}
}
- if (evt->target()==this && !m_disabled)
+ if (!m_disabled)
+ {
+ if (evt->target()==this)
{
// Report focus in/out changes to the browser extension (editable widgets \
only) KHTMLView *view = getDocument()->view();
@@ -860,22 +862,6 @@ void HTMLGenericFormElementImpl::default
if (ext)
ext->editableWidgetFocused(widget);
}
- if (evt->id()==EventImpl::MOUSEDOWN_EVENT || \
evt->id()==EventImpl::KEYDOWN_EVENT)
- {
- setActive();
- }
- else if (evt->id() == EventImpl::MOUSEUP_EVENT || \
evt->id()==EventImpl::KEYUP_EVENT)
- {
- if (m_active)
- {
- setActive(false);
- setFocus();
- }
- else {
- setActive(false);
- }
- }
-
if (evt->id() == EventImpl::KHTML_KEYPRESS_EVENT) {
TextEventImpl * k = static_cast<TextEventImpl *>(evt);
int key = k->qKeyEvent ? k->qKeyEvent->key() : 0;
@@ -887,7 +873,6 @@ void HTMLGenericFormElementImpl::default
}
}
-
if (view && evt->id() == EventImpl::DOMFOCUSOUT_EVENT && isEditable() && m_render \
&& m_render->isWidget()) {
KHTMLPartBrowserExtension *ext = static_cast<KHTMLPartBrowserExtension \
*>(view->part()->browserExtension()); QWidget *widget = \
static_cast<RenderWidget*>(m_render)->widget(); @@ -897,12 +882,17 @@ void \
HTMLGenericFormElementImpl::default
// ### Don't count popup as a valid reason for losing the focus (example: \
opening the options of a select // combobox shouldn't emit onblur)
}
- }
- if (evt->target() == this && evt->isMouseEvent() && renderer())
+
+ if (evt->isMouseEvent() && renderer())
evt->setDefaultHandled();
+ }
+ // don't call the base class if the form control is disabled!
+ // HTMLElementImpl doesn't know about the inactive state
+ // and will set this element focused.
HTMLElementImpl::defaultEventHandler(evt);
}
+}
bool HTMLGenericFormElementImpl::isEditable()
{
@@ -959,16 +949,8 @@ void HTMLButtonElementImpl::parseAttribu
void HTMLButtonElementImpl::defaultEventHandler(EventImpl *evt)
{
- if (m_type != BUTTON && !m_disabled) {
- bool act = (evt->id() == EventImpl::DOMACTIVATE_EVENT);
- if (!act && evt->id()==EventImpl::KEYUP_EVENT) {
- QKeyEvent *ke = static_cast<TextEventImpl *>(evt)->qKeyEvent;
- if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == \
Qt::Key_Enter || ke->key() == Qt::Key_Space))
- act = true;
- }
- if (act)
+ if (evt->target() == this && m_type != BUTTON && !m_disabled && evt->id() == \
EventImpl::DOMACTIVATE_EVENT) activate();
- }
HTMLGenericFormElementImpl::defaultEventHandler(evt);
}
@@ -1476,58 +1458,56 @@ void HTMLInputElementImpl::focus()
getDocument()->setFocusNode(this);
}
+void HTMLInputElementImpl::handleLocalEvents(EventImpl *evt, bool useCapture)
+{
+ if (!useCapture && evt->id()==EventImpl::KHTML_ECMA_CLICK_EVENT && (m_type == \
CHECKBOX || m_type == RADIO)) + {
+ kdDebug ( 6000 ) << "ecma click on " << (m_type == CHECKBOX?"checkbox":"radio") << \
endl; + bool oldvalue = checked();
+ setChecked(m_type==RADIO?true:!oldvalue);
+ HTMLGenericFormElementImpl::handleLocalEvents(evt, useCapture);
+ if (evt->defaultPrevented())
+ setChecked(oldvalue);
+ }
+ else HTMLGenericFormElementImpl::handleLocalEvents(evt, useCapture);
+}
+
void HTMLInputElementImpl::defaultEventHandler(EventImpl *evt)
{
if ( !m_disabled )
{
+ switch ( evt->id() )
+ {
+ case EventImpl::KEYUP_EVENT:
+ case EventImpl::KHTML_KEYPRESS_EVENT:
+ if ( static_cast<TextEventImpl *>(evt)->keyVal() == ' ' && active() && (m_type == \
RADIO || + m_type == CHECKBOX ||
+ m_type == SUBMIT ||
+ m_type == RESET ||
+ m_type == BUTTON ) )
+ evt->setDefaultHandled();
- if (evt->isMouseEvent()) {
- MouseEventImpl *me = static_cast<MouseEventImpl*>(evt);
- if ((m_type == RADIO || m_type == CHECKBOX)
- && me->id() == EventImpl::MOUSEUP_EVENT && me->detail() > 0) {
- // click will follow
- setChecked(m_type == RADIO ? true : !checked());
- }
- if (evt->id() == EventImpl::CLICK_EVENT && m_type == IMAGE && m_render) \
{ + break;
+ case EventImpl::DOMACTIVATE_EVENT:
+ if (m_type == BUTTON || m_type == IMAGE || m_type == SUBMIT || m_type == RESET)
+ {
+ DOMActivateEventImpl *ae = static_cast<DOMActivateEventImpl*>(evt);
+ if (ae->parent() && ae->parent()->id()==EventImpl::CLICK_EVENT && m_type == \
IMAGE && m_render) + {
+ MouseEventImpl *me = static_cast<MouseEventImpl*>(ae->parent());
// record the mouse position for when we get the DOMActivate event
int offsetX, offsetY;
m_render->absolutePosition(offsetX,offsetY);
xPos = me->clientX()-offsetX;
yPos = me->clientY()-offsetY;
}
- }
-
- if (m_type == RADIO || m_type == CHECKBOX || m_type == SUBMIT || m_type == \
RESET || m_type == BUTTON ) {
- bool check = false;
- if (active() && ( evt->id() == EventImpl::KEYUP_EVENT ||
- evt->id() == EventImpl::KHTML_KEYPRESS_EVENT ) ) {
- TextEventImpl *te = static_cast<TextEventImpl *>(evt);
- if (te->keyVal() == ' ')
- check = true;
- }
- if (check) {
- if (evt->id() == EventImpl::KEYUP_EVENT)
- click();
- // Tell the parent that we handle this key (keyup and keydown), even though \
only keyup activates (#70478)
- evt->setDefaultHandled();
- }
- }
-
-
- // DOMActivate events cause the input to be "activated" - in the case of \
image and submit inputs, this means
- // actually submitting the form. For reset inputs, the form is reset. These \
events are sent when the user clicks
- // on the element, or presses enter while it is the active element. \
Javascript code wishing to activate the element
- // must dispatch a DOMActivate event - a click event will not do the job.
- if (m_type == IMAGE || m_type == SUBMIT || m_type == RESET) {
- bool act = (evt->id() == EventImpl::DOMACTIVATE_EVENT);
- if (!act && evt->id() == EventImpl::KEYUP_EVENT) {
- QKeyEvent *ke = static_cast<TextEventImpl *>(evt)->qKeyEvent;
- if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter \
|| ke->key() == Qt::Key_Space))
- act = true;
- }
- if (act)
activate();
+ evt->setDefaultHandled();
}
+ break;
+ default:
+ break;
+ };
}
HTMLGenericFormElementImpl::defaultEventHandler(evt);
}
@@ -1601,23 +1581,22 @@ return newNode;
void HTMLLabelElementImpl::defaultEventHandler(EventImpl *evt)
{
if ( !m_disabled ) {
- bool act = false;
- if ( evt->id() == EventImpl::CLICK_EVENT ) {
- act = true;
- }
- else if ( evt->id() == EventImpl::KEYUP_EVENT ||
- evt->id() == EventImpl::KHTML_KEYPRESS_EVENT ) {
- QKeyEvent *ke = static_cast<TextEventImpl *>(evt)->qKeyEvent;
- if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == \
Qt::Key_Enter || ke->key() == Qt::Key_Space))
- act = true;
- }
+ if (evt->id()==EventImpl::DOMACTIVATE_EVENT) {
- if (act) {
NodeImpl *formNode=getFormElement();
+
if (formNode) {
+ Node guard(formNode);
getDocument()->setFocusNode(formNode);
- if (formNode->id()==ID_INPUT)
- static_cast<DOM::HTMLInputElementImpl*>(formNode)->click();
+ if (formNode->isSelectable())
+ {
+ kdDebug ( 6000 ) << " activating label's target\n";
+ int exceptioncode = 0;
+ DOMActivateEventImpl *ae = new \
DOMActivateEventImpl(getDocument()->defaultView(), 1, static_cast<UIEventImpl \
*>(evt)); + ae->ref();
+ formNode->dispatchEvent(ae,exceptioncode,true);
+ ae->deref();
+ }
}
evt->setDefaultHandled();
}
Index: html/html_formimpl.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/html/html_formimpl.h,v
retrieving revision 1.154
diff -u -3 -p -w -r1.154 html_formimpl.h
--- html/html_formimpl.h 12 Jul 2004 19:57:03 -0000 1.154
+++ html/html_formimpl.h 23 Jul 2004 13:29:26 -0000
@@ -273,6 +273,7 @@ public:
void select();
void click();
+ void activate();
virtual void parseAttribute(AttributeImpl *attr);
@@ -286,11 +287,11 @@ public:
int clickX() const { return xPos; }
int clickY() const { return yPos; }
+ virtual void handleLocalEvents(EventImpl *, bool);
virtual void defaultEventHandler(EventImpl *evt);
virtual bool isEditable();
DOMString altText() const;
- void activate();
protected:
Index: html/html_inlineimpl.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/html/html_inlineimpl.cpp,v
retrieving revision 1.134
diff -u -3 -p -w -r1.134 html_inlineimpl.cpp
--- html/html_inlineimpl.cpp 18 Mar 2004 13:41:37 -0000 1.134
+++ html/html_inlineimpl.cpp 23 Jul 2004 13:29:26 -0000
@@ -51,43 +51,21 @@ NodeImpl::Id HTMLAnchorElementImpl::id()
void HTMLAnchorElementImpl::defaultEventHandler(EventImpl *evt)
{
- bool keydown = evt->id() == EventImpl::KEYDOWN_EVENT;
+ if (evt->id()==EventImpl::DOMACTIVATE_EVENT)
+ {
+ DOMActivateEventImpl *ae = static_cast<DOMActivateEventImpl*>(evt);
- // React on clicks and on keypresses.
- // Don't make this KEYUP_EVENT again, it makes khtml follow links
- // it shouldn't, when pressing Enter in the combo.
- if ( ( (evt->id() == EventImpl::CLICK_EVENT && \
!static_cast<MouseEventImpl*>(evt)->isDoubleClick()) ||
- ( keydown && m_focused)) && m_hasAnchor) {
-
- MouseEventImpl *e = 0;
- if ( evt->id() == EventImpl::CLICK_EVENT )
- e = static_cast<MouseEventImpl*>( evt );
-
- TextEventImpl *k = 0;
- if (keydown)
- k = static_cast<TextEventImpl *>( evt );
+ MouseEventImpl *e = NULL;
+ if (ae->parent() && ae->parent()->id() == EventImpl::CLICK_EVENT)
+ e = static_cast <MouseEventImpl *>(ae->parent());
- QString utarget;
- QString url;
if ( e && e->button() == 2 ) {
HTMLElementImpl::defaultEventHandler(evt);
return;
}
- if ( k ) {
- if (k->virtKeyVal() != TextEventImpl::DOM_VK_ENTER) {
- if (k->qKeyEvent)
- k->qKeyEvent->ignore();
- HTMLElementImpl::defaultEventHandler(evt);
- return;
- }
- if (k->qKeyEvent) k->qKeyEvent->accept();
- }
-
- url = khtml::parseURL(getAttribute(ATTR_HREF)).string();
-
- utarget = getAttribute(ATTR_TARGET).string();
-
+ QString utarget = getAttribute(ATTR_TARGET).string();
+ QString url = khtml::parseURL(getAttribute(ATTR_HREF)).string();
if ( e && e->button() == 1 )
utarget = "_blank";
@@ -117,10 +95,13 @@ void HTMLAnchorElementImpl::defaultEvent
}
}
}
- if ( !evt->defaultPrevented() ) {
+
+ TextEventImpl *k = NULL;
+ if (ae->parent() && (ae->parent()->id() == EventImpl::KEYUP_EVENT || \
ae->parent()->id() == EventImpl::KHTML_KEYPRESS_EVENT)) + k = static_cast \
<TextEventImpl *>(ae->parent()); +
int state = 0;
int button = 0;
-
if ( e ) {
if ( e->ctrlKey() )
state |= Qt::ControlButton;
@@ -153,9 +134,22 @@ void HTMLAnchorElementImpl::defaultEvent
if (getDocument()->view() && !getDocument()->designMode())
getDocument()->view()->part()->
urlSelected( url, button, state, utarget );
- }
+
evt->setDefaultHandled();
}
+ else if (evt->id()==EventImpl::KEYUP_EVENT || \
evt->id()==EventImpl::KHTML_KEYPRESS_EVENT) + {
+ TextEventImpl * k = static_cast<TextEventImpl*>(evt);
+
+ if (k->virtKeyVal() != TextEventImpl::DOM_VK_ENTER) {
+ if (k->qKeyEvent)
+ k->qKeyEvent->ignore();
+ HTMLElementImpl::defaultEventHandler(evt);
+ return;
+ }
+ if (k->qKeyEvent) k->qKeyEvent->accept();
+ }
+
HTMLElementImpl::defaultEventHandler(evt);
}
Index: xml/dom2_eventsimpl.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/xml/dom2_eventsimpl.cpp,v
retrieving revision 1.46
diff -u -3 -p -w -r1.46 dom2_eventsimpl.cpp
--- xml/dom2_eventsimpl.cpp 24 Feb 2004 16:11:56 -0000 1.46
+++ xml/dom2_eventsimpl.cpp 23 Jul 2004 13:29:26 -0000
@@ -731,6 +731,24 @@ bool TextEventImpl::isTextEvent() const
return true;
}
+
+// -----------------------------------------------------------------------------
+
+DOMActivateEventImpl::DOMActivateEventImpl(AbstractViewImpl *viewArg,
+ long detailArg, UIEventImpl *_parent)
+ : UIEventImpl(DOMACTIVATE_EVENT, true, true, viewArg, detailArg)
+{
+ if (_parent)
+ _parent->ref();
+ m_parent = _parent;
+}
+
+DOMActivateEventImpl::~DOMActivateEventImpl()
+{
+ if (m_parent)
+ m_parent->deref();
+}
+
// -----------------------------------------------------------------------------
MutationEventImpl::MutationEventImpl()
Index: xml/dom2_eventsimpl.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/xml/dom2_eventsimpl.h,v
retrieving revision 1.41
diff -u -3 -p -w -r1.41 dom2_eventsimpl.h
--- xml/dom2_eventsimpl.h 24 Feb 2004 16:11:56 -0000 1.41
+++ xml/dom2_eventsimpl.h 23 Jul 2004 13:29:26 -0000
@@ -360,6 +360,25 @@ private:
unsigned long m_modifier;
};
+
+// the domactivate event acts like a normal UIEvent,
+// but carries the ui event that caused it in the
+// property "getParent()".
+// parent() can be 0 for activate events generated
+// by javascript code.
+
+class DOMActivateEventImpl : public UIEventImpl
+{
+public:
+ DOMActivateEventImpl(AbstractViewImpl *viewArg,
+ long detailArg, UIEventImpl *_parent);
+ virtual ~DOMActivateEventImpl();
+ UIEventImpl *parent() const { return m_parent; }
+ private:
+ DOMActivateEventImpl() : UIEventImpl() {}
+ UIEventImpl * m_parent;
+};
+
class MutationEventImpl : public EventImpl {
// ### fire these during parsing (if necessary)
public:
Index: xml/dom_nodeimpl.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/xml/dom_nodeimpl.cpp,v
retrieving revision 1.236
diff -u -3 -p -w -r1.236 dom_nodeimpl.cpp
--- xml/dom_nodeimpl.cpp 12 Jun 2004 15:05:03 -0000 1.236
+++ xml/dom_nodeimpl.cpp 23 Jul 2004 13:29:26 -0000
@@ -42,6 +42,8 @@
#include "khtml_part.h"
#include "dom_nodeimpl.h"
+#define EVENTS_DEBUG
+
// from khtml_caret_p.h
namespace khtml {
void /*KDE_NO_EXPORT*/ mapDOMPosToRenderPos(DOM::NodeImpl *node, long offset,
@@ -414,9 +416,10 @@ void NodeImpl::dispatchGenericEvent( Eve
nodeChain.prepend(n);
}
+ QPtrListIterator<NodeImpl> it(nodeChain);
+
// trigger any capturing event handlers on our way down
evt->setEventPhase(Event::CAPTURING_PHASE);
- QPtrListIterator<NodeImpl> it(nodeChain);
for (; it.current() && it.current() != this && !evt->propagationStopped(); ++it) \
{ evt->setCurrentTarget(it.current());
it.current()->handleLocalEvents(evt,true);
@@ -427,6 +430,9 @@ void NodeImpl::dispatchGenericEvent( Eve
if (!evt->propagationStopped()) {
evt->setEventPhase(Event::AT_TARGET);
evt->setCurrentTarget(it.current());
+#ifdef EVENTS_DEBUG
+ kdDebug(6000) << "handling local event at \
"<<it.current()->nodeName().string()<<endl; +#endif
it.current()->handleLocalEvents(evt, true);
if (!evt->propagationStopped())
it.current()->handleLocalEvents(evt,false);
@@ -449,11 +455,57 @@ void NodeImpl::dispatchGenericEvent( Eve
evt->setEventPhase(0); // I guess this is correct, the spec does not seem to \
say
for (it.toLast(); it.current() && it.current() != propagationSentinel &&
!evt->defaultPrevented() && !evt->defaultHandled(); --it)
+ {
+#ifdef EVENTS_DEBUG
+ kdDebug(6000) << "default event handler of \
"<<it.current()->nodeName().string()<<endl; +#endif
it.current()->defaultEventHandler(evt);
+ }
+
+ if (!evt->defaultPrevented()) {
+ if (evt->id() == EventImpl::CLICK_EVENT && static_cast<MouseEventImpl*>( evt \
)->isDoubleClick() && static_cast<MouseEventImpl*>( evt )->button()==0) + {
+ // hyper activation event resulting from e.g. double click
- if (evt->id() == EventImpl::CLICK_EVENT && !evt->defaultPrevented() &&
- static_cast<MouseEventImpl*>( evt )->button() == 0) // LMB click
- dispatchUIEvent(EventImpl::DOMACTIVATE_EVENT, \
static_cast<UIEventImpl*>(evt)->detail()); +#ifdef EVENTS_DEBUG
+ kdDebug(6000) << "generating hyperactivation event on " << nodeName().string() << \
endl; +#endif
+
+ DOMActivateEventImpl *ae = new DOMActivateEventImpl(getDocument()->defaultView(), \
2, static_cast<UIEventImpl*>(evt)); + int exceptioncode = 0;
+ ae->ref();
+ dispatchEvent(ae,exceptioncode,true);
+ ae->deref();
+ }
+ else if ((evt->id() == EventImpl::CLICK_EVENT && static_cast<MouseEventImpl*>( \
evt )->button() == 0) || + (evt->id() == EventImpl::KEYUP_EVENT && \
static_cast<TextEventImpl*>( evt )->keyVal() == ' ')) + {
+ // simple activation event
+
+#ifdef EVENTS_DEBUG
+ kdDebug(6000) << "generating simple activate event on " << nodeName().string() << \
endl; +#endif
+ DOMActivateEventImpl *ae = new DOMActivateEventImpl(getDocument()->defaultView(), \
1, static_cast<UIEventImpl*>(evt)); +
+ int exceptioncode = 0;
+ ae->ref();
+ dispatchEvent(ae,exceptioncode,true);
+ ae->deref();
+ }
+ else if (evt->id() == EventImpl::DOMACTIVATE_EVENT)
+ {
+ // trigger legacy onclick & ondblclick handlers after a successful activate event
+
+#ifdef EVENTS_DEBUG
+ kdDebug(6000) << "generating ECMA click event on " << nodeName().string() << endl;
+#endif
+ DOMActivateEventImpl *ae = static_cast<DOMActivateEventImpl*> ( evt );
+ if (ae->detail() == 1)
+ dispatchHTMLEvent(EventImpl::KHTML_ECMA_CLICK_EVENT, true, true);
+ else if (ae->detail() == 2)
+ dispatchHTMLEvent(EventImpl::KHTML_ECMA_DBLCLICK_EVENT, true, true);
+ }
+ }
}
// copy this over into a local variable, as the following deref() calls might \
cause this to be deleted. @@ -620,23 +672,30 @@ void \
NodeImpl::handleLocalEvents(EventIm
if (current->id == evt->id() && current->useCapture == useCapture)
current->listener->handleEvent(ev);
- // ECMA legacy hack
- if (current->useCapture == useCapture && evt->id() == \
EventImpl::CLICK_EVENT) {
- MouseEventImpl* me = static_cast<MouseEventImpl*>(evt);
- // To find whether to call onclick or ondblclick, we can't
- // * use me->detail(), it's 2 when clicking twice w/o moving, even very \
slowly
- // * use me->qEvent(), it's not available when using \
initMouseEvent/dispatchEvent
- // So we currently store a bool in MouseEventImpl. If anyone needs to \
trigger
- // dblclicks from the DOM API, we'll need a timer here (well in the \
doc).
- if ( ( !me->isDoubleClick() && current->id == \
EventImpl::KHTML_ECMA_CLICK_EVENT) ||
- ( me->isDoubleClick() && current->id == \
EventImpl::KHTML_ECMA_DBLCLICK_EVENT) )
- current->listener->handleEvent(ev);
- }
}
}
-void NodeImpl::defaultEventHandler(EventImpl *)
+void NodeImpl::defaultEventHandler(EventImpl *evt)
+{
+ if (isSelectable() && evt->target() == this)
{
+ if (evt->id()==EventImpl::MOUSEDOWN_EVENT || \
evt->id()==EventImpl::KEYDOWN_EVENT) + {
+ setActive();
+ }
+ else if (evt->id() == EventImpl::MOUSEUP_EVENT || \
evt->id()==EventImpl::KEYUP_EVENT) + {
+ if (m_active)
+ {
+ setActive(false);
+ setFocus();
+ }
+ else {
+ setActive(false);
+ }
+ }
+ evt->setDefaultHandled();
+ }
}
unsigned long NodeImpl::childNodeCount()
Index: xml/dom_nodeimpl.h
===================================================================
RCS file: /home/kde/kdelibs/khtml/xml/dom_nodeimpl.h,v
retrieving revision 1.159
diff -u -3 -p -w -r1.159 dom_nodeimpl.h
--- xml/dom_nodeimpl.h 12 Jun 2004 15:05:03 -0000 1.159
+++ xml/dom_nodeimpl.h 23 Jul 2004 13:29:26 -0000
@@ -238,7 +238,7 @@ public:
// this matches the logic in KHTMLView.
bool dispatchKeyEvent(QKeyEvent *key, bool keypress);
- void handleLocalEvents(EventImpl *evt, bool useCapture);
+ virtual void handleLocalEvents(EventImpl *evt, bool useCapture);
/**
* Perform the default action for an event e.g. submitting a form
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic