diff --git a/mozilla/widget/src/gtk/nsWindow.cpp b/mozilla/widget/src/gtk/nsWindow.cpp index f8e7e740a58..7197471225b 100644 --- a/mozilla/widget/src/gtk/nsWindow.cpp +++ b/mozilla/widget/src/gtk/nsWindow.cpp @@ -204,6 +204,9 @@ static void printDepth(int depth) { } #endif +static int is_parent_ungrab_enter(GdkEventCrossing *aEvent); +static int is_parent_grab_leave(GdkEventCrossing *aEvent); + // This function will check if a button event falls inside of a // window's bounds. @@ -1752,6 +1755,7 @@ nsWindow::InstallFocusOutSignal(GtkWidget * aWidget) GTK_SIGNAL_FUNC(nsWindow::FocusOutSignal)); } + void nsWindow::HandleGDKEvent(GdkEvent *event) { @@ -1775,9 +1779,15 @@ nsWindow::HandleGDKEvent(GdkEvent *event) OnButtonReleaseSignal (&event->button); break; case GDK_ENTER_NOTIFY: + if(is_parent_ungrab_enter(&event->crossing)) + return; + OnEnterNotifySignal (&event->crossing); break; case GDK_LEAVE_NOTIFY: + if(is_parent_grab_leave(&event->crossing)) + return; + OnLeaveNotifySignal (&event->crossing); break; @@ -4529,3 +4539,21 @@ nsWindow::ClearIconEntry(PLDHashTable* aTable, PLDHashEntryHdr* aHdr) free((void*) entry->string); PL_DHashClearEntryStub(aTable, aHdr); } + +/* static */ +int +is_parent_ungrab_enter(GdkEventCrossing *event) +{ + return (GDK_CROSSING_UNGRAB == event->mode) && + ((GDK_NOTIFY_ANCESTOR == event->detail) || + (GDK_NOTIFY_VIRTUAL == event->detail)); +} + +/* static */ +int +is_parent_grab_leave(GdkEventCrossing *event) +{ + return (GDK_CROSSING_GRAB == event->mode) && + ((GDK_NOTIFY_ANCESTOR == event->detail) || + (GDK_NOTIFY_VIRTUAL == event->detail)); +} diff --git a/mozilla/widget/src/xlib/nsAppShell.cpp b/mozilla/widget/src/xlib/nsAppShell.cpp index 45b134617c6..083080d696e 100644 --- a/mozilla/widget/src/xlib/nsAppShell.cpp +++ b/mozilla/widget/src/xlib/nsAppShell.cpp @@ -1047,6 +1047,23 @@ nsAppShell::HandleFocusOutEvent(XEvent *event, nsWidget *aWidget) NS_RELEASE(aWidget); } +/* Identify pointer grab/ungrab events due to window manager activity */ +static inline int +is_wm_ungrab_enter(XCrossingEvent *event) +{ + return (NotifyGrab == event->mode) && + ((NotifyAncestor == event->detail) || + (NotifyVirtual == event->detail)); +} + +static inline int +is_wm_grab_leave(XCrossingEvent *event) +{ + return (NotifyGrab == event->mode) && + ((NotifyAncestor == event->detail) || + (NotifyVirtual == event->detail)); +} + void nsAppShell::HandleEnterEvent(XEvent *event, nsWidget *aWidget) { @@ -1054,6 +1071,9 @@ nsAppShell::HandleEnterEvent(XEvent *event, nsWidget *aWidget) event->xcrossing.window)); nsMouseEvent enterEvent; + if(is_wm_ungrab_enter(&event->xcrossing)) + return; + if (mDragging) { HandleDragEnterEvent(event, aWidget); } @@ -1084,6 +1104,9 @@ nsAppShell::HandleLeaveEvent(XEvent *event, nsWidget *aWidget) nsMouseEvent leaveEvent; + if(is_wm_grab_leave(&event->xcrossing)) + return; + if (mDragging) { HandleDragLeaveEvent(event, aWidget); }