diff --git a/mozilla/widget/public/nsGUIEvent.h b/mozilla/widget/public/nsGUIEvent.h index db558f84e68..6f8d8dfa41c 100644 --- a/mozilla/widget/public/nsGUIEvent.h +++ b/mozilla/widget/public/nsGUIEvent.h @@ -179,6 +179,10 @@ struct nsCompositionEvent : public nsInputEvent { nsTextEventReply theReply; }; +struct nsMouseScrollEvent : public nsInputEvent { + PRInt32 deltaLines; +}; + /** * Tooltip event */ @@ -229,6 +233,7 @@ enum nsDragDropEventStatus { #define NS_TEXT_EVENT 12 #define NS_COMPOSITION_START 13 #define NS_COMPOSITION_END 14 +#define NS_MOUSE_SCROLL_EVENT 15 /** * GUI MESSAGES @@ -342,6 +347,9 @@ enum nsDragDropEventStatus { #define NS_XUL_COMMAND_UPDATE (NS_MENU_EVENT_START+4) //@} +// Scroll events +#define NS_MOUSE_SCROLL_START 1600 +#define NS_MOUSE_SCROLL (NS_MOUSE_SCROLL_START) #define NS_IS_MOUSE_EVENT(evnt) \ (((evnt)->message == NS_MOUSE_LEFT_BUTTON_DOWN) || \ diff --git a/mozilla/widget/src/gtk/nsWidget.cpp b/mozilla/widget/src/gtk/nsWidget.cpp index 48952235491..665c46e488d 100644 --- a/mozilla/widget/src/gtk/nsWidget.cpp +++ b/mozilla/widget/src/gtk/nsWidget.cpp @@ -1901,6 +1901,7 @@ nsWidget::OnLeaveNotifySignal(GdkEventCrossing * aGdkCrossingEvent) nsWidget::OnButtonPressSignal(GdkEventButton * aGdkButtonEvent) { nsMouseEvent event; + nsMouseScrollEvent scrollEvent; PRUint32 eventType = 0; #if defined(DEBUG_pavlov) || defined(DEBUG_akkana) @@ -1952,6 +1953,30 @@ nsWidget::OnButtonPressSignal(GdkEventButton * aGdkButtonEvent) eventType = NS_MOUSE_RIGHT_BUTTON_DOWN; break; + case 4: + case 5: + if (aGdkButtonEvent->button == 4) + scrollEvent.deltaLines = -3; + else + scrollEvent.deltaLines = 3; + + scrollEvent.message = NS_MOUSE_SCROLL; + scrollEvent.widget = this; + scrollEvent.eventStructType = NS_MOUSE_SCROLL_EVENT; + + scrollEvent.point.x = nscoord(aGdkButtonEvent->x); + scrollEvent.point.y = nscoord(aGdkButtonEvent->y); + + scrollEvent.isShift = (aGdkButtonEvent->state & GDK_SHIFT_MASK) ? PR_TRUE : PR_FALSE; + scrollEvent.isControl = (aGdkButtonEvent->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE; + scrollEvent.isAlt = (aGdkButtonEvent->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE; + scrollEvent.time = aGdkButtonEvent->time; + AddRef(); + if (mEventCallback) + DispatchWindowEvent(&scrollEvent); + Release(); + return; + // Single-click default. default: eventType = NS_MOUSE_LEFT_BUTTON_DOWN; @@ -2002,6 +2027,12 @@ nsWidget::OnButtonReleaseSignal(GdkEventButton * aGdkButtonEvent) eventType = NS_MOUSE_RIGHT_BUTTON_UP; break; + case 4: + case 5: + // We don't really need to do anything here, but we don't want + // LEFT_BUTTON_UP to happen + return; + default: eventType = NS_MOUSE_LEFT_BUTTON_UP; break;