diff dwt/internal/c/callback.d @ 11:a329f9c3d66d

Ported dwt.internal.cocoa.SWT* again
author Jacob Carlborg <doob@me.com> <jacob.carlborg@gmail.com>
date Fri, 22 Aug 2008 15:39:51 +0200
parents 8b48be5454ce
children f565d3a95c0a
line wrap: on
line diff
--- a/dwt/internal/c/callback.d	Tue Aug 19 17:40:11 2008 +0200
+++ b/dwt/internal/c/callback.d	Fri Aug 22 15:39:51 2008 +0200
@@ -16,29 +16,52 @@
 /**
  * Callback implementation.
  */
+
+import tango.stdc.string;
+
 import dwt.dwthelper.utils;
 import dwt.internal.Callback;
 
 /* Header */
 
+const bool REDUCED_CALLBACKS = false;
+alias size_t SWT_PTR;
+
 version (Win32)
 {
     import tango.sys.win32.UserGdi;
     import tango.sys.win32.Types;
+    
+    alias LRESULT RETURN_TYPE;
 }
 
 else version (Win32_WCE)
 {
     import tango.sys.win32.UserGdi;
     import tango.sys.win32.Types;
+    
+    alias LRESULT RETURN_TYPE;
 }
 
 else
-    alias RETURN_TYPE SWT_PTR;
+    alias SWT_PTR RETURN_TYPE;
+
+version (X86)
+    const bool USE_ASSEMBLER = true;
+
+else
+    const bool USE_ASSEMBLER = true;
 
-/* Implementation */
+static if (REDUCED_CALLBACKS)
+    const int MAX_CALLBACKS = 16;
 
-alias size_t SWT_PTR;
+else static if (USE_ASSEMBLER)
+    const int MAX_CALLBACKS = 256;
+
+else
+    const int MAX_CALLBACKS = 128;    
+
+const int MAX_ARGS = 12;
 
 struct CALLBACK_DATA 
 {
@@ -51,21 +74,22 @@
     SWT_PTR errorResult;
 }
 
-bool USE_ASSEMBLER = false;
+/* Implementation */
 
-version (X86)
-    bool USE_ASSEMBLER = true;
+
+/* --------------- callback globals ----------------- */
 
 private
 {
     CALLBACK_DATA callbackData[MAX_CALLBACKS];
     int callbackEnabled = 1;
     int callbackEntryCount = 0;
-    int initialized = 0;
+    bool initialized = 0;
+    
+    debug
+        int counter = 0;
 }
 
-SWT_PTR callback(int index, ...);
-
 static if (USE_ASSEMBLER)
 {
     version (Win32){}
@@ -73,32 +97,29 @@
     else
         import tango.stdc.posix.sys.mman;
 
-    ubyte* callbackCode = null;
-    int CALLBACK_THUNK_SIZE = 64;
+    private ubyte* callbackCode = null;
+    const int CALLBACK_THUNK_SIZE = 64;
 }
 
-SWT_PTR bind (Callback callbackObject, Object object, String method, String signature, int argCount, boolean isStatic, boolean isArrayBased, SWT_PTR errorResult)
+SWT_PTR bind (Callback callbackObject, Object object, String method, String signature, int argCount, bool isStatic, bool isArrayBased, SWT_PTR errorResult)
 {
     int i;
     jmethodID mid = null;
     jclass javaClass = that;
-    const char* methodString = null;
-    const char* sigString = null;
-
-    if (jvm == null)
-        (*env).GetJavaVM(env, &jvm);
+    string methodString = null;
+    string sigString = null;
 
     if (!initialized)
     {
         memset(&callbackData, 0, callbackData.sizeof);
-        initialized = 1;
+        initialized = true;
     }
     
     if (method)
-        methodString = cast(/*const*/char*) (*env).GetStringUTFChars(env, method, null);
+        methodString = method;
     
     if (signature)
-        sigString = cast(/*const*/char*) (*env).GetStringUTFChars(env, signature, null);
+        sigString = signature;
     
     if (object && methodString && sigString)
     {
@@ -113,12 +134,6 @@
         }
     }
     
-    if (method && methodString)
-        (*env).ReleaseStringUTFChars(env, method, methodString);
-    
-    if (signature && sigString)
-        (*env).ReleaseStringUTFChars(env, signature, sigString);
-    
     if (mid == 0)
         goto fail;
     
@@ -126,10 +141,10 @@
     {
         if (!callbackData[i].callback)
         {
-            if ((callbackData[i].callback = (*env).NewGlobalRef(env, callbackObject)) == null)
+            if ((callbackData[i].callback = callbackObject) == null)
                 goto fail;
             
-            if ((callbackData[i].object = (*env).NewGlobalRef(env, object)) == null)
+            if ((callbackData[i].object = object) == null)
                 goto fail;
             
             callbackData[i].isStatic = isStatic;
@@ -140,7 +155,8 @@
 
             static if (!USE_ASSEMBLER)
                 return cast(SWT_PTR) fnx_array[argCount][i];
-
+            
+            else
             {
                 int j = 0, k, pad = 0;
                 ubyte* code;
@@ -260,10 +276,7 @@
                 }
 
                 if (j > CALLBACK_THUNK_SIZE)
-                {
-                    jclass errorClass = (*env).FindClass(env, "java/lang/Error");
-                    (*env).ThrowNew(env, errorClass, "Callback thunk overflow");
-                }
+                    throw new Error("Callback thunk overflow");
 
                 return cast(SWT_PTR) code;
             }
@@ -273,3 +286,35 @@
     fail:
         return 0;
 }
+
+void unbind (Callback callback)
+{
+    int i;
+    for (i=0; i<MAX_CALLBACKS; i++) {
+        if (callbackData[i].callback !is null && callbackData[i].callback == callback) {
+            if (callbackData[i].callback !is null) delete callbackData[i].callback;
+            if (callbackData[i].object !is null) delete allbackData[i].object;
+            memset(&callbackData[i], 0, CALLBACK_DATA.sizeof);
+        }
+    }
+}
+
+bool getEnabled ()
+{
+    return callbackEnabled;
+}
+
+int getEntryCount ()
+{
+    return callbackEntryCount;
+}
+
+void setEnabled (bool enable)
+{
+    callbackEnabled = enable;
+}
+
+void reset ()
+{
+    memset(cast(void*) &callbackData, 0, callbackData.sizeof);
+}