Version: (using KDE Devel) Installed from: Compiled sources OS: Linux pushed buttons are not released until the mouse-out event - when a button is clicked, its image becomes "pushed" but when the mouse button is released, the image remains in the "pushed" state until the mouse is moved outside of the button.
Indeed.
*** Bug 36839 has been marked as a duplicate of this bug. ***
CVS commit by savernik: Fixed :active pseudo class not being unapplied on mouse button release. BUG: 68438 M +6 -0 ChangeLog 1.384 M +10 -8 rendering/render_layer.cpp 1.48 --- kdelibs/khtml/ChangeLog #1.383:1.384 @@ -1,2 +1,8 @@ +2005-02-18 Leo Savernik <l.savernik@aon.at> + + * rendering/render_layer.cpp (updateHoverActiveState): Also mark + textnodes as being active. Use NodeImpl's implementation of setActive + for efficiency reasons, the style is updated anyway afterwards. + 2005-02-16 Leo Savernik <l.savernik@aon.at> --- kdelibs/khtml/rendering/render_layer.cpp #1.47:1.48 @@ -1063,4 +1063,5 @@ void RenderLayer::updateHoverActiveState DOM::NodeImpl* newHoverNode = info.innerNode(); + if (oldHoverNode == newHoverNode && (!oldHoverNode || oldHoverNode->active() == info.active())) return; @@ -1079,9 +1080,9 @@ void RenderLayer::updateHoverActiveState for (RenderObject* curr = oldHoverObj; curr && curr != ancestor; curr = hoverAncestor(curr)) { curr->setMouseInside(false); - if (curr->element() && !curr->isText()) { + if (curr->element()) { bool oldActive = curr->element()->active(); - curr->element()->setActive(false); - if (curr->style()->affectedByHoverRules() || - (curr->style()->affectedByActiveRules() && oldActive)) + curr->element()->NodeImpl::setActive(false); + if (!curr->isText() && (curr->style()->affectedByHoverRules() || + (curr->style()->affectedByActiveRules() && oldActive))) curr->element()->setChanged(); } @@ -1092,12 +1093,13 @@ void RenderLayer::updateHoverActiveState bool oldInside = curr->mouseInside(); curr->setMouseInside(true); - if (curr->element() && !curr->isText()) { + if (curr->element()) { bool oldActive = curr->element()->active(); - curr->element()->setActive(info.active()); - if ((curr->style()->affectedByHoverRules() && !oldInside) || - (curr->style()->affectedByActiveRules() && oldActive != info.active())) + curr->element()->NodeImpl::setActive(info.active()); + if (!curr->isText() && (curr->style()->affectedByHoverRules() && !oldInside) || + (curr->style()->affectedByActiveRules() && oldActive != info.active())) { curr->element()->setChanged(); } } + } }