Fix shadow over double-width
[fanfix.git] / src / jexer / TTerminalWindow.java
index b36e86b62dfca47b0d6f95864f19c3b6b1d1cf15..945536d57f3e01849a0dc42b2808680707e63c33 100644 (file)
  */
 package jexer;
 
-import java.awt.image.BufferedImage;
 import java.awt.Font;
 import java.awt.FontMetrics;
 import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
 
 import java.io.InputStream;
 import java.io.IOException;
@@ -550,13 +550,17 @@ public class TTerminalWindow extends TScrollableWindow
             return;
         }
 
-        if (mouse.isMouseWheelUp()) {
-            verticalDecrement();
-            return;
-        }
-        if (mouse.isMouseWheelDown()) {
-            verticalIncrement();
-            return;
+        // If the emulator is tracking mouse buttons, it needs to see wheel
+        // events.
+        if (emulator.getMouseProtocol() == ECMA48.MouseProtocol.OFF) {
+            if (mouse.isMouseWheelUp()) {
+                verticalDecrement();
+                return;
+            }
+            if (mouse.isMouseWheelDown()) {
+                verticalIncrement();
+                return;
+            }
         }
         if (mouseOnEmulator(mouse)) {
             synchronized (emulator) {
@@ -761,6 +765,10 @@ public class TTerminalWindow extends TScrollableWindow
 
         // Add shortcut text
         newStatusBar(i18n.getString("statusBarRunning"));
+
+        // Pass the correct text cell width/height to the emulator
+        emulator.setTextWidth(getScreen().getTextWidth());
+        emulator.setTextHeight(getScreen().getTextHeight());
     }
 
     /**
@@ -941,21 +949,23 @@ public class TTerminalWindow extends TScrollableWindow
     private void putDoubleWidthCharXY(final DisplayLine line, final int x,
         final int y, final Cell cell) {
 
-        int textWidth = 16;
-        int textHeight = 20;
+        int textWidth = getScreen().getTextWidth();
+        int textHeight = getScreen().getTextHeight();
         boolean cursorBlinkVisible = true;
 
         if (getScreen() instanceof SwingTerminal) {
             SwingTerminal terminal = (SwingTerminal) getScreen();
-
-            textWidth = terminal.getTextWidth();
-            textHeight = terminal.getTextHeight();
             cursorBlinkVisible = terminal.getCursorBlinkVisible();
         } else if (getScreen() instanceof ECMA48Terminal) {
             ECMA48Terminal terminal = (ECMA48Terminal) getScreen();
 
-            textWidth = terminal.getTextWidth();
-            textHeight = terminal.getTextHeight();
+            if (!terminal.hasSixel()) {
+                // The backend does not have sixel support, draw this as text
+                // and bail out.
+                putCharXY(x, y, cell);
+                putCharXY(x + 1, y, ' ', cell);
+                return;
+            }
             cursorBlinkVisible = blinkState;
         } else {
             // We don't know how to dray glyphs to this screen, draw them as
@@ -987,13 +997,8 @@ public class TTerminalWindow extends TScrollableWindow
             gr2.setFont(doubleFont);
 
             // Draw the background rectangle, then the foreground character.
-            if (getScreen() instanceof ECMA48Terminal) {
-                // BUG: the background color is coming in the same as the
-                // foreground color.  For now, don't draw it.
-            } else {
-                gr2.setColor(SwingTerminal.attrToBackgroundColor(cell));
-                gr2.fillRect(0, 0, image.getWidth(), image.getHeight());
-            }
+            gr2.setColor(SwingTerminal.attrToBackgroundColor(cell));
+            gr2.fillRect(0, 0, image.getWidth(), image.getHeight());
             if (!cell.isBlink()
                 || (cell.isBlink() && cursorBlinkVisible)
             ) {
@@ -1056,6 +1061,11 @@ public class TTerminalWindow extends TScrollableWindow
         }
         left.setImage(leftImage);
         right.setImage(rightImage);
+        // Since we have image data, ditch the character here.  Otherwise, a
+        // drawBoxShadow() over the terminal window will show the characters
+        // which looks wrong.
+        left.setChar(' ');
+        right.setChar(' ');
         putCharXY(x, y, left);
         putCharXY(x + 1, y, right);
     }