From: Ben Soares Date: Wed, 28 Jun 2023 17:01:08 +0000 (+0100) Subject: JAL-4214 Make modal internal frame disappear when main menu clicked on linux to avoid... X-Git-Tag: Release_2_11_4_0~205^2~1 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=071c3341c69314363376d9af7b5537141a40de54;p=jalview.git JAL-4214 Make modal internal frame disappear when main menu clicked on linux to avoid a hanging bug --- diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 5da37fe..9beb015 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -1081,44 +1081,37 @@ public class JvOptionPane extends JOptionPane @Override public void internalFrameActivated(InternalFrameEvent arg0) { - System.err.println("##### internalFrameActivated"); } @Override public void internalFrameClosed(InternalFrameEvent arg0) { - System.err.println("##### internalFrameClosed"); JvOptionPane.this.internalDialogHandleResponse(); } @Override public void internalFrameClosing(InternalFrameEvent arg0) { - System.err.println("##### internalFrameClosing"); } @Override public void internalFrameDeactivated(InternalFrameEvent arg0) { - System.err.println("##### internalFrameDeactivated"); } @Override public void internalFrameDeiconified(InternalFrameEvent arg0) { - System.err.println("##### internalFrameDeiconified"); } @Override public void internalFrameIconified(InternalFrameEvent arg0) { - System.err.println("##### internalFrameIconified"); } @Override public void internalFrameOpened(InternalFrameEvent arg0) { - System.err.println("##### internalFrameOpened"); } }); jif.setVisible(true); @@ -1512,8 +1505,7 @@ public class JvOptionPane extends JOptionPane EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); try { - boolean stillModal = true; - while (!f.isClosed() && stillModal) + while (!f.isClosed()) { if (EventQueue.isDispatchThread()) { @@ -1523,53 +1515,47 @@ public class JvOptionPane extends JOptionPane // This mimics EventQueue.dispatchEvent(). We can't use // EventQueue.dispatchEvent() directly, because it is // protected, unfortunately. - System.out.println( - "##### ev source=" + ev.getSource().getClass() + ""); if (ev instanceof ActiveEvent) { - System.err.println("##### 1"); ((ActiveEvent) ev).dispatch(); } else if (ev.getSource() instanceof MenuComponent) { - System.err.println("##### 2"); ((MenuComponent) ev.getSource()).dispatchEvent(ev); } else if (ev.getSource() instanceof Component) { - System.err.println("##### 3"); - if (ev.getSource().equals(Desktop.getDesktop().getRootPane())) + ((Component) ev.getSource()).dispatchEvent(ev); + // remove the modal frame if clicked on main menu on linux due to + // hanging bug. + // see JAL-4214. + if (Platform.isLinux() && ev.getSource() + .equals(Desktop.getDesktop().getRootPane())) { - stillModal = false; - } - else - { - ((Component) ev.getSource()).dispatchEvent(ev); + break; } } // Other events are ignored as per spec in // EventQueue.dispatchEvent - System.err.println("##### 4"); } else { // Give other threads a chance to become active. - System.err.println("##### 5"); Thread.yield(); } } } catch (InterruptedException ex) { // If we get interrupted, then leave the modal state. - System.err.println("##### 6"); } finally { - System.err.println("##### 7"); // Clean up the modal interceptor. lp.remove(modalInterceptor); + // unpaint the frame f.setVisible(false); + // close the frame try { f.setClosed(true);