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
This commit is contained in:
bzbarsky%mit.edu
2003-11-17 17:03:24 +00:00
parent 38371edcc4
commit a2b2b6f817
2 changed files with 51 additions and 0 deletions

View File

@@ -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));
}

View File

@@ -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);
}