From a2b2b6f8179380d6ade4f831a4c4c12a089681b6 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Mon, 17 Nov 2003 17:03:24 +0000 Subject: [PATCH] GTK1 and xlib versions of the patch for bug 102578. For xlib, patch by Andrej Czapszys (czapszys@comcast.net), r=blizzard, sr=bryner For GTK1, patch by Kenneth Herron (kjh-5727@comcast.net), r=blizzard, sr=bzbarsky git-svn-id: svn://10.0.0.236/trunk@149436 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/gtk/nsWindow.cpp | 28 ++++++++++++++++++++++++++ mozilla/widget/src/xlib/nsAppShell.cpp | 23 +++++++++++++++++++++ 2 files changed, 51 insertions(+) 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); }