/**
* Width of a character cell in pixels.
*/
- private int textWidth = 1;
+ private int textWidth = 16;
/**
* Height of a character cell in pixels.
*/
- private int textHeight = 1;
+ private int textHeight = 20;
/**
* Width of a character cell in pixels, as reported by font.
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
+ /**
+ * Static constructor.
+ */
+ static {
+ setDOSColors();
+ }
+
/**
* Public constructor creates a new JFrame to render to.
*
this.fontSize = fontSize;
- setDOSColors();
reloadOptions();
try {
SwingTerminal.this.setDimensions(sessionInfo.
getWindowWidth(), sessionInfo.getWindowHeight());
- SwingTerminal.this.resizeToScreen();
+ SwingTerminal.this.resizeToScreen(true);
SwingTerminal.this.swing.setVisible(true);
}
});
this.fontSize = fontSize;
- setDOSColors();
reloadOptions();
try {
&& (swing.getBufferStrategy() != null)
) {
do {
- clearPhysical();
do {
+ clearPhysical();
drawToSwing();
} while (swing.getBufferStrategy().contentsRestored());
return blinkMillis;
}
+ /**
+ * Get the current status of the blink flag.
+ *
+ * @return true if the cursor and blinking text should be visible
+ */
+ public boolean getCursorBlinkVisible() {
+ return cursorBlinkVisible;
+ }
+
/**
* Get the font size in points.
*
swing.setFont(font);
glyphCacheBlink = new HashMap<Cell, BufferedImage>();
glyphCache = new HashMap<Cell, BufferedImage>();
- resizeToScreen();
+ resizeToScreen(true);
}
}
gotFontDimensions = true;
}
+ /**
+ * Resize the physical screen to match the logical screen dimensions.
+ *
+ * @param resizeComponent if true, resize the Swing component
+ */
+ private void resizeToScreen(final boolean resizeComponent) {
+ if (resizeComponent) {
+ swing.setDimensions(textWidth * width, textHeight * height);
+ }
+ clearPhysical();
+ }
+
/**
* Resize the physical screen to match the logical screen dimensions.
*/
@Override
public void resizeToScreen() {
- swing.setDimensions(textWidth * width, textHeight * height);
- clearPhysical();
+ resizeToScreen(false);
}
/**
gr2 = (Graphics2D) gr;
}
- Cell cellColor = new Cell();
- cellColor.setTo(cell);
+ Cell cellColor = new Cell(cell);
// Check for reverse
if (cell.isReverse()) {
|| (cell.isBlink() && cursorBlinkVisible)
) {
gr2.setColor(attrToForegroundColor(cellColor));
- char [] chars = new char[1];
- chars[0] = cell.getChar();
- gr2.drawChars(chars, 0, 1, gr2x + textAdjustX,
+ char [] chars = Character.toChars(cell.getChar());
+ gr2.drawChars(chars, 0, chars.length, gr2x + textAdjustX,
gr2y + textHeight - maxDescent + textAdjustY);
if (cell.isUnderline()) {
// We need a new key that will not be mutated by
// invertCell().
- Cell key = new Cell();
- key.setTo(cell);
+ Cell key = new Cell(cell);
if (cell.isBlink() && !cursorBlinkVisible) {
glyphCacheBlink.put(key, image);
} else {
int xPixel = cursorX * textWidth + left;
int yPixel = cursorY * textHeight + top;
Cell lCell = logical[cursorX][cursorY];
+ int cursorWidth = textWidth;
+ switch (lCell.getWidth()) {
+ case SINGLE:
+ // NOP
+ break;
+ case LEFT:
+ cursorWidth *= 2;
+ break;
+ case RIGHT:
+ cursorWidth *= 2;
+ xPixel -= textWidth;
+ break;
+ }
gr.setColor(attrToForegroundColor(lCell));
switch (cursorStyle) {
default:
// Fall through...
case UNDERLINE:
- gr.fillRect(xPixel, yPixel + textHeight - 2, textWidth, 2);
+ gr.fillRect(xPixel, yPixel + textHeight - 2, cursorWidth, 2);
break;
case BLOCK:
- gr.fillRect(xPixel, yPixel, textWidth, textHeight);
+ gr.fillRect(xPixel, yPixel, cursorWidth, textHeight);
break;
case OUTLINE:
- gr.drawRect(xPixel, yPixel, textWidth - 1, textHeight - 1);
+ gr.drawRect(xPixel, yPixel, cursorWidth - 1, textHeight - 1);
break;
}
}
break;
default:
if (!alt && ctrl && !shift) {
+ // Control character, replace ch with 'A', 'B', etc.
ch = KeyEvent.getKeyText(key.getKeyCode()).charAt(0);
}
// Not a special key, put it together