SVN commit 896002 by porten: Merged revision 896001: Ony way to fix TAB getting stuck on option elements. Another would be to reimplement handleEvent() and catch things there. Fixes BUG: 156164 and 7 duplicates. M +15 -0 render_form.cpp M +1 -0 render_form.h M +1 -0 render_replaced.cpp --- branches/KDE/4.1/kdelibs/khtml/rendering/render_form.cpp #896001:896002 @@ -1206,6 +1206,7 @@ { case Qt::Key_Tab: forward=true; + // fall through case Qt::Key_Backtab: // ugly hack. emulate popdownlistbox() (private in QComboBox) // we re-use ke here to store the reference to the generated event. @@ -1221,6 +1222,20 @@ return KComboBox::eventFilter(dest, e); } +void ComboBoxWidget::keyPressEvent(QKeyEvent *e) +{ + // Normally, widgets are not sent Tab keys this way in the first + // place as they are handled by QWidget::event() for focus handling + // already. But we get our events via EventPropagator::sendEvent() + // directly. Ignore them so that HTMLGenericFormElementImpl:: + // defaultEventHandler() can call focusNextPrev(). + if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { + e->ignore(); + return; + } + KComboBox::keyPressEvent(e); +} + // ------------------------------------------------------------------------- RenderSelect::RenderSelect(HTMLSelectElementImpl *element) --- branches/KDE/4.1/kdelibs/khtml/rendering/render_form.h #896001:896002 @@ -413,6 +413,7 @@ protected: virtual bool event(QEvent *); virtual bool eventFilter(QObject *dest, QEvent *e); + virtual void keyPressEvent(QKeyEvent *e); virtual void showPopup(); virtual void hidePopup(); }; --- branches/KDE/4.1/kdelibs/khtml/rendering/render_replaced.cpp #896001:896002 @@ -854,6 +854,7 @@ } void RenderWidget::EventPropagator::sendEvent(QEvent *e) { + // ### why don't we just call event()? That would be the normal route. switch(e->type()) { case QEvent::Wheel: wheelEvent ( static_cast (e) );