#38 fix Swing deadlock
authorKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 2 Mar 2019 11:40:42 +0000 (05:40 -0600)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Sat, 2 Mar 2019 11:40:42 +0000 (05:40 -0600)
src/jexer/backend/SwingComponent.java
src/jexer/backend/SwingTerminal.java

index 92fd1d897afdb1679fd40f6a15394c09d93fdcce..23b50ab3b7b9f5e157cdb81ff867aa98ee44e070 100644 (file)
@@ -45,6 +45,7 @@ import java.awt.image.BufferedImage;
 import java.awt.image.BufferStrategy;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
 
 /**
  * Wrapper for integrating with Swing, because JFrame and JComponent have
@@ -363,17 +364,38 @@ class SwingComponent {
      * @param height the new height in pixels
      */
     public void setDimensions(final int width, final int height) {
-        // Figure out the thickness of borders and use that to set the final
-        // size.
-        if (frame != null) {
-            Insets insets = getInsets();
-            frame.setSize(width + insets.left + insets.right,
-                height + insets.top + insets.bottom);
-        } else {
-            Insets insets = getInsets();
-            component.setSize(width + insets.left + insets.right,
-                height + insets.top + insets.bottom);
+        if (SwingUtilities.isEventDispatchThread()) {
+            // We are in the Swing thread and can safely set the size.
+
+            // Figure out the thickness of borders and use that to set the
+            // final size.
+            if (frame != null) {
+                Insets insets = getInsets();
+                frame.setSize(width + insets.left + insets.right,
+                    height + insets.top + insets.bottom);
+            } else {
+                Insets insets = getInsets();
+                component.setSize(width + insets.left + insets.right,
+                    height + insets.top + insets.bottom);
+            }
+            return;
         }
+
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                // Figure out the thickness of borders and use that to set
+                // the final size.
+                if (frame != null) {
+                    Insets insets = getInsets();
+                    frame.setSize(width + insets.left + insets.right,
+                        height + insets.top + insets.bottom);
+                } else {
+                    Insets insets = getInsets();
+                    component.setSize(width + insets.left + insets.right,
+                        height + insets.top + insets.bottom);
+                }
+            }
+        });
     }
 
     /**
index 43afc1615a848141e1937abacc4884d46386a71e..67211a6c64148e6204edcb23ab84029f2c21049c 100644 (file)
@@ -1935,6 +1935,12 @@ public class SwingTerminal extends LogicalScreen
             return;
         }
 
+        if (sessionInfo == null) {
+            // This is the initial component resize in construction, bail
+            // out.
+            return;
+        }
+
         // Drop a new TResizeEvent into the queue
         sessionInfo.queryWindowSize();
         synchronized (eventQueue) {