Bug 386687 - "mouse wheel events propagated from plugin windows are dropped and so do not scroll" [p=ventnor.bugzilla@yahoo.com.au (Michael Ventnor) r+sr=roc a1.9=damons]

git-svn-id: svn://10.0.0.236/trunk@240798 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
reed%reedloden.com 2007-12-11 08:49:46 +00:00
parent 01e1b51b87
commit f6c00a5b96
3 changed files with 52 additions and 46 deletions

View File

@ -105,44 +105,6 @@ nsCommonWidget::InitButtonEvent(nsMouseEvent &aEvent,
}
}
void
nsCommonWidget::InitMouseScrollEvent(nsMouseScrollEvent &aEvent,
GdkEventScroll *aGdkEvent)
{
switch (aGdkEvent->direction) {
case GDK_SCROLL_UP:
aEvent.scrollFlags = nsMouseScrollEvent::kIsVertical;
aEvent.delta = -3;
break;
case GDK_SCROLL_DOWN:
aEvent.scrollFlags = nsMouseScrollEvent::kIsVertical;
aEvent.delta = 3;
break;
case GDK_SCROLL_LEFT:
aEvent.scrollFlags = nsMouseScrollEvent::kIsHorizontal;
aEvent.delta = -3;
break;
case GDK_SCROLL_RIGHT:
aEvent.scrollFlags = nsMouseScrollEvent::kIsHorizontal;
aEvent.delta = 3;
break;
}
aEvent.refPoint.x = nscoord(aGdkEvent->x);
aEvent.refPoint.y = nscoord(aGdkEvent->y);
aEvent.isShift = (aGdkEvent->state & GDK_SHIFT_MASK)
? PR_TRUE : PR_FALSE;
aEvent.isControl = (aGdkEvent->state & GDK_CONTROL_MASK)
? PR_TRUE : PR_FALSE;
aEvent.isAlt = (aGdkEvent->state & GDK_MOD1_MASK)
? PR_TRUE : PR_FALSE;
aEvent.isMeta = (aGdkEvent->state & GDK_MOD4_MASK)
? PR_TRUE : PR_FALSE;
aEvent.time = aGdkEvent->time;
}
void
nsCommonWidget::InitKeyEvent(nsKeyEvent &aEvent, GdkEventKey *aGdkEvent)
{

View File

@ -81,8 +81,6 @@ public:
// event handling code
void InitButtonEvent(nsMouseEvent &aEvent,
GdkEventButton *aGdkEvent);
void InitMouseScrollEvent(nsMouseScrollEvent &aEvent,
GdkEventScroll *aGdkEvent);
void InitKeyEvent(nsKeyEvent &aEvent, GdkEventKey *aGdkEvent);
void DispatchGotFocusEvent(void);

View File

@ -2392,15 +2392,54 @@ nsWindow::OnKeyReleaseEvent(GtkWidget *aWidget, GdkEventKey *aEvent)
void
nsWindow::OnScrollEvent(GtkWidget *aWidget, GdkEventScroll *aEvent)
{
nsMouseScrollEvent event(PR_TRUE, NS_MOUSE_SCROLL, this);
InitMouseScrollEvent(event, aEvent);
// check to see if we should rollup
if (check_for_rollup(aEvent->window, aEvent->x_root, aEvent->y_root,
PR_TRUE)) {
return;
}
nsMouseScrollEvent event(PR_TRUE, NS_MOUSE_SCROLL, this);
switch (aEvent->direction) {
case GDK_SCROLL_UP:
event.scrollFlags = nsMouseScrollEvent::kIsVertical;
event.delta = -3;
break;
case GDK_SCROLL_DOWN:
event.scrollFlags = nsMouseScrollEvent::kIsVertical;
event.delta = 3;
break;
case GDK_SCROLL_LEFT:
event.scrollFlags = nsMouseScrollEvent::kIsHorizontal;
event.delta = -3;
break;
case GDK_SCROLL_RIGHT:
event.scrollFlags = nsMouseScrollEvent::kIsHorizontal;
event.delta = 3;
break;
}
if (aEvent->window == mDrawingarea->inner_window) {
// we are the window that the event happened on so no need for expensive ScreenToWidget
event.refPoint.x = nscoord(aEvent->x);
event.refPoint.y = nscoord(aEvent->y);
} else {
// XXX we're never quite sure which GdkWindow the event came from due to our custom bubbling
// in scroll_event_cb(), so use ScreenToWidget to translate the screen root coordinates into
// coordinates relative to this widget.
nsRect windowRect;
ScreenToWidget(nsRect(nscoord(aEvent->x_root), nscoord(aEvent->y_root), 1, 1), windowRect);
event.refPoint.x = windowRect.x;
event.refPoint.y = windowRect.y;
}
event.isShift = (aEvent->state & GDK_SHIFT_MASK) != 0;
event.isControl = (aEvent->state & GDK_CONTROL_MASK) != 0;
event.isAlt = (aEvent->state & GDK_MOD1_MASK) != 0;
event.isMeta = (aEvent->state & GDK_MOD4_MASK) != 0;
event.time = aEvent->time;
nsEventStatus status;
DispatchEvent(&event, status);
}
@ -4619,9 +4658,16 @@ key_release_event_cb(GtkWidget *widget, GdkEventKey *event)
gboolean
scroll_event_cb(GtkWidget *widget, GdkEventScroll *event)
{
nsRefPtr<nsWindow> window = get_window_for_gdk_window(event->window);
if (!window)
return FALSE;
nsRefPtr<nsWindow> window;
GdkWindow *gdkWindow = event->window;
while (!(window = get_window_for_gdk_window(gdkWindow))) {
// The event has bubbled to the moz_container widget as passed into the *widget parameter,
// but its corresponding nsWindow is an ancestor of the window that we need. Instead, look at
// event->window and find the first ancestor nsWindow of it because event->window may be in a plugin.
gdkWindow = gdk_window_get_parent(gdkWindow);
if (!gdkWindow)
return FALSE;
}
window->OnScrollEvent(widget, event);