diff --git a/src/main/java/com/googlecode/lanterna/gui2/AbstractInteractableComponent.java b/src/main/java/com/googlecode/lanterna/gui2/AbstractInteractableComponent.java index e1923f275..b64d0f0e8 100644 --- a/src/main/java/com/googlecode/lanterna/gui2/AbstractInteractableComponent.java +++ b/src/main/java/com/googlecode/lanterna/gui2/AbstractInteractableComponent.java @@ -215,7 +215,7 @@ public boolean isMouseActivationStroke(KeyStroke keyStroke) { isMouseActivation = action.getActionType() == MouseActionType.CLICK_DOWN; } - return isMouseActivation; + return isFocused() && isMouseActivation; } public boolean isActivationStroke(KeyStroke keyStroke) { diff --git a/src/main/java/com/googlecode/lanterna/gui2/MultiWindowTextGUI.java b/src/main/java/com/googlecode/lanterna/gui2/MultiWindowTextGUI.java index 4463d83f8..52f8b5dc0 100644 --- a/src/main/java/com/googlecode/lanterna/gui2/MultiWindowTextGUI.java +++ b/src/main/java/com/googlecode/lanterna/gui2/MultiWindowTextGUI.java @@ -382,8 +382,14 @@ protected synchronized void ifMouseDownPossiblyChangeActiveWindow(KeyStroke keyS List snapshot = new ArrayList<>(getWindows()); for (Window w : snapshot) { w.getBounds().whenContains(mouse.getPosition(), () -> { - setActiveWindow(w); - anyHit.set(true); + // Only change active window if the active MODAL dialog or if + // window is not MODAL + if (!priorActiveWindow.getHints().contains(Hint.MODAL) || + (priorActiveWindow.getHints().contains(Hint.MODAL) && w == priorActiveWindow)) + { + setActiveWindow(w); + anyHit.set(true); + } }); } // clear popup menus if they clicked onto another window or missed all windows diff --git a/src/main/java/com/googlecode/lanterna/gui2/dialogs/MessageDialogBuilder.java b/src/main/java/com/googlecode/lanterna/gui2/dialogs/MessageDialogBuilder.java index af0758533..8e99589c4 100644 --- a/src/main/java/com/googlecode/lanterna/gui2/dialogs/MessageDialogBuilder.java +++ b/src/main/java/com/googlecode/lanterna/gui2/dialogs/MessageDialogBuilder.java @@ -46,6 +46,7 @@ public MessageDialogBuilder() { this.buttons = new ArrayList<>(); this.extraWindowHints = new HashSet<>(); this.extraWindowHints.add(Window.Hint.CENTERED); + this.extraWindowHints.add(Window.Hint.MODAL); } /** diff --git a/src/test/java/com/googlecode/lanterna/gui2/DialogsTextGUIBasicTest.java b/src/test/java/com/googlecode/lanterna/gui2/DialogsTextGUIBasicTest.java index 7e3c2a060..c04148cf5 100644 --- a/src/test/java/com/googlecode/lanterna/gui2/DialogsTextGUIBasicTest.java +++ b/src/test/java/com/googlecode/lanterna/gui2/DialogsTextGUIBasicTest.java @@ -22,6 +22,7 @@ import com.googlecode.lanterna.TestTerminalFactory; import com.googlecode.lanterna.gui2.dialogs.*; import com.googlecode.lanterna.screen.Screen; +import com.googlecode.lanterna.terminal.MouseCaptureMode; import java.io.File; import java.io.IOException; @@ -33,7 +34,7 @@ */ public class DialogsTextGUIBasicTest { public static void main(String[] args) throws IOException { - Screen screen = new TestTerminalFactory(args).createScreen(); + Screen screen = new TestTerminalFactory(args).setMouseCaptureMode(MouseCaptureMode.CLICK_AUTODETECT).createScreen(); screen.startScreen(); final WindowBasedTextGUI textGUI = new MultiWindowTextGUI(screen); try {