many fixes
[fanfix.git] / src / jexer / io / Screen.java
index eab9650d14aac19735f732b78036e3fcf7d28d2d..1ecc4b185e0ee1eb8352211882c55bb39003d27b 100644 (file)
@@ -183,7 +183,17 @@ public abstract class Screen {
     /**
      * When true, logical != physical.
      */
-    protected boolean dirty;
+    protected volatile boolean dirty;
+
+    /**
+     * Get dirty flag.
+     *
+     * @return if true, the logical screen is not in sync with the physical
+     * screen
+     */
+    public final boolean isDirty() {
+        return dirty;
+    }
 
     /**
      * Set if the user explicitly wants to redraw everything starting with a
@@ -216,7 +226,9 @@ public abstract class Screen {
      */
     public final CellAttributes getAttrXY(final int x, final int y) {
         CellAttributes attr = new CellAttributes();
-        attr.setTo(logical[x][y]);
+        if ((x >= 0) && (x < width) && (y >= 0) && (y < height)) {
+            attr.setTo(logical[x][y]);
+        }
         return attr;
     }
 
@@ -241,8 +253,8 @@ public abstract class Screen {
      * @param attr attributes to use (bold, foreColor, backColor)
      * @param clip if true, honor clipping/offset
      */
-    public final void putAttrXY(final int x, final int y,
-        final CellAttributes attr, final boolean clip) {
+    public final void putAttrXY(final int x, final int y
+        final CellAttributes attr, final boolean clip) {
 
         int X = x;
         int Y = y;
@@ -278,6 +290,7 @@ public abstract class Screen {
      * @param attr attributes to use (bold, foreColor, backColor)
      */
     public final void putAll(final char ch, final CellAttributes attr) {
+
         for (int x = 0; x < width; x++) {
             for (int y = 0; y < height; y++) {
                 putCharXY(x, y, ch, attr);
@@ -346,6 +359,7 @@ public abstract class Screen {
      * @param ch character to draw
      */
     public final void putCharXY(final int x, final int y, final char ch) {
+
         if ((x < clipLeft)
             || (x >= clipRight)
             || (y < clipTop)
@@ -396,6 +410,7 @@ public abstract class Screen {
      * @param str string to draw
      */
     public final void putStrXY(final int x, final int y, final String str) {
+
         int i = x;
         for (int j = 0; j < str.length(); j++) {
             char ch = str.charAt(j);
@@ -447,7 +462,7 @@ public abstract class Screen {
      * @param width new width
      * @param height new height
      */
-    private void reallocate(final int width, final int height) {
+    private synchronized void reallocate(final int width, final int height) {
         if (logical != null) {
             for (int row = 0; row < this.height; row++) {
                 for (int col = 0; col < this.width; col++) {
@@ -492,7 +507,7 @@ public abstract class Screen {
      *
      * @param width new screen width
      */
-    public final void setWidth(final int width) {
+    public final synchronized void setWidth(final int width) {
         reallocate(width, this.height);
     }
 
@@ -502,7 +517,7 @@ public abstract class Screen {
      *
      * @param height new screen height
      */
-    public final void setHeight(final int height) {
+    public final synchronized void setHeight(final int height) {
         reallocate(this.width, height);
     }
 
@@ -522,7 +537,7 @@ public abstract class Screen {
      *
      * @return current screen height
      */
-    public final int getHeight() {
+    public final synchronized int getHeight() {
         return this.height;
     }
 
@@ -531,7 +546,7 @@ public abstract class Screen {
      *
      * @return current screen width
      */
-    public final int getWidth() {
+    public final synchronized int getWidth() {
         return this.width;
     }
 
@@ -552,7 +567,7 @@ public abstract class Screen {
      * Reset screen to not-bold, white-on-black.  Also flushes the offset and
      * clip variables.
      */
-    public final void reset() {
+    public final synchronized void reset() {
         dirty = true;
         for (int row = 0; row < height; row++) {
             for (int col = 0; col < width; col++) {
@@ -575,12 +590,24 @@ public abstract class Screen {
     }
 
     /**
-     * Force the screen to be fully cleared and redrawn on the next flush().
+     * Clear the logical screen.
      */
     public final void clear() {
         reset();
     }
 
+    /**
+     * Clear the physical screen.
+     */
+    public final void clearPhysical() {
+        dirty = true;
+        for (int row = 0; row < height; row++) {
+            for (int col = 0; col < width; col++) {
+                physical[col][row].reset();
+            }
+        }
+    }
+
     /**
      * Draw a box with a border and empty background.
      *
@@ -727,7 +754,7 @@ public abstract class Screen {
      * Subclasses must provide an implementation to push the logical screen
      * to the physical device.
      */
-    abstract public void flushPhysical();
+    public abstract void flushPhysical();
 
     /**
      * Put the cursor at (x,y).
@@ -736,8 +763,7 @@ public abstract class Screen {
      * @param x column coordinate to put the cursor on
      * @param y row coordinate to put the cursor on
      */
-    public final void putCursor(final boolean visible,
-        final int x, final int y) {
+    public void putCursor(final boolean visible, final int x, final int y) {
 
         cursorVisible = visible;
         cursorX = x;