зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
cbb33a9d98
Коммит
4b654bce34
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче