X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FSurface.java;h=79a6194076a730d33fe6100bf81086d669f7aac5;hb=456bc0af52725d0babe8db1a6cec88943a3cbed1;hp=fe5844fb9d72910a06df48fda9b87d12886b5b8b;hpb=457660f731024833fc8aea9b0154eae578b51600;p=org.ibex.core.git diff --git a/src/org/xwt/Surface.java b/src/org/xwt/Surface.java index fe5844f..79a6194 100644 --- a/src/org/xwt/Surface.java +++ b/src/org/xwt/Surface.java @@ -1,4 +1,4 @@ -// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL] +// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] package org.xwt; import org.bouncycastle.util.encoders.Base64; @@ -29,7 +29,11 @@ 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; + volatile int actualWidth = -1; + volatile int actualHeight = -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 @@ -46,11 +50,13 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { public String cursor = "default"; ///< The active cursor to switch to when syncCursor() is called public int mousex; ///< x position of the mouse, in Scheduler-time public int mousey; ///< y position of the mouse, in Scheduler-time + public int _mousex; ///< x position of the mouse, in Scheduler-time + public int _mousey; ///< y position of the mouse, in Scheduler-time public int newmousex = -1; ///< x position of the mouse, in realtime public int newmousey = -1; ///< y position of the mouse, in realtime public boolean minimized = false; ///< True iff this surface is minimized, in real time public boolean maximized = false; ///< True iff this surface is maximized, in real time - private DirtyList dirtyRegions = new DirtyList(); ///< Dirty regions on the *screen* + DirtyList dirtyRegions = new DirtyList(); ///< Dirty regions on the *screen* // Used For Simulating Clicks and DoubleClicks ///////////////////////////////////////////////// @@ -73,8 +79,14 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { public abstract void setTitleBarText(String s); ///< Sets the surface's title bar text, if applicable public abstract void setIcon(Picture i); ///< Sets the surface's title bar text, if applicable public abstract void _dispose(); ///< Destroy the surface - public void setLimits(int min_width, int min_height, int max_width, int max_height) { /* FIXME */ } + public void setMinimumSize(int minx, int miny, boolean resizable) { } + protected void setSize(int w, int h) { + if (w == actualWidth && h == actualHeight) return; + actualWidth = w; + actualHeight = h; + _setSize(w, h); + } // Helper methods for subclasses //////////////////////////////////////////////////////////// @@ -129,7 +141,6 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { /** we enqueue ourselves in the Scheduler when we have a Move message to deal with */ public void perform() { - inqueue = false; if (mousex == newmousex && mousey == newmousey) return; int oldmousex = mousex; mousex = newmousex; int oldmousey = mousey; mousey = newmousey; @@ -139,8 +150,8 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { try { root.putAndTriggerTraps("_Move", T); } catch (JSExn e) { - Log.log(Surface.class, "Exception thrown from Move message handler"); - Log.logJS(e); + Log.info(Surface.class, "Exception thrown from Move message handler"); + JS.log(e); } if (!cursor.equals(oldcursor)) syncCursor(); } @@ -154,31 +165,16 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { protected final void Move(final int newmousex, final int newmousey) { this.newmousex = newmousex; this.newmousey = newmousey; - if (!inqueue) Scheduler.add(this); - inqueue = true; + Scheduler.add(this); } - boolean inqueue = false; - Scheduler.Task nextSizeChange = null; - int nextWidth = 0; - int nextHeight = 0; - // 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) { - nextWidth = width; - nextHeight = height; - if (nextSizeChange != null) return; - 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(nextWidth)); - root.setMaxHeight(JS.N(nextHeight)); - nextSizeChange = null; - }}; - Scheduler.add(nextSizeChange); + if (pendingWidth == width && pendingHeight == height) return; + actualWidth = pendingWidth = width; + actualHeight = pendingHeight = height; abort = true; + Scheduler.renderAll(); } // FEATURE: can we avoid creating objects here? @@ -198,12 +194,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() { /*Scheduler.add(renderAll);*/ } - - public static final Scheduler.Task renderAll = new Scheduler.Task() { public void perform() { - for(int i=0; i root.width) w = root.width - x; if (y+h > root.height) h = root.height - y; if (w <= 0 || h <= 0) continue; + if (abort) return; blit(backbuffer, x, y, x, y, w + x, h + y); } } @@ -387,7 +378,12 @@ 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) { + screenDirtyRegions.dirty(x, y, w, h); + super.dirty(x, y, w, h); } /** copies a region from the doublebuffer to this surface */