Revision: 2336
http://vexi.svn.sourceforge.net/vexi/?rev=2336&view=rev
Author: clrg
Date: 2007-09-26 17:09:06 -0700 (Wed, 26 Sep 2007)
Log Message:
-----------
Overhaul handling of the way Surface size is handled
Modified Paths:
--------------
trunk/core/org.vexi.core/src/org/vexi/core/Box.jpp
trunk/core/org.vexi.core/src/org/vexi/core/Surface.java
trunk/core/org.vexi.core/src/org/vexi/plat/AWT.java
Modified: trunk/core/org.vexi.core/src/org/vexi/core/Box.jpp
===================================================================
--- trunk/core/org.vexi.core/src/org/vexi/core/Box.jpp 2007-09-26 10:05:00 UTC
(rev 2335)
+++ trunk/core/org.vexi.core/src/org/vexi/core/Box.jpp 2007-09-27 00:09:06 UTC
(rev 2336)
@@ -324,7 +324,7 @@
}
/** attempt to resize box and dirty appropriate areas */
- private void tryResize(int width, int height) {
+ protected void tryResize(int width, int height) {
if (width == this.width && height == this.height) return;
dirty();
//#repeat width/height WIDTH/HEIGHT
@@ -383,9 +383,15 @@
/** should only be invoked on the root box */
public void reflow() {
if ((flags & REFLOW) == 0) return;
+ reflow(width, height);
+ }
+
+ /** should only be invoked on the root box */
+ public void reflow(int w, int h) {
constrain();
- tryResize(test(HSHRINK) ? contentwidth : maxwidth,
- test(VSHRINK) ? contentheight : maxheight);
+ //tryResize(test(HSHRINK) ? contentwidth : maxwidth,
+ // test(VSHRINK) ? contentheight : maxheight);
+ tryResize(w, h);
place();
}
@@ -781,7 +787,7 @@
//#repeat Width/Height width/height
/** set minwidth/maxwidth according to min/max */
- public void setMinMaxWidth(int min, int max) {
+ private void setMinMaxWidth(int min, int max) {
if (this.minwidth == min && this.maxwidth == max) return;
if (this.minwidth != min) {
PUT_BOX_FIELD(SC_minwidth,JSU.N(min),this.minwidth =
min,MINMAX_TRAPS)
@@ -794,22 +800,21 @@
setConstrain();
// in box tree
- if (parent != null) {
- parent.set(CONSTRAIN);
-
+ if (parent != null) parent.set(CONSTRAIN);
// root of box tree
- } else {
- reconstrainRoot();
- }
+ else reconstrainRoot();
}
//#end
// REMARK - moved to own function to avoid the preprocessor in
setMinMax(Width|Height)
private void reconstrainRoot() {
Surface s = getSurface();
- if (s != null && !s.syncRootWithSurface) {
- s.pendingWidth = maxwidth;
+ if (s != null) {
s.setMinimumSize(minwidth, minheight, minwidth != maxwidth ||
minheight != maxheight);
+ int mw = maxwidth, mh = maxheight;
+ if (mw == Integer.MAX_VALUE) mw = s.pendingWidth;
+ if (mh == Integer.MAX_VALUE) mh = s.pendingHeight;
+ s.setSize(mw, mh);
}
}
Modified: trunk/core/org.vexi.core/src/org/vexi/core/Surface.java
===================================================================
--- trunk/core/org.vexi.core/src/org/vexi/core/Surface.java 2007-09-26
10:05:00 UTC (rev 2335)
+++ trunk/core/org.vexi.core/src/org/vexi/core/Surface.java 2007-09-27
00:09:06 UTC (rev 2336)
@@ -200,10 +200,9 @@
/** subclasses should invoke this method when the user resizes the window
*/
protected final void SizeChange(final int width, final int height) {
- if (syncSurfaceWithRoot || (pendingWidth == width && pendingHeight ==
height)) return;
+ if (pendingWidth == width && pendingHeight == height) return;
pendingWidth = width;
pendingHeight = height;
- syncRootWithSurface = true;
abort = true;
Refresh();
// FEATURE: notify root box of x/y change if align is not topleft
@@ -281,12 +280,20 @@
protected final void Maximized(boolean b) { maximized = b; new
Message("Maximized", b ? T : F, root, false); }
protected final void Focused(boolean b) { new Message("Focused", b ? T :
F, root, false); }
+ /** refresh handles interacting with the scheduler - it needs
+ * to be synchronized to prevent scheduled
+ */
private boolean scheduled = false;
- public void Refresh() { if (!scheduled) Scheduler.add(this); scheduled =
true; }
+ final public synchronized void Refresh() {
+ if (!scheduled) {
+ Scheduler.add(this);
+ scheduled = true;
+ }
+ }
/** only run if scheduled */
public Object run(Object o) {
- if (scheduled) render();
+ render();
return null;
}
@@ -349,10 +356,12 @@
Log.warn(this, jse);
}
// TODO: document this in the reference
- if (root.maxwidth == Integer.MAX_VALUE)
- root.setMinMaxWidth(root.minwidth, Platform.getScreenWidth() / 2);
- if (root.maxheight == Integer.MAX_VALUE)
- root.setMinMaxHeight(root.minheight, Platform.getScreenHeight() /
2);
+ pendingWidth = root.maxwidth;
+ pendingHeight = root.maxheight;
+ if (pendingWidth == Integer.MAX_VALUE)
+ pendingWidth = Platform.getScreenWidth() / 2;
+ if (pendingHeight == Integer.MAX_VALUE)
+ pendingHeight = Platform.getScreenHeight() / 2;
// set frame specific box properties
try {
JS icon = root.get(SC_icon);
@@ -370,30 +379,29 @@
/** runs the prerender() and render() pipelines in the root Box to
regenerate the backbuffer, then blits it to the screen */
public synchronized void render() {
- scheduled = false;
+ scheduled = false;
+ // do nothing if we are minimized
+ if (minimized) return;
// make sure the root is properly sized
do {
abort = false;
- if (syncRootWithSurface) {
- root.setMinMaxWidth(root.minwidth, pendingWidth);
- root.setMinMaxHeight(root.minheight, pendingHeight);
- syncRootWithSurface = false;
- }
- int rootwidth = root.getSurfaceWidth();
- int rootheight = root.getSurfaceHeight();
- if (rootwidth != root.width || rootheight != root.height) {
+ // pending size update means the user resized the window
+ if (pendingWidth != root.width || pendingHeight != root.height) {
+ // ensure scar is always shown
if (scarImage != null) {
// dirty the place where the scar used to be and where it
is now
dirty(0, root.height - scarImage.height, scarImage.width,
scarImage.height);
- dirty(0, rootheight - scarImage.height, scarImage.width,
scarImage.height);
+ dirty(0, root.height - scarImage.height, scarImage.width,
scarImage.height);
}
- }
- // set frame size according to root box size
- if (!maximized && !minimized && syncSurfaceWithRoot) {
- setSize(rootwidth, rootheight);
- syncSurfaceWithRoot = false;
- }
- root.reflow();
+ // reflow to new size as set by the frame
+ root.reflow(pendingWidth, pendingHeight);
+ // root rejects new sizes
+ /*if (root.width != pendingWidth || root.height !=
pendingHeight) {
+ pendingWidth = root.width;
+ pendingHeight = root.height;
+ setSize(pendingWidth, pendingHeight);
+ }*/
+ } else root.reflow();
} while(abort);
int numregions = dirtyRegions.num();
@@ -415,7 +423,7 @@
if(scarImage.width > x && yscarstart < y+h)
buff.drawPicture(scarImage, 0, yscarstart, x, y, x+w,
y+h);
}
-
+ /*
if (abort) {
// x,y,w,h is only partially reconstructed, so we must be
careful not to re-blit it
dirtyRegions.dirty(x, y, w, h);
@@ -425,6 +433,7 @@
dirtyRegions.dirty(dirt[j][0], dirt[j][1], dirt[j][2],
dirt[j][3]);
return;
}
+ */
}
}
@@ -519,7 +528,7 @@
public void render() {
super.render();
- if (abort) return;
+ //if (abort) { System.err.println("early abort"); return; }
int numregions = screenDirtyRegions.num();
int[][] dirt = screenDirtyRegions.flush();
for(int i = 0; dirt != null && i < numregions; i++) {
@@ -533,7 +542,7 @@
if (x+w > root.width) w = root.width - x;
if (y+h > root.height) h = root.height - y;
if (w <= 0 || h <= 0) continue;
- if (abort) return;
+ //if (abort) { System.err.println("aborting render ("+i+")");
return; }
blit(backbuffer, x, y, x, y, w + x, h + y);
}
}
Modified: trunk/core/org.vexi.core/src/org/vexi/plat/AWT.java
===================================================================
--- trunk/core/org.vexi.core/src/org/vexi/plat/AWT.java 2007-09-26 10:05:00 UTC
(rev 2335)
+++ trunk/core/org.vexi.core/src/org/vexi/plat/AWT.java 2007-09-27 00:09:06 UTC
(rev 2336)
@@ -446,6 +446,7 @@
if (framed) window = frame = new InnerFrame();
else window = new InnerWindow();
setLocation();
+ setSize(pendingWidth, pendingHeight);
// this is here to catch HeadlessException on jdk1.4
} catch (java.lang.UnsupportedOperationException e) {
@@ -553,10 +554,14 @@
buf.g.setColor(new java.awt.Color((root.fillcolor >> 16) & 0xff,
(root.fillcolor >> 8) & 0xff,
(root.fillcolor) & 0xff));
- if (oldwidth < newwidth)
- buf.g.fillRect(oldwidth, 0, newwidth,
oldheight>newheight?oldheight:newheight);
- if (oldheight < newheight)
- buf.g.fillRect(0, oldheight,
oldwidth>newwidth?oldwidth:newwidth, newheight);
+ if (oldwidth < newwidth) {
+ buf.g.fillRect(oldwidth, 0, newwidth, newheight);
+ dirty(oldwidth, 0, newwidth-oldwidth, newheight);
+ }
+ if (oldheight < newheight) {
+ buf.g.fillRect(0, oldheight, newwidth, newheight);
+ dirty(0, oldheight, newwidth, newheight-oldheight);
+ }
oldwidth = newwidth;
oldheight = newheight;
SizeChange(newwidth, newheight);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Vexi-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn