diff options
Diffstat (limited to 'khtml/khtmlview.cpp')
-rw-r--r-- | khtml/khtmlview.cpp | 164 |
1 files changed, 159 insertions, 5 deletions
diff --git a/khtml/khtmlview.cpp b/khtml/khtmlview.cpp index 7f800a670..850d8e9cd 100644 --- a/khtml/khtmlview.cpp +++ b/khtml/khtmlview.cpp @@ -151,6 +151,9 @@ public: KHTMLViewPrivate() : underMouse( 0 ), underMouseNonShared( 0 ), visibleWidgets( 107 ) +#ifndef NO_SMOOTH_SCROLL_HACK + , dx(0), dy(0), ddx(0), ddy(0), rdx(0), rdy(0), scrolling(false) +#endif { #ifndef KHTML_NO_CARET m_caretViewContext = 0; @@ -396,6 +399,17 @@ public: short m_mouseScroll_byY; TQTimer *m_mouseScrollTimer; TQWidget *m_mouseScrollIndicator; +#ifndef NO_SMOOTH_SCROLL_HACK + TQTimer timer2; + int dx; + int dy; + // Step size * 16 and residual to avoid huge difference between 1px/step and 2px/step + int ddx; + int ddy; + int rdx; + int rdy; + bool scrolling; +#endif }; #ifndef QT_NO_TOOLTIP @@ -504,6 +518,11 @@ KHTMLView::KHTMLView( KHTMLPart *part, TQWidget *parent, const char *name) init(); viewport()->show(); +#ifndef NO_SMOOTH_SCROLL_HACK +#define timer timer2 + connect(&d->timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(scrollTick())); +#undef timer +#endif } KHTMLView::~KHTMLView() @@ -1544,7 +1563,7 @@ void KHTMLView::keyPressEvent( TQKeyEvent *_ke ) case Key_Down: case Key_J: if (!d->scrollTimerId || d->scrollSuspended) - scrollBy( 0, 10 ); + scrollBy( 0, 10 * _ke->count() ); if (d->scrollTimerId) d->newScrollTimer(this, 0); break; @@ -1559,7 +1578,7 @@ void KHTMLView::keyPressEvent( TQKeyEvent *_ke ) case Key_Up: case Key_K: if (!d->scrollTimerId || d->scrollSuspended) - scrollBy( 0, -10 ); + scrollBy( 0, -10 * _ke->count()); if (d->scrollTimerId) d->newScrollTimer(this, 0); break; @@ -1572,14 +1591,14 @@ void KHTMLView::keyPressEvent( TQKeyEvent *_ke ) case Key_Right: case Key_L: if (!d->scrollTimerId || d->scrollSuspended) - scrollBy( 10, 0 ); + scrollBy( 10 * _ke->count(), 0 ); if (d->scrollTimerId) d->newScrollTimer(this, 0); break; case Key_Left: case Key_H: if (!d->scrollTimerId || d->scrollSuspended) - scrollBy( -10, 0 ); + scrollBy( -10 * _ke->count(), 0 ); if (d->scrollTimerId) d->newScrollTimer(this, 0); break; @@ -1712,8 +1731,16 @@ void KHTMLView::keyReleaseEvent(TQKeyEvent *_ke) d->scrollSuspendPreActivate = false; if( _ke->key() == Key_Shift && d->scrollSuspendPreActivate && _ke->state() == Qt::ShiftButton && !(KApplication::keyboardMouseState() & Qt::ShiftButton)) + { if (d->scrollTimerId) - d->scrollSuspended = !d->scrollSuspended; + { + d->scrollSuspended = !d->scrollSuspended; +#ifndef NO_SMOOTH_SCROLL_HACK + if( d->scrollSuspended ) + stopScrolling(); +#endif + } + } if (d->accessKeysEnabled) { @@ -3061,6 +3088,16 @@ void KHTMLView::addFormCompletionItem(const TQString &name, const TQString &valu d->formCompletions->writeEntry(name, items); } +void KHTMLView::removeFormCompletionItem(const TQString &name, const TQString &value) +{ + if (!m_part->settings()->isFormCompletionEnabled()) + return; + + TQStringList items = formCompletionItems(name); + if (items.remove(value)) + d->formCompletions->writeEntry(name, items); +} + void KHTMLView::addNonPasswordStorableSite(const TQString& host) { if (!d->formCompletions) { @@ -3259,7 +3296,11 @@ void KHTMLView::viewportWheelEvent(TQWheelEvent* e) else { d->scrollBarMoved = true; +#ifndef NO_SMOOTH_SCROLL_HACK + scrollViewWheelEvent( e ); +#else TQScrollView::viewportWheelEvent( e ); +#endif TQMouseEvent *tempEvent = new TQMouseEvent( TQEvent::MouseMove, TQPoint(-1,-1), TQPoint(-1,-1), Qt::NoButton, e->state() ); emit viewportMouseMoveEvent ( tempEvent ); @@ -4462,4 +4503,117 @@ void KHTMLView::moveCaretToLineEnd() #endif // KHTML_NO_CARET +#ifndef NO_SMOOTH_SCROLL_HACK +#define timer timer2 + +// All scrolls must be completed within 240ms of last keypress +static const int SCROLL_TIME = 240; +// Each step is 20 ms == 50 frames/second +static const int SCROLL_TICK = 20; + +void KHTMLView::scrollBy(int dx, int dy) +{ + KConfigGroup cfg( KGlobal::config(), "KDE" ); + if( !cfg.readBoolEntry( "SmoothScrolling", true )) { + TQScrollView::scrollBy( dx, dy ); + return; + } + // scrolling destination + int full_dx = d->dx + dx; + int full_dy = d->dy + dy; + + // scrolling speed + int ddx = 0; + int ddy = 0; + + int steps = SCROLL_TIME/SCROLL_TICK; + + ddx = (full_dx*16)/steps; + ddy = (full_dy*16)/steps; + + // don't go under 1px/step + if (ddx > 0 && ddx < 16) ddx = 16; + if (ddy > 0 && ddy < 16) ddy = 16; + if (ddx < 0 && ddx > -16) ddx = -16; + if (ddy < 0 && ddy > -16) ddy = -16; + + d->dx = full_dx; + d->dy = full_dy; + d->ddx = ddx; + d->ddy = ddy; + + if (!d->scrolling) { + scrollTick(); + startScrolling(); + } +} + +void KHTMLView::scrollTick() { + if (d->dx == 0 && d->dy == 0) { + stopScrolling(); + return; + } + + int tddx = d->ddx + d->rdx; + int tddy = d->ddy + d->rdy; + + int ddx = tddx / 16; + int ddy = tddy / 16; + d->rdx = tddx % 16; + d->rdy = tddy % 16; + + if (d->dx > 0 && ddx > d->dx) ddx = d->dx; + else + if (d->dx < 0 && ddx < d->dx) ddx = d->dx; + + if (d->dy > 0 && ddy > d->dy) ddy = d->dy; + else + if (d->dy < 0 && ddy < d->dy) ddy = d->dy; + + d->dx -= ddx; + d->dy -= ddy; + +// TQScrollView::setContentsPos( contentsX() + ddx, contentsY() + ddy); + kapp->syncX(); + TQScrollView::scrollBy(ddx, ddy); +// Unaccelerated X can get seriously overloaded by scrolling and for some reason +// will send KeyPress events only infrequently. This should help to reduce +// the load. + kapp->syncX(); +} + +void KHTMLView::startScrolling() +{ + d->scrolling = true; + d->timer.start(SCROLL_TICK, false); +} + +void KHTMLView::stopScrolling() +{ + d->timer.stop(); + d->dx = d->dy = 0; + d->scrolling = false; +} + +// Overloaded from TQScrollView and TQScrollBar +void KHTMLView::scrollViewWheelEvent( TQWheelEvent *e ) +{ + int pageStep = verticalScrollBar()->pageStep(); + int lineStep = verticalScrollBar()->lineStep(); + int step = QMIN( TQApplication::wheelScrollLines()*lineStep, pageStep ); + if ( ( e->state() & ControlButton ) || ( e->state() & ShiftButton ) ) + step = pageStep; + + if(e->orientation() == Horizontal) + scrollBy(-((e->delta()*step)/120), 0); + else if(e->orientation() == Vertical) + scrollBy(0,-((e->delta()*step)/120)); + + e->accept(); +} + +#undef timer + +#endif // NO_SMOOTH_SCROLL_HACK + #undef DEBUG_CARETMODE |