[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    "Click and Scroll" in konqueror
From:       Julien Gilles <julien.gilles () bcv01y01 ! vz ! cit ! alcatel ! fr>
Date:       2001-09-25 12:09:09
[Download RAW message or body]

--=-=-=


Hi,

there is a cool feature in Acrobat Reader (IMHO), that could be used in
konqueror - and perhaps in other "documents viewer" : it's possible to
left-click on the document, move the mouse, and so "move" the text in
the window, instead of using the scrollbars. 

I have tried to implement this feature in khtml. The choice of the
left button is not the best, as this button is used for browsing, but
the middle button seems to me a good choice.
 
Here is the patch for khtml/khtmlview.cpp. It is for KDE 2.2.1, very
quick and dirty code, can probably be a lot improved, feel free to use
it as you want (even not to use it !).


--=-=-=
Content-Disposition: attachment; filename=diff

*** ../../orig/kdelibs-2.2.1/khtml/khtmlview.cpp	Wed Sep  5 01:07:26 2001
--- khtmlview.cpp	Tue Sep 25 13:52:09 2001
***************
*** 106,113 ****
--- 106,119 ----
  	clickY = -1;
  	prevMouseX = -1;
  	prevMouseY = -1;
+ 	prevGlobalMouseX = -1;
+ 	prevGlobalMouseY = -1;
+ 	clickGlobalX = -1;
+ 	clickGlobalY = -1;
  	clickCount = 0;
  	isDoubleClick = false;
+ 	isMiddleClick = false;
+ 	isMiddleClickAndMove = false;
      }
  
      QPainter *tp;
***************
*** 130,138 ****
--- 136,148 ----
      KSimpleConfig *formCompletions;
  
      int clickX, clickY, clickCount;
+     int clickGlobalX, clickGlobalY;
      bool isDoubleClick;
+     bool isMiddleClick;
+     bool isMiddleClickAndMove;
  
      int prevMouseX, prevMouseY;
+     int prevGlobalMouseX, prevGlobalMouseY;
  };
  
  #ifndef QT_NO_TOOLTIP
***************
*** 393,398 ****
--- 403,417 ----
  	d->clickY = ym;
      }
  
+     if ( _mouse->button() == MidButton ) {
+       d->isMiddleClick = true;
+       d->prevGlobalMouseX = _mouse->globalX();
+       d->prevGlobalMouseY = _mouse->globalY();
+     }
+     else {
+       d->isMiddleClick = false;
+     }
+ 
      dispatchMouseEvent(EventImpl::MOUSEDOWN_EVENT,mev.innerNode.handle(),true,
  		       d->clickCount,_mouse,true,DOM::NodeImpl::MousePress);
      if (mev.innerNode.handle())
***************
*** 415,420 ****
--- 434,441 ----
      //kdDebug( 6000 ) << "mouseDblClickEvent: x=" << xm << ", y=" << ym << endl;
  
      d->isDoubleClick = true;
+     d->clickGlobalX = _mouse->globalX();
+     d->clickGlobalY = _mouse->globalY();
  
      DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseDblClick );
      m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev );
***************
*** 523,531 ****
--- 544,562 ----
      }
      viewport()->setCursor( c );
  
+     if (d->isMiddleClick) {
+       d->isMiddleClickAndMove = true;
+       int deltaX = d->prevGlobalMouseX - _mouse->globalX();
+       int deltaY = d->prevGlobalMouseY - _mouse->globalY();
+       QScrollView::scrollBy(deltaX, deltaY);
+     }
+ 
      d->prevMouseX = xm;
      d->prevMouseY = ym;
  
+     d->prevGlobalMouseX = _mouse->globalX();
+     d->prevGlobalMouseY = _mouse->globalY();
+ 
      khtml::MouseMoveEvent event( _mouse, xm, ym, mev.url, mev.innerNode );
      event.setNodePos( mev.nodeAbsX, mev.nodeAbsY );
      QApplication::sendEvent( m_part, &event );
***************
*** 543,562 ****
      DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseRelease );
      m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev );
  
-     dispatchMouseEvent(EventImpl::MOUSEUP_EVENT,mev.innerNode.handle(),true,
- 		       d->clickCount,_mouse,false,DOM::NodeImpl::MouseRelease);
  
!     if (d->clickCount > 0 &&
!         QPoint(d->clickX-xm,d->clickY-ym).manhattanLength() <= QApplication::startDragDistance())
  	dispatchMouseEvent(EventImpl::CLICK_EVENT,mev.innerNode.handle(),true,
  			   d->clickCount,_mouse,true,DOM::NodeImpl::MouseRelease);
  
!     if (mev.innerNode.handle())
  	mev.innerNode.handle()->setPressed(false);
  
!     khtml::MouseReleaseEvent event( _mouse, xm, ym, mev.url, mev.innerNode );
!     event.setNodePos( mev.nodeAbsX, mev.nodeAbsY );
!     QApplication::sendEvent( m_part, &event );
  }
  
  void KHTMLView::keyPressEvent( QKeyEvent *_ke )
--- 574,599 ----
      DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MouseRelease );
      m_part->xmlDocImpl()->prepareMouseEvent( xm, ym, 0, 0, &mev );
  
  
!     if (! d->isMiddleClickAndMove) {
!       dispatchMouseEvent(EventImpl::MOUSEUP_EVENT,mev.innerNode.handle(),true,
! 			 d->clickCount,_mouse,false,DOM::NodeImpl::MouseRelease);
! 
!       if (d->clickCount > 0 &&
! 	  QPoint(d->clickX-xm,d->clickY-ym).manhattanLength() <= QApplication::startDragDistance())
  	dispatchMouseEvent(EventImpl::CLICK_EVENT,mev.innerNode.handle(),true,
  			   d->clickCount,_mouse,true,DOM::NodeImpl::MouseRelease);
  
!       if (mev.innerNode.handle())
  	mev.innerNode.handle()->setPressed(false);
  
!       khtml::MouseReleaseEvent event( _mouse, xm, ym, mev.url, mev.innerNode );
!       event.setNodePos( mev.nodeAbsX, mev.nodeAbsY );
!       QApplication::sendEvent( m_part, &event );
!     }
! 
!     d->isMiddleClick = false;
!     d->isMiddleClickAndMove = false;
  }
  
  void KHTMLView::keyPressEvent( QKeyEvent *_ke )

--=-=-=


-- 
Julien Gilles.

--=-=-=--
 
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic