2003/10/16 05:39:20
[org.ibex.core.git] / src / org / xwt / plat / Darwin.java
index d6aa8d8..a3e4141 100644 (file)
@@ -13,11 +13,6 @@ public class Darwin extends POSIX {
     private CarbonOpenGL openGL;
     boolean jaguar; // true if we are on OS X >= 10.2
     
-    // TEMPORARY HACKS (remove these when we ditch platform fonts)
-    protected int _stringWidth(String font, String text) { return (int)Math.round(6.5 * text.length()); }
-    protected int _getMaxAscent(String font) { return 10; }
-    protected int _getMaxDescent(String font) { return 2; }
-    
     // General Methods
     protected String _getAltKeyName() { return "Option"; }
     protected boolean _needsAutoClick() { return false; }
@@ -34,7 +29,6 @@ public class Darwin extends POSIX {
     protected native void   _newBrowserWindow(String url);
     protected native HTTP.Proxy   natDetectProxy();
     private   native void    natInit();
-    protected native void   _exit();
 
     private native String natGetClipBoard();
     private native void natSetClipBoard(String text);
@@ -53,7 +47,6 @@ public class Darwin extends POSIX {
         public Semaphore sem = new Semaphore();
         public String fileName;
         public String saveName;
-        public RawData rawUPP;
     }
     private native void natFileDialog(FileDialogHelper helper, String suggestedFileName, boolean write);
     protected String _fileDialog(final String fn, final boolean w) {
@@ -67,9 +60,6 @@ public class Darwin extends POSIX {
     }
 
     
-    // Called by main thread after initialization, this is the event handler
-    protected native void _running();
-    
     static void abort(String err) {
         throw new Error(err);
     }
@@ -87,6 +77,9 @@ public class Darwin extends POSIX {
     
     private static native final boolean isJaguar();
     
+    // Called by main thread after initialization, this is the event handler
+    protected native void runApplicationEventLoop();
+    
     public void init() {
         super.init();
         jaguar = isJaguar();
@@ -95,12 +88,14 @@ public class Darwin extends POSIX {
             openGL.init();
         } catch(OpenGL.NotSupportedException e) {
             Log.log(this,"WARNING: OpenGL support not available: " + e);
-            // FIXME: We need to fallback to Quartz2D
+            // FEATURE: fall back to quartz 2d
             throw new Error("No OpenGL support");
         }
         natInit();
     }
     
+    public void _running() { runApplicationEventLoop(); }
+    
     private final class CarbonOpenGL extends OpenGL {
         public RawData rawPixelFormat;
         public RawData rawSharedContext;
@@ -131,10 +126,13 @@ public class Darwin extends POSIX {
         protected native void activateSharedContext();
     }
     
-    static abstract class CarbonSurface extends Surface {  
+    static abstract class CarbonSurface extends Surface.DoubleBufferedSurface {  
         RawData rawWindowRef;
-        RawData rawEventHandlerUPP;
         int modifiers;
+        int winWidth;
+        int winHeight;
+        
+        boolean pendingResize;
          
         private native void natSetInvisible(boolean i);
         public void setInvisible(final boolean i) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetInvisible(i); } }); }
@@ -148,8 +146,8 @@ public class Darwin extends POSIX {
         public void setTitleBarText(final String s) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetTitleBarText(s); } }); }
         private native void natSetSize(int w, int h);
         public void setSize(final int w, final int h) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetSize(w,h); } }); }
-        private native void natSetLocation(int x, int y);
-        public void setLocation(final int x, final int y) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLocation(x,y); } }); }
+        private native void natSetLocation();
+        public void setLocation() { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLocation(); } }); }
         private native void natToFront();
         public void toFront() { CarbonMessage.add(new CarbonMessage() { public void perform() { natToFront(); } }); }
         private native void natToBack();
@@ -173,9 +171,7 @@ public class Darwin extends POSIX {
             final int n_ = n;
             CarbonMessage.add(new CarbonMessage() { public void perform() { natSyncCursor(n_); } });
         }
-
-        public void _sizeChange(int w, int h) { SizeChange(w,h); }
-        
+       
         /* Drawing stuff */
         public abstract void blit(PixelBuffer s, int sx, int sy, int dx, int dy, int dx2, int dy2);
 
@@ -191,7 +187,10 @@ public class Darwin extends POSIX {
             sem.block();
         }
         
-        public void reshape(int w, int h) { }
+        public void needsReshape() { }
+        protected static native void blitLock();
+        protected static native void blitUnlock();
+        protected static native void blitWait();
     }
     
     static class GLCarbonPixelBuffer extends OpenGL.GLPixelBuffer {
@@ -227,9 +226,11 @@ public class Darwin extends POSIX {
     static class GLCarbonSurface extends CarbonSurface {
         RawData rawCTX;
         CarbonOpenGL gl;
-        boolean sizeChange;
-        
+        boolean needsReshape;
+                
         private final native void natInit();
+        private final native void flush();
+        private final native void clear();
         
         public GLCarbonSurface(Box root, boolean framed, CarbonOpenGL gl) {
             super(root,framed);
@@ -242,26 +243,39 @@ public class Darwin extends POSIX {
             mxh = Math.min(mxh,gl.maxSurfaceHeight);
             super.setLimits(mnw,mnh,mxw,mxh);
         }
-        public void _sizeChange(int w, int h) {
-            sizeChange = true;
-            super._sizeChange(w,h);
-        }
         
         public void setSize(int w, int h) {
-            sizeChange = true;
             w = Math.min(w,gl.maxSurfaceWidth);
             h = Math.min(h,gl.maxSurfaceWidth);
             super.setSize(w,h);
         }
         
         private native void natBlit(GLCarbonPixelBuffer db, int sx, int sy, int dx, int dy, int dx2, int dy2);
-        public synchronized void blit(PixelBuffer db, int sx, int sy, int dx, int dy, int dx2, int dy2) {
+        public void blit(PixelBuffer db, int sx, int sy, int dx, int dy, int dx2, int dy2) {
             natBlit((GLCarbonPixelBuffer)db,sx,sy,dx,dy,dx2,dy2);
         }
         
-        private native void natReshape(int w, int h);
-        public synchronized void reshape(int w, int h) { natReshape(w,h); }
         
+        // The blit_lock ensures the window size does not change through the entire blit operation.
+        public void render_() {
+            blitLock();
+            while(pendingResize) blitWait();
+            if(needsReshape) {
+                needsReshape = false;
+                
+                reshape(winWidth,winHeight);
+                clear();
+                Dirty(0,0,getWidth(),getHeight());
+            }
+            super.render_();
+            flush();
+            blitUnlock();
+        }
+        
+        private native void reshape(int w, int h);
+        // blit_lock is assumed to be held
+        public void needsReshape() { needsReshape = true; }
+
         public native void natDispose();
     }
 
@@ -308,6 +322,12 @@ public class Darwin extends POSIX {
         else
             return /*new QZCarbonPicture(data,w,h);*/ null;
     }
+    protected Picture _createAlphaOnlyPicture(byte[] data, int w, int h) {
+        if(openGL != null)
+            return openGL.createAlphaOnlyPicture(data,w,h);
+        else
+            return super.createAlphaOnlyPicture(data,w,h);
+    }
     
     /* A message that is sent through the carbon event queue */
     private static abstract class CarbonMessage {