JAL-4214 Make modal internal frame disappear when main menu clicked on linux to avoid...
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 28 Jun 2023 17:01:08 +0000 (18:01 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 28 Jun 2023 17:01:08 +0000 (18:01 +0100)
src/jalview/gui/JvOptionPane.java

index 5da37fe..9beb015 100644 (file)
@@ -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);