refactor, sixel performance
[fanfix.git] / src / jexer / backend / MultiScreen.java
index 02084100e900523033433ce205b5693fe749f2ad..0c3a2894bbe29c9bc0af7067cd9b79f8d9b060bc 100644 (file)
@@ -28,7 +28,7 @@
  */
 package jexer.backend;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import jexer.bits.Cell;
@@ -46,7 +46,7 @@ public class MultiScreen implements Screen {
     /**
      * The list of screens to use.
      */
-    private List<Screen> screens = new LinkedList<Screen>();
+    private List<Screen> screens = new ArrayList<Screen>();
 
     // ------------------------------------------------------------------------
     // Constructors -----------------------------------------------------------
@@ -386,7 +386,20 @@ public class MultiScreen implements Screen {
      */
     public void setDimensions(final int width, final int height) {
         for (Screen screen: screens) {
-            screen.setDimensions(width, height);
+            // Do not blindly call setDimension() on every screen.  Instead
+            // call it only on those screens that do not already have the
+            // requested dimension.  With this very small check, we have the
+            // ability for ANY screen in the MultiBackend to resize ALL of
+            // the screens.
+            if ((screen.getWidth() != width)
+                || (screen.getHeight() != height)
+            ) {
+                screen.setDimensions(width, height);
+            } else {
+                // The screen that didn't change is probably the one that
+                // prompted the resize.  Force it to repaint.
+                screen.clearPhysical();
+            }
         }
     }
 
@@ -633,14 +646,7 @@ public class MultiScreen implements Screen {
     public int getTextWidth() {
         int textWidth = 16;
         for (Screen screen: screens) {
-            int newTextWidth = textWidth;
-            if (screen instanceof MultiScreen) {
-                newTextWidth = ((MultiScreen) screen).getTextWidth();
-            } else if (screen instanceof ECMA48Terminal) {
-                newTextWidth = ((ECMA48Terminal) screen).getTextWidth();
-            } else if (screen instanceof SwingTerminal) {
-                newTextWidth = ((SwingTerminal) screen).getTextWidth();
-            }
+            int newTextWidth = screen.getTextWidth();
             if (newTextWidth < textWidth) {
                 textWidth = newTextWidth;
             }
@@ -656,14 +662,7 @@ public class MultiScreen implements Screen {
     public int getTextHeight() {
         int textHeight = 20;
         for (Screen screen: screens) {
-            int newTextHeight = textHeight;
-            if (screen instanceof MultiScreen) {
-                newTextHeight = ((MultiScreen) screen).getTextHeight();
-            } else if (screen instanceof ECMA48Terminal) {
-                newTextHeight = ((ECMA48Terminal) screen).getTextHeight();
-            } else if (screen instanceof SwingTerminal) {
-                newTextHeight = ((SwingTerminal) screen).getTextHeight();
-            }
+            int newTextHeight = screen.getTextHeight();
             if (newTextHeight < textHeight) {
                 textHeight = newTextHeight;
             }