summaryrefslogtreecommitdiffstats
path: root/opensuse/tdelibs/smooth-scrolling.diff
diff options
context:
space:
mode:
Diffstat (limited to 'opensuse/tdelibs/smooth-scrolling.diff')
-rw-r--r--opensuse/tdelibs/smooth-scrolling.diff267
1 files changed, 267 insertions, 0 deletions
diff --git a/opensuse/tdelibs/smooth-scrolling.diff b/opensuse/tdelibs/smooth-scrolling.diff
new file mode 100644
index 000000000..b369a6146
--- /dev/null
+++ b/opensuse/tdelibs/smooth-scrolling.diff
@@ -0,0 +1,267 @@
+Index: khtml/khtmlview.cpp
+===================================================================
+--- khtml/khtmlview.cpp.orig
++++ 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;
+ QTimer *m_mouseScrollTimer;
+ QWidget *m_mouseScrollIndicator;
++#ifndef NO_SMOOTH_SCROLL_HACK
++ QTimer 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, Q
+ init();
+
+ viewport()->show();
++#ifndef NO_SMOOTH_SCROLL_HACK
++#define timer timer2
++ connect(&d->timer, SIGNAL(timeout()), this, SLOT(scrollTick()));
++#undef timer
++#endif
+ }
+
+ KHTMLView::~KHTMLView()
+@@ -1544,7 +1563,7 @@ void KHTMLView::keyPressEvent( QKeyEvent
+ 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( QKeyEvent
+ 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( QKeyEvent
+ 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(QKeyEven
+ 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)
+ {
+@@ -3259,7 +3286,11 @@ void KHTMLView::viewportWheelEvent(QWhee
+ else
+ {
+ d->scrollBarMoved = true;
++#ifndef NO_SMOOTH_SCROLL_HACK
++ scrollViewWheelEvent( e );
++#else
+ QScrollView::viewportWheelEvent( e );
++#endif
+
+ QMouseEvent *tempEvent = new QMouseEvent( QEvent::MouseMove, QPoint(-1,-1), QPoint(-1,-1), Qt::NoButton, e->state() );
+ emit viewportMouseMoveEvent ( tempEvent );
+@@ -4462,4 +4493,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 )) {
++ QScrollView::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;
++
++// QScrollView::setContentsPos( contentsX() + ddx, contentsY() + ddy);
++ kapp->syncX();
++ QScrollView::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 QScrollView and QScrollBar
++void KHTMLView::scrollViewWheelEvent( QWheelEvent *e )
++{
++ int pageStep = verticalScrollBar()->pageStep();
++ int lineStep = verticalScrollBar()->lineStep();
++ int step = QMIN( QApplication::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
+Index: khtml/khtmlview.h
+===================================================================
+--- khtml/khtmlview.h.orig
++++ khtml/khtmlview.h
+@@ -181,6 +181,11 @@ signals:
+ void hideAccessKeys();
+ void repaintAccessKeys();
+ void findAheadActive( bool );
++//#define NO_SMOOTH_SCROLL_HACK
++#ifndef NO_SMOOTH_SCROLL_HACK
++public slots:
++ void scrollBy(int dx, int dy);
++#endif
+
+ protected:
+ void clear();
+@@ -211,9 +216,23 @@ protected:
+ void contentsContextMenuEvent ( QContextMenuEvent *_ce );
+ void doAutoScroll();
+ void timerEvent ( QTimerEvent * );
++
++#ifndef NO_SMOOTH_SCROLL_HACK
++ void startScrolling();
++ void stopScrolling();
++#ifndef QT_NO_WHEELEVENT
++ void scrollViewWheelEvent( QWheelEvent* e );
++#endif
++#endif
++
+ protected slots:
+ void slotPaletteChanged();
+ void slotScrollBarMoved();
++#ifndef NO_SMOOTH_SCROLL_HACK
++ void scrollTick();
++#else
++ void scrollTick() {}; // moc cannot handle #if
++#endif
+
+ private slots:
+ void tripleClickTimeout();