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
This commit is contained in:
bzbarsky%mit.edu 2003-11-17 17:03:24 +00:00
Родитель cbb33a9d98
Коммит 4b654bce34
2 изменённых файлов: 51 добавлений и 0 удалений

Просмотреть файл

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

Просмотреть файл

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