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:
parent
01e1b51b87
commit
f6c00a5b96
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user