X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FSurface.java;h=79a6194076a730d33fe6100bf81086d669f7aac5;hb=456bc0af52725d0babe8db1a6cec88943a3cbed1;hp=e241742ec4d37f8ee84266746bddc57014010c3c;hpb=02b644ef2b669218f0547c646c6d85a2a9ce917b;p=org.ibex.core.git diff --git a/src/org/xwt/Surface.java b/src/org/xwt/Surface.java index e241742..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; @@ -32,6 +32,8 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { 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 @@ -77,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 //////////////////////////////////////////////////////////// @@ -162,10 +170,11 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { /** subclasses should invoke this method when the user resizes the window */ protected final void SizeChange(final int width, final int height) { - pendingWidth = width; - pendingHeight = height; - Refresh(); - Scheduler.add(new Scheduler.Task() { public void perform() { }}); + if (pendingWidth == width && pendingHeight == height) return; + actualWidth = pendingWidth = width; + actualHeight = pendingHeight = height; + abort = true; + Scheduler.renderAll(); } // FEATURE: can we avoid creating objects here? @@ -185,7 +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 void Refresh() { abort = true; } + public void Refresh() { Scheduler.add(new Scheduler.Task() { public void perform() { } }); } public final void setMaximized(boolean b) { if (b != maximized) _setMaximized(maximized = b); } public final void setMinimized(boolean b) { if (b != minimized) _setMinimized(minimized = b); } @@ -231,18 +240,21 @@ 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() { + // 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); + if (root.maxwidth != root.width || root.maxheight != root.height) { + // dirty the place where the scar used to be and where it is now + dirty(0, root.height - Main.scarImage.height, Main.scarImage.width, Main.scarImage.height); + dirty(0, root.maxheight - 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); + setSize(root.width, root.height); String oldcursor = cursor; cursor = "default"; root.putAndTriggerTrapsAndCatchExceptions("_Move", JS.T); @@ -260,7 +272,7 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { if (w <= 0 || h <= 0) continue; root.render(0, 0, x, y, x + w, y + h, this, identity); - drawPicture(Main.scarImage, 0, root.height - Main.scarImage.height, x, y, w, h); + drawPicture(Main.scarImage, 0, root.height - Main.scarImage.height, x, y, x+w, y+h); if (abort) { @@ -298,11 +310,13 @@ public abstract class Surface extends PixelBuffer implements Scheduler.Task { if (value.toLowerCase().equals("alt")) alt = true; else if (alt) value = "A-" + value; if (value.toLowerCase().endsWith("control")) control = true; else if (control) value = "C-" + value; if (value.equals("C-v") || value.equals("A-v")) Platform.clipboardReadEnabled = true; + this.value = value; } else if (name.equals("_KeyReleased")) { String value = (String)this.value; if (value.toLowerCase().equals("alt")) alt = false; else if (value.toLowerCase().equals("control")) control = false; else if (value.toLowerCase().equals("shift")) shift = false; + this.value = value; } try { boxContainingMouse.putAndTriggerTraps(name, value);