2003/12/27 01:03:53
[org.ibex.core.git] / src / org / xwt / Surface.java
index eca0dee..e28dbcd 100644 (file)
@@ -29,7 +29,9 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
     public static Vec allSurfaces = new Vec();
     
     /** When set to true, render() should abort as soon as possible and restart the rendering process */
-    static volatile boolean abort = false;
+    volatile boolean abort = false;
+    volatile int pendingWidth = -1;
+    volatile int pendingHeight = -1;
 
     public static boolean alt = false;          ///< true iff the alt button is pressed down, in real time
     public static boolean control = false;      ///< true iff the control button is pressed down, in real time
@@ -158,22 +160,11 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
         Scheduler.add(this);
     }
 
-    private Scheduler.Task nextSizeChange = null;
-    // FEATURE: can we avoid creating objects here?
     /** subclasses should invoke this method when the user resizes the window */
     protected final void SizeChange(final int width, final int height) {
-        if (root.maxwidth == width && root.maxheight == height) return;
-        nextSizeChange = new Scheduler.Task() { public void perform() {
-            if (nextSizeChange != this) return;
-            // dirty the place where the scar used to be
-            root.dirty(0, root.maxheight - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height);
-            root.setMaxWidth(JS.N(width));
-            root.setMaxHeight(JS.N(height));
-            nextSizeChange = null;
-            Refresh();
-        }};
-        Scheduler.addAtFront(nextSizeChange);
-        abort = true;
+        pendingWidth = width;
+        pendingHeight = height;
+        Refresh();
     }
 
     // FEATURE: can we avoid creating objects here?
@@ -193,19 +184,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
     protected final void Minimized(boolean b) { minimized = b; new SimpleMessage("Minimized", b ? T : F, root); }
     protected final void Maximized(boolean b) { maximized = b; new SimpleMessage("Maximized", b ? T : F, root); }
     protected final void Focused(boolean b) { new SimpleMessage("Focused", b ? T : F, root); }
-    public static void Refresh() { needRender = true; Scheduler.add(new Scheduler.Task() { public void perform() { } }); }
-
-    public static boolean needRender = false;
-    public static final Scheduler.Task renderAll = new Scheduler.Task() {
-            public void perform() {
-                for(int i=0; i<allSurfaces.size(); i++) {
-                    Surface s = ((Surface)allSurfaces.elementAt(i));
-                    do {
-                        s.render(); 
-                    } while(s.abort);
-                }
-            }
-        };
+    public void Refresh() { abort = true; }
 
     public final void setMaximized(boolean b) { if (b != maximized) _setMaximized(maximized = b); }
     public final void setMinimized(boolean b) { if (b != minimized) _setMinimized(minimized = b); }
@@ -251,14 +230,15 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
 
     /** runs the prerender() and render() pipelines in the root Box to regenerate the backbuffer, then blits it to the screen */
     public synchronized void render() {
-        // dirty the place where the scar used to be in case the root window size was programmatically changed
-        if (root.maxwidth != root.width || root.maxheight != root.height)
-            root.dirty(0, root.height - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height);
-
         // make sure the root is properly sized
         do {
             abort = false;
             root.repack();
+            if (pendingWidth != -1) root.setMaxWidth(JS.N(pendingWidth));
+            if (pendingHeight != -1) root.setMaxHeight(JS.N(pendingHeight));
+            // dirty the place where the scar used to be in case the root window size was programmatically changed
+            if (root.maxwidth != root.width || root.maxheight != root.height)
+                root.dirty(0, root.height - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height);
             root.resize(root.x, root.y, root.maxwidth, root.maxheight);
             root.resize_children();
             _setSize(root.width, root.height);
@@ -360,7 +340,6 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
             backbuffer.fillTrapezoid(x1, x2, y1, x3, x4, y2, color);
         }
 
-        public void render_() { render(); }
         public void render() {
             super.render();
             if (abort) return;
@@ -384,7 +363,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task {
         /** This is how subclasses signal a 'shallow dirty', indicating that although the backbuffer is valid, the screen is not */
         public final void Dirty(int x, int y, int w, int h) {
             screenDirtyRegions.dirty(x, y, w, h);
-            Refresh();
+            Scheduler.renderAll();
         }
 
         public void dirty(int x, int y, int w, int h) {