From d40e3ea55708262bde6124b5cc09e1df071d6e37 Mon Sep 17 00:00:00 2001 From: Neil Deakin Date: Fri, 31 Dec 2010 14:20:00 -0500 Subject: [PATCH] Bug 618248, don't close popups when a window is lowered while dragging, prevents bookmark menu from closing, r=karl,a=blocking --- widget/src/gtk2/nsWindow.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/widget/src/gtk2/nsWindow.cpp b/widget/src/gtk2/nsWindow.cpp index db4cf6ba363c..45622e6f5e88 100644 --- a/widget/src/gtk2/nsWindow.cpp +++ b/widget/src/gtk2/nsWindow.cpp @@ -2891,7 +2891,24 @@ nsWindow::OnContainerFocusOutEvent(GtkWidget *aWidget, GdkEventFocus *aEvent) LOGFOCUS(("OnContainerFocusOutEvent [%p]\n", (void *)this)); if (mWindowType == eWindowType_toplevel || mWindowType == eWindowType_dialog) { - check_for_rollup(aEvent->window, 0, 0, PR_FALSE, PR_TRUE); + nsCOMPtr dragService = do_GetService(kCDragServiceCID); + nsCOMPtr dragSession; + dragService->GetCurrentSession(getter_AddRefs(dragSession)); + + // Rollup popups when a window is focused out unless a drag is occurring. + // This check is because drags grab the keyboard and cause a focus out on + // versions of GTK before 2.18. + PRBool shouldRollup = !dragSession; + if (!shouldRollup) { + // we also roll up when a drag is from a different application + nsCOMPtr sourceNode; + dragSession->GetSourceNode(getter_AddRefs(sourceNode)); + shouldRollup = (sourceNode == nsnull); + } + + if (shouldRollup) { + check_for_rollup(aEvent->window, 0, 0, PR_FALSE, PR_TRUE); + } } #ifdef MOZ_X11