From: Ben Soares Date: Fri, 18 Aug 2023 14:33:53 +0000 (+0100) Subject: Merge branch 'bug/JAL-4214_system_freeze_when_opening_file_using_gui_in_linux' into... X-Git-Tag: Release_2_11_3_0~8^2~45 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=8a2a0cda7067530f8481c2aec203e18d555f2dfd;hp=-c;p=jalview.git Merge branch 'bug/JAL-4214_system_freeze_when_opening_file_using_gui_in_linux' into merge/big_merge_of_bens_stuff_before_2_11_3_0 --- 8a2a0cda7067530f8481c2aec203e18d555f2dfd diff --combined src/jalview/gui/JvOptionPane.java index 61a971a,5da37fe..eaaa2a1 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@@ -36,6 -36,7 +36,7 @@@ import java.awt.event.MouseAdapter import java.awt.event.MouseMotionAdapter; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; + import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@@ -717,7 -718,7 +718,7 @@@ public class JvOptionPane extends JOpti private static void outputMessage(Object message) { - System.out.println(">>> JOption Message : " + message.toString()); + jalview.bin.Console.outPrintln(">>> JOption Message : " + message.toString()); } public static Object getMockResponse() @@@ -1080,37 -1081,44 +1081,44 @@@ @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); @@@ -1129,13 -1137,7 +1137,13 @@@ private void internalDialogHandleResponse() { - String responseString = (String) this.getValue(); + Object value = this.getValue(); + if (value == null + || (value instanceof Integer && (Integer) value == -1)) + { + return; + } + String responseString = value.toString(); int response = ourOptions.indexOf(responseString); if (!Platform.isJS()) @@@ -1510,7 -1512,8 +1518,8 @@@ EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); try { - while (!f.isClosed()) + boolean stillModal = true; + while (!f.isClosed() && stillModal) { if (EventQueue.isDispatchThread()) { @@@ -1520,34 -1523,68 +1529,68 @@@ // 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 Component) - ((Component) ev.getSource()).dispatchEvent(ev); + } 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())) + { + stillModal = false; + } + else + { + ((Component) ev.getSource()).dispatchEvent(ev); + } + } // 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); + f.setVisible(false); + + try + { + f.setClosed(true); + } catch (PropertyVetoException e) + { + f.doDefaultCloseAction(); + } + // Remove the internal frame from its parent, so it is no longer // lurking around and clogging memory. Container parent = f.getParent(); if (parent != null) + { parent.remove(f); + } } }