From acca65609924c26691e0ce345fd85cd90509de07 Mon Sep 17 00:00:00 2001 From: "pinkerton%netscape.com" Date: Wed, 27 Feb 2002 14:57:48 +0000 Subject: [PATCH] fix scrollwheel issues for os9. we can't rely on the mouse location from GetMouse() because of os hackery w/in the mouse drivers. just fake the mouse position local to the widget we're using. r=brade/sr=sfraser/a=shaver. --- widget/src/mac/nsMacEventHandler.cpp | 45 ++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/widget/src/mac/nsMacEventHandler.cpp b/widget/src/mac/nsMacEventHandler.cpp index 180730df2747..20461d80f957 100644 --- a/widget/src/mac/nsMacEventHandler.cpp +++ b/widget/src/mac/nsMacEventHandler.cpp @@ -91,9 +91,10 @@ PRBool nsMacEventHandler::sMouseInWidgetHit = PR_FALSE; nsMacEventDispatchHandler gEventDispatchHandler; +enum { kMouseInvalid = PR_FALSE, kMouseValid = PR_TRUE }; static nsEventStatus HandleScrollEvent ( EventMouseWheelAxis inAxis, PRBool inByLine, PRInt32 inDelta, - Point inMouseLoc, nsIWidget* inWidget ) ; + PRBool inIsMouseValid, Point inMouseLoc, nsIWidget* inWidget ) ; static void ConvertKeyEventToContextMenuEvent(const nsKeyEvent* inKeyEvent, nsMouseEvent* outCMEvent); static inline PRBool IsContextMenuKey(const nsKeyEvent& inKeyEvent); @@ -103,7 +104,10 @@ static inline PRBool IsContextMenuKey(const nsKeyEvent& inKeyEvent); // // Called from ::TrackControl(), this senses which part of the phantom // scrollbar the click from the wheelMouse driver was in and sends -// the correct NS_MOUSE_SCROLL event into Gecko +// the correct NS_MOUSE_SCROLL event into Gecko. We have to tell +// HandleScrollEvent() to ignore the mouse location because it will +// just be the location of the phantom scrollbar, not actually the real +// mouse position. // static pascal void ScrollActionProc(ControlHandle ctrl, ControlPartCode partCode) { @@ -115,15 +119,17 @@ static pascal void ScrollActionProc(ControlHandle ctrl, ControlPartCode partCode case kControlPageDownPart: PhantomScrollbarData* data = NS_REINTERPRET_CAST(PhantomScrollbarData*, ::GetControlReference(ctrl)); if ( data && (data->mWidgetToGetEvent || gEventDispatchHandler.GetActive()) ) { - Point mouseLoc; - ::GetMouse ( &mouseLoc ); + WindowRef window = (**ctrl).contrlOwner; + StPortSetter portSetter(window); + StOriginSetter originSetter(window); PRBool scrollByLine = !(partCode == kControlPageUpPart || partCode == kControlPageDownPart); PRInt32 delta = (partCode == kControlUpButtonPart || partCode == kControlPageUpPart) ? -1 : 1; nsIWidget* widget = data->mWidgetToGetEvent ? data->mWidgetToGetEvent : gEventDispatchHandler.GetActive(); - HandleScrollEvent ( kEventMouseWheelAxisY, scrollByLine, delta, mouseLoc, widget ); + Point ignore = {0,0}; + HandleScrollEvent ( kEventMouseWheelAxisY, scrollByLine, delta, kMouseInvalid, ignore, widget ); } break; } @@ -135,11 +141,13 @@ static pascal void ScrollActionProc(ControlHandle ctrl, ControlPartCode partCode // HandleScrollEvent // // Actually dispatch the mouseWheel scroll event to the appropriate widget. If |inByLine| is false, -// then scroll by a full page. +// then scroll by a full page. If |inIgnoreMouse| is true, then we don't use the supplied +// mouse location, but instead make up our own. This is useful for pre-carbon where the mouse +// location is not actually available to us because of OS hacks to get scrolling working at all. // static nsEventStatus HandleScrollEvent ( EventMouseWheelAxis inAxis, PRBool inByLine, PRInt32 inDelta, - Point inMouseLoc, nsIWidget* inWidget ) + PRBool inIsMouseValid, Point inMouseLoc, nsIWidget* inWidget ) { nsMouseScrollEvent scrollEvent; @@ -148,11 +156,22 @@ HandleScrollEvent ( EventMouseWheelAxis inAxis, PRBool inByLine, PRInt32 inDelta if ( !inByLine ) scrollEvent.scrollFlags |= nsMouseScrollEvent::kIsFullPage; - // convert window-relative (local) mouse coordinates to widget-relative - // coords for Gecko. - nsPoint widgetOrigin(0, 0); - inWidget->ConvertToDeviceCoordinates(widgetOrigin.x, widgetOrigin.y); - nsPoint mouseLocRelativeToWidget(inMouseLoc.h - widgetOrigin.x, inMouseLoc.v - widgetOrigin.y); + // we may or may not have a valid mouse location (we will for carbon, we won't for + // non-carbon). Deal with that to the best of our ability. + nsPoint mouseLocRelativeToWidget(0,0); + if ( inIsMouseValid ) { + // convert window-relative (local) mouse coordinates to widget-relative + // coords for Gecko. + nsPoint widgetOrigin(0, 0); + inWidget->ConvertToDeviceCoordinates(widgetOrigin.x, widgetOrigin.y); + mouseLocRelativeToWidget.x = inMouseLoc.h - widgetOrigin.x; + mouseLocRelativeToWidget.y = inMouseLoc.v - widgetOrigin.y; + } + else { + // the mouse location can't help us, we need to say it's just inside the widget + // we're working with + mouseLocRelativeToWidget.x = mouseLocRelativeToWidget.y = 10; + } scrollEvent.eventStructType = NS_MOUSE_SCROLL_EVENT; scrollEvent.isShift = PR_FALSE; @@ -1419,7 +1438,7 @@ nsMacEventHandler :: Scroll ( EventMouseWheelAxis inAxis, PRInt32 inDelta, const // number of groups of lines to scroll, not the exact number of lines to scroll. inDelta *= -3; - HandleScrollEvent ( inAxis, PR_TRUE, inDelta, inMouseLoc, widgetToScroll ); + HandleScrollEvent ( inAxis, PR_TRUE, inDelta, kMouseValid, inMouseLoc, widgetToScroll ); return PR_TRUE;