Mercurial > projects > dwt-mac
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); +}