diff options
3 files changed, 91 insertions, 6 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java index 46f3894b46..2350c96d01 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java @@ -757,6 +757,7 @@ long /*int*/ gtk_hide (long /*int*/ widget) { if (display.activeShell != null) { display.activeShell = getShell (); display.activeShell.ignoreFocusOut = false; + display.activeShell.ignoreActivate = false; } } sendEvent (SWT.Hide); @@ -776,6 +777,7 @@ long /*int*/ gtk_show (long /*int*/ widget) { if (display.activeShell != null) { display.activeShell = getShell (); display.activeShell.ignoreFocusOut = true; + display.activeShell.ignoreActivate = true; } return 0; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java index 64eb735dbf..0d37faccc4 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java @@ -125,7 +125,7 @@ public class Shell extends Decorations { int minWidth, minHeight; Control lastActive; ToolTip [] toolTips; - boolean ignoreFocusOut; + boolean ignoreFocusOut, ignoreActivate; Region originalRegion; static final int MAXIMUM_TRIM = 128; @@ -1448,9 +1448,11 @@ long /*int*/ gtk_focus_in_event (long /*int*/ widget, long /*int*/ event) { if (widget != shellHandle) { return super.gtk_focus_in_event (widget, event); } - display.activeShell = this; - display.activePending = false; - sendEvent (SWT.Activate); + if (display.activeShell != this && !ignoreActivate) { + display.activeShell = this; + display.activePending = false; + sendEvent (SWT.Activate); + } return 0; } @@ -1460,8 +1462,10 @@ long /*int*/ gtk_focus_out_event (long /*int*/ widget, long /*int*/ event) { return super.gtk_focus_out_event (widget, event); } Display display = this.display; - sendEvent (SWT.Deactivate); - setActiveControl (null); + if (!ignoreActivate) { + sendEvent (SWT.Deactivate); + setActiveControl (null); + } if (display.activeShell == this && !ignoreFocusOut) { display.activeShell = null; display.activePending = false; diff --git a/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug436841_FocusActivateEventContextMenu.java b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug436841_FocusActivateEventContextMenu.java new file mode 100644 index 0000000000..d048ee3914 --- /dev/null +++ b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug436841_FocusActivateEventContextMenu.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2018 Red Hat and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.tests.gtk.snippets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MenuAdapter; +import org.eclipse.swt.events.MenuEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeItem; + +public class Bug436841_FocusActivateEventContextMenu { + + public static void main(String[] args) { + final Display display = new Display(); + Shell shell = new Shell(display); + shell.setText(Bug436841_FocusActivateEventContextMenu.class.getName()); + shell.setLayout(new GridLayout(1, false)); + + Tree tree = new Tree(shell, SWT.BORDER); + tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + new TreeItem(tree, SWT.NONE).setText("Open context menu, hover Show In"); + + Menu menu = new Menu(tree); + tree.setMenu(menu); + + new MenuItem(menu, SWT.PUSH).setText("First"); + + MenuItem showInItem = new MenuItem(menu, SWT.CASCADE); + showInItem.setText("Show In"); + Menu showInMenu = new Menu(menu); + showInItem.setMenu(showInMenu); + showInMenu.addMenuListener(new MenuAdapter() { + @Override + public void menuShown(MenuEvent e) { + Shell activeShell = display.getActiveShell(); + System.out.println("menuShown: activeShell == " + activeShell); + } + }); + + display.addFilter(SWT.FocusIn, event -> new Exception("FocusIn: " + event.widget).printStackTrace()); + + display.addFilter(SWT.FocusOut, event -> new Exception("FocusOut: " + event.widget).printStackTrace()); + + display.addFilter(SWT.Activate, event -> new Exception("Activate: " + event.widget).printStackTrace()); + + display.addFilter(SWT.Deactivate, event -> new Exception("Deactivate: " + event.widget).printStackTrace()); + +// new Runnable() { +// @Override +// public void run() { +// System.out.print("."); // print a heartbeat to show where the user paused +// display.timerExec(1000, this); +// } +// }.run(); + + shell.setSize(400, 100); + shell.open(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) + display.sleep(); + } + display.dispose(); + } + +}
\ No newline at end of file |